1.9 NGINX-HTTP配置优化-反代FastCGI(NGINX+PHP)

1.9 HTTP配置优化-反代FastCGI(NGINX+PHP)

NGINX作为WEB服务器本身只有解析静态页面的能力,对于解析动态页面的能力需要借助外部程序(PHP、Tomcat等)才可以实现。

PHP是一个专门为运行由PHP语言编写而成的脚本所使用的PHP解析平台。

NGINX支持通过FastCGI的反向代理工作方式将请求通过FastCGI接口(客户端)转发给FastCGI服务端去处理,而PHP提供了一个FastCGI连接管理扩展程序(PHP-FPM),即FastCGI服务端,所以我们可以将NGINX与PHP集成到一起工作,由NGINX做WEB静态页面处理工作,而对于动态PHP的请求则转发给PHP工作,实现动静分离。

1.9.1 RPM安装方式

系统版本:CentOS Linux release 7.3.1611

1、配置YUM源

[root@localhost ~]# rpm -i https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
[root@localhost ~]# rpm -i http://rpms.famillecollet.com/enterprise/remi-release-7.rpm
[root@localhost ~]# yum clean all
[root@localhost ~]# yum makecache

2、安装NGINX和PHP及相关扩展

[root@localhost ~]# yum -y install nginx php72 php72-php-fpm php72-php-mysqlnd php72-php-pecl-mysql

3、配置PHP

[root@localhost ~]# vim /etc/opt/remi/php72/php.ini
...
max_execution_time = 30
#每个PHP脚本的最大执行时间,单位为秒。
max_input_time = 60
#最大输入时间,PHP接受请求的超时时间,单位为秒。
memory_limit = 128M
#一个脚本可使用的最大内存大小。
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT
display_errors = Off
display_startup_errors = Off
log_errors = On
log_errors_max_len = 1024
ignore_repeated_errors = Off
ignore_repeated_source = Off
report_memleaks = On
html_errors = On
variables_order = "GPCS"
request_order = "GP"
register_argc_argv = Off
auto_globals_jit = On
post_max_size = 8M
#PHP接受的POST数据最大大小。
auto_prepend_file =
auto_append_file =
default_mimetype = "text/html"
default_charset = "UTF-8"
doc_root =
user_dir =
enable_dl = Off
file_uploads = On
upload_max_filesize = 2M
#PHP允许用户上传的最大文件大小。
max_file_uploads = 20
#PHP允许同时上传的文件最大数量。
allow_url_fopen = On
allow_url_include = Off
default_socket_timeout = 60

4、配置PHP-FPM

[root@localhost ~]# vim /etc/opt/remi/php72/php-fpm.d/www.conf
[www]
user = nginx
#设置运行PHP-FPM所使用的运行用户。
group = nginx
#设置运行PHP-FPM所使用的运行用户组。
listen = 127.0.0.1:9000
#设置监听地址和端口。
listen.allowed_clients = 127.0.0.1
#设置允许连接的FastCGI客户端地址。
pm = dynamic
#设置PHP-FPM进程工作模式:
# dynamic    动态模式,当请求量变大时,动态增加进程数的到最大上限,空闲时自动释放到指定下线。
# static     静态模式,直接开启指定数量的进程量,不会增加或减少。
# ondemand   按需求模式,当有请求时才会创建进程工作,当空闲时则会释放进程。
pm.max_children = 50
#设置PHP-FPM最大进程数量,动态模式下为最大进程数上线,静态模式下直接开启对应的最大进程数量。
pm.start_servers = 5
#设置动态模式下,PHP-FPM启动时开启的进程数量。
pm.min_spare_servers = 5
#设置动态模式下,允许开启的PHP-FPM最小空闲进程数量。
pm.max_spare_servers = 10
#设置动态模式下,允许开启的PHP-FPM最大空闲进程数量。
slowlog = /var/opt/remi/php72/log/php-fpm/www-slow.log
php_flag[display_errors] = on
php_admin_value[error_log] = /var/opt/remi/php72/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path]    = /var/opt/remi/php72/lib/php/session
php_value[soap.wsdl_cache_dir]  = /var/opt/remi/php72/lib/php/wsdlcache

###5、创建NGINX+反代FastCGI优化配置文件
创建对应项目的NGINX反代FastCGI优化配置文件。
[root@localhost ~]# vim /etc/nginx/conf.d/test_fastcgi_optimization.conf
###########################
#==FastCGI代理相关调优配置==#
###########################
#FasctCGI相关调优配置适用于NGINX+PHP环境下。

fastcgi_connect_timeout 75s;
#设置NGINX与后端F服务器建立连接的超时时间,单位为秒。一般情况下该时间不会超过75s。
fastcgi_send_timeout 75s;
#设置NGINX将请求转发传输到后端FastCGI服务器建立连接的超的超时时间,单位为秒。
fastcgi_read_timeout 75s;
#设置NGINX从后端FastCGI服务器读取响应的超时时间,单位为秒。

fastcgi_keep_conn on;
#启用NGINX与后端FastCGI服务器保持长连接功能,保持长的会话连接,当请求来时无需再经过TCP的三次握
#手,可以提高NGINX与后端FastCGI服务器的通信效率。

#################
#==请求响应缓冲==#
#################
#缓冲区的概念:缓冲区是用户在写(发送)数据时利用内存所使用的一种流量整形技术,可以减少响应传输次
#数,提高传输效率。NGINX在内存中申请一块空间作为缓冲区,用于缓冲来自后端服务器的响应结果,当接受到
#完整的响应后,一次性的传送给客户端,避免多次传送。后端服务器(用户)往请求客户端发送(写)响应数
#据,经过NGINX代理服务器的缓冲区进行了流量整形,提高其传输效率。
fastcgi_request_buffering on;
#启用缓冲来自客户端请求正文的缓冲。启用缓冲后,在将请求发送到FastCGI服务器之前,NGINX会将整个客
#户端完整的请求先存储到缓冲区中,当接受完成后一次性将请求转发到后端的FastCGI服务器去处理,可以提
#高请求转发效率。
fastcgi_buffering on;
#启用缓冲来自FastCGI服务器的响应。启用缓冲后,NGINX会尽快从FastCGI服务器接受响应,并将其保存
#到"fastcgi_buffer_size"和"fastcgi_buffers"指令设置的缓冲区中,如果响应太大超出两个指令设置
#的值则会将响应数据写到磁盘的临时文件中,写入临时文件
#由"fastcgi_max_temp_file_size"和"fastcgi_temp_file_write_size"指令控制,这并不是我们所期
#望看到的。
fastcgi_buffer_size 4k;
#设置NGINX用于存储来自后端FastCGI服务器传过来的响应头所使用的缓冲区大小,默认情况下,缓冲区大小
#等于一个内存页面,4K或者8K,一般情况下响应头部信息不会超过1KB,所以我们可以将此值设置的更小,不
#过这取决于平台。建议保持默认就好了。
fastcgi_buffers 8 4k;
#设置NGINX用于存储来自后端FastCGI服务器传过来的响应主体所使用的缓冲区大小和数量。设置此值取决后
#端FastCGI服务器WEB应用所产生的响应数据大小。
fastcgi_busy_buffers_size 8k;
#设置在高负载的环境下,NGINX没有完全等待将后端完整的响应存储
#到"fastcgi_buffers"和"fastcgi_buffer_size"指令设置的缓冲区中时,NGINX就开始向客户端发送响
#应数据了,这个时候线程读取的则是由此项设置的缓冲区中存储的响应数据。此项主要用于高负载环境下,在
#响应没有完全存储在指定的缓冲区中时,面对突发情况则会将一部分响应数据存入到此项设置的缓冲区中,由
#线程去读取,而指定的缓冲区则继续从后端接受响应数据。建议设置值是"fastcgi_buffers"指令单个缓冲区
#大小的2倍。
fastcgi_max_temp_file_size 1024m;
#设置NGINX用于存储后端FastCGI服务器传过来的响应数据所允许使用的临时文件最大大小,当响应数据超
#过"fastcti_buffers"指令设置的缓冲区大小总大小时,才会将响应数据写入到磁盘的临时文件中,这并不是
#我们期望所看到的。默认值为1024m。
fastcgi_temp_file_write_size 8k;
#设置用于限制一次写入临时文件的数据大小,此值建议与"fastcgi_busy_buffers_size"的值相同。
fastcgi_temp_path /var/lib/nginx/tmp/fastcgi_response 1 2;
#设置临时文件存放在磁盘目录路径,"1"表示一级目录用随机的1个字符命名,"2"表示二级目录用随机的2个字
#符命名。

#################
#==响应内容缓存==#
#################
#注:对于后端的PHP为动态数据,不建议使用响应缓存,避免缓存导致的客户端数据与真实后端的数据不一致问题。
#缓存说明:缓存是将后端的响应数据缓存到NGINX,请求直接匹配缓存返回结果,而无需再进行请求转发操作,
#可以提高WEB应用的效率,并降低后端主机的负载。
#缓存适用于不经常发生变化的静态数据,比如图片数据等等,对于交互式的动态数据,经常发生变化的数据,
#为了避免发生数据紊乱,保证数据一致性,建议不要使用。
#fastcgi_cache one;
#开启FastCGI缓存,NGINX会将后端WEB服务器的响应内容缓存到本地磁盘,以提高数据处理效率。"one"表示调
#用"http{}"块中定义的反代FastCGI响应内容高速缓存器。
#fastcgi_cache_valid 200 302 10m;
#设置对应响应码内容缓存有效时间。10分钟。
#fastcgi_cache_valid 301 1d;
#设置对应响应码内容缓存有效时间。1天。
#fastcgi_cache_valid any 1m;
#设置对应响应码内容缓存有效时间。1分钟。

6、配置NGINX

[root@localhost ~]# vim /etc/nginx/nginx.conf
....
#############
#==核心配置==#
#############
http {
....省略,其他配置请参考《HTTP基础配置优化》文档。
################################
#==反代FastCGI响应内容高速缓存器==#
################################
fastcgi_cache_path /tmp/nginx/cache levels=1:2 keys_zone=one:10m max_size=200m inactive=60;
#设置一个响应内容高速缓存器,用于将后端FastCGI服务器的响应数据缓存到本地,以提高传输效率。
# level=1:2          设置缓存目录级别,"1"表示一级目录用一个字符命名,"2"表示二级目录用二个字
#                    符命名。
# key_zones=one:10m  设置存储元数据空间的名字和大小,"one"表示缓存空间名可修改,"10m"表示这个
#                    缓存空间的初始大小。
# max_size=200m      设置缓存占用磁盘空间的最大大小,单位为MB,若不设置则缓存有可能占用整个磁盘
#                    空间。
# inactive=60        设置未被访问的缓存文件在缓存空间的保留时间,单位为分钟,当超出此时间缓存会
#                    被自动删除。

################
#==WEB站点配置==#
################
server {
        server_name  www.test.com;
        listen 80;
        access_log  /var/log/nginx/test.access.log main;

location / {
        root /usr/share/nginx/html;
index index.html;
            try_files $uri $uri/ /index.php?s=$uri&$args;
#用户访问时,先找一个目录,如果目录下有WEB页面则呈现,若没有则继续找下一个目录,若下
#个目录也有没则会重定向URI到PHP能识别的URI路径,则会被下面的Location定义的URI匹配
#到,呈现动态页面,实现动静结合。
}

        location ~ ^.*\.(php|php5)?$ {
                fastcgi_pass 127.0.0.1:9000;
                #设置要代理的后端FastCGI主机。
                fastcgi_index index.php;
                #设置告诉FastCGI服务器,PHP应用默认的入口文件名。
                fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html$fastcgi_script_name;
                #设置告诉FastCGI服务器,PHP应用存放目录路径,相当于上面"root"指令定义的根目录。
                include fastcgi.conf;
                #设置包含的其他配置文件,fastcgi.conf配置文件中定义了一些要告诉传递给FastCGI服务
                #器的默认选项参数,一般情况下我们无需修改其中的内容保持默认就好。
include /etc/nginx/conf.d/test_fastcgi_optimization.conf;
#设置包含的其他配置文件,调用上面定义的优化配置文件。
        }

        error_page 404 /404.html;
        location = /40x.html {
        }

        error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root html;
        }
}

7、创建测试页

我们创建一个测试静态页面(index.html),创建一个测试动态页面(index.php)

[root@localhost ~]# vim /usr/share/nginx/html/index.html
hello world!
[root@localhost ~]# vim /usr/share/nginx/html/index.php
<?php
phpinfo();
?>

8、运行NGINX和PHP-FPM服务

[root@localhost ~]# systemctl start php72-php-fpm
[root@localhost ~]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
[root@localhost ~]# nginx
[root@localhost ~]# netstat -lnupt |grep nginx
tcp        0      0 0.0.0.0:80      0.0.0.0:*     LISTEN      1629/nginx: master  
[root@localhost ~]# netstat -lnupt |grep php-fpm
tcp        0      0 127.0.0.1:9000  0.0.0.0:*     LISTEN      1659/php-fpm: maste 

9、访问测试

输入默认的地址(较短的URL)则呈现会呈现静态的WEB首页!输入带后缀的地址(较长的URL)则会呈现动态的PHP信息页面!

猜你喜欢

转载自www.cnblogs.com/network-ren/p/9585448.html
1.9