Nginx&php-fpm配置

Posted Wss0130

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx&php-fpm配置相关的知识,希望对你有一定的参考价值。

nginx配置

Nginx配置文件主要分成四部分:main(全局设置)、server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)和 location(URL匹配特定位置后的设置),每部分包含若干个指令。

  • main部分设置的指令将影响其它所有部分的设置;
  • server部分的指令主要用于指定虚拟主机域名、IP和端口;
  • upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;
  • location部分用于匹配网页位置(比如,根目录“/”,“/images”,等等)。

它们之间的关系式:server继承main,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。

user  www www; # 设置nginx工作进程的用户。安装完成后,可以随时在nginx.conf配置文件更改user指令。默认为nobody nobody。--group=name类似
worker_processes auto; # 允许生成的进程数,默认为1
worker_rlimit_nofile 65535; # 默认是没有设置,可以限制为操作系统最大的限制65535

error_log  /data0/www/logs/error.log; # 制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
pid        var/run/tengine.pid; # 指定nginx进程运行文件存放地址


events 
    worker_connections  65535; # 最大连接数,默认为512
    accept_mutex on; # 设置网路连接序列化,防止惊群现象发生,默认为on
    use	epoll; # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport


http 
    charset      utf-8; # 编码格式
    client_header_buffer_size 8k;
    client_max_body_size 50m; # 允许客户端请求的最大单文件字节数。如果有上传较大文件,请设置它的限制值
    client_body_timeout 10s;
    client_header_timeout 5s; # 默认值 60s,上下文 http server,指定等待client发送一个请求头的超时时间(例如:GET / HTTP/1.1).仅当在一次read中,没有收到请求头,才会算成超时。如果在超时时间内,client没发送任何东西,nginx返回HTTP状态码408(“Request timed out”)
    large_client_header_buffers 8 4k;

    server_tokens off; # 是否隐藏版本号,off为隐藏
    server_name_in_redirect off; # 重定向的URL以URI或者完整形式给出。off为URI形式
    server_names_hash_bucket_size 128; #  保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。

    include       tengine.mime.types; # 文件扩展名与文件类型映射表
    default_type  application/octet-stream; # 默认文件类型,默认为text/plain

    log_format  main  '$http_x_real_ip - $http_host [$time_local] "$request" $request_length '
                      '$status $body_bytes_sent $request_time "$http_referer" '
                      '"$http_user_agent" $remote_addr "-" "-" ';  # combined为日志格式的默认值

    sendfile        on; # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。

    keepalive_timeout  65; # 连接超时时间,默认为75s,可以在http,server,location块

    open_file_cache max=65535 inactive=20s; # 启用此指令将存储以下信息的缓存:打开的文件描述符和相关元数据,如大小,修改时间等;文件和目录的存在与查找相关的任何错误,例如“权限被拒绝”,“文件未找到”等;缓存定义固定大小,并且在溢出期间,它移除最近最少使用(LRU)元素;缓存在一段时间不活动之后逐出元素。 默认情况下禁用该指令。
    open_file_cache_valid 30s; # NGINX的open_file_cache保存信息的快照。 由于信息在源处更改,快照可能在一段时间后无效。 open_file_ cache_valid指令定义时间段(以秒为单位),之后将重新验证open_file_cache中的元素。默认情况下,60秒后重新检查元素。
    open_file_cache_min_uses 3; # NGINX将在非活动时间段之后从高速缓存中清除元素。 此指令可用于配置最小访问次数以将元素标记为活动使用。 默认情况下,最小访问次数设置为1次或更多次。

    fastcgi_connect_timeout 300; #  nginx连接fastcgi的超时时间
    fastcgi_send_timeout 300; # fastcgi进程向nginx进程发送response的整个过程的超时时间
    fastcgi_read_timeout 300; # nginx进程向fastcgi进程发送request的整个过程的超时时间
    fastcgi_buffer_size 4k; # 读取FastCGI应答第一部分需要用多大的缓冲区,这个值表示将使用1个64KB的缓冲区读取应答的第一部分(应答头),可以设置为fastcgi_buffers选项指定的缓冲区大小。
    fastcgi_buffers 256 4k; # 指定本地需要用多少和多大的缓冲区来缓冲FastCGI的应答请求。如果一个php脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的路径中,但是这并不是好方法,因为内存中的数据处理速度要快于硬盘。一般这个值应该为站点中PHP脚本所产生的页面大小的中间值,如果站点大部分脚本所产生的页面大小为256KB,那么可以把这个值设置为“16 16k”、“4 64k”等。
    fastcgi_busy_buffers_size 8k; # 默认值是fastcgi_buffers的两倍。
    fastcgi_max_temp_file_size 0; # 通常这个值的设置应该选择一个你的站点中的php脚本所产生的页面大小的中间值。如果您服务器上的内存够大,可以将以上参数适当调大。当然以上参数并不是越大越好,也没多大实际意义,需要根据您的实际情况,如页面大小及服务器内存大小,如果以上参数太小的话,就会频繁的往磁盘写数据,对性能影响还是很大的,毕竟内存的速度比硬盘大的多,可以增大以上参数来增加缓冲区的大小。

    gzip on; # 开启gzip压缩
    gzip_min_length  1k; # 开始压缩的最小长度
    gzip_buffers     8 64k; # 设置用于处理请求压缩的缓冲区数量和大小。比如32 4K表示按照内存页(one memory page)大小以4K为单位(即一个系统中内存页为4K),申请32倍的内存空间。建议此项不设置,使用默认值。
    gzip_http_version 1.0; # 用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。
    gzip_comp_level 5; # #推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)
    gzip_types   text/plain application/x-javascript text/css application/json application/xml  application/x-shockwave-flash application/javascript image/svg+xml image/x-icon; # 设置需要压缩的MIME类型,如果不在设置类型范围内的请求不进行压缩
    gzip_vary on; # 是否传输gzip压缩标志
    add_header via $hostname always; #  headers 模块中定义的一个指令,顾名思义就是用来添加 http 响应头的。但请注意他只是「添加」而已,并不是重写。所以如果已经存在某个头,再使用 add_header 就会出问题。而且在低版本的 nginx 中 add_header 还不支持在错误页面中使用。

    lua_package_cpath "/usr/local/matrix/etc/?.so;;"; # 指向lua.conf,在nginx.conf的http内配置,路径根据自己情况定义
    lua_shared_dict hcstatus 10m; # 调用add_ups url向全局缓存lua_shared_dict hcstatus 10m填写数据。

    include	virtualhost/*.conf; # 用于包含一个或多个文件

server  # 包含在http内部,每一个server都是一个虚拟主机(站点)
    listen 80; # 监听端口为80,可以自定义其他端口,也可以加上IP地址,如,listen 127.0.0.1:8080;
    server_name xxx.os.ke.com; # 定义网站域名,可以写多个,用空格分隔
    root /data0/www/htdocs/xxx.os.ke.com/public; # 定义网站根目录,目录可以是相对路径也可以是绝对路径。
    access_log /data0/www/logs/xxx.os.ke.com-access_log main; # 定义访问日志,可以针对每一个server(即每一个站点)设置它们自己的访问日志。
    error_log  /data0/www/logs/xxx.os.ke.com-error_log; # 定义nginx错误日志。

    if ( $uri ~* "^/healthcheck" ) break;  # 健康检查请求

    location /index.php  # 定义访问index.php时,将会执行本location部分指令
        include tengine.fastcgi_params; # 引用prefix/conf/fastcgi_params文件,该文件定义了fastcgi相关的变量
        fastcgi_param  SCRIPT_FILENAME "$document_root/index.php"; # 定义SCRIPT_FILENAME变量,后面的路径/scripts为上面的root指定的目录
        fastcgi_pass 127.0.0.1:8094; # 定义FastCGI服务器监听端口与地址,支持两种形式,1 IP:Port, 2 unix:/path/to/sockt
    

    location ~ /robots\\.(txt|php)  # 定义访问robots或robots.php或robots.txt时,将会执行本location部分指令
        include tengine.fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME "$document_root/robots.php";
        fastcgi_pass 127.0.0.1:8094;
    

    location ~* ^/healthcheck  # 定义访问healthcheck健康检查接口时,将会执行本location部分指令
        access_log /data0/www/logs/healthcheck-access_log main; # 定义访问日志
        content_by_lua_file /usr/local/matrix/etc/healthcheck.lua; # 指定lua脚本路径
    

    location ~* "^/system/(.*)"  # 定义访问system相关接口时,将会执行本location部分指令
        satisfy  all; #   对于多个 Nginx 模块注册在 access 阶段的处理程序,satisfy 配置指令可以用于控制它们彼此之间的协作方式。比如模块 A 和 B 都在 access 阶段注册了与访问控制相关的处理程序,那就有两种协作方式,一是模块 A 和模块 B 都得通过验证才算通过,二是模块 A 和模块 B 只要其中任一个通过验证就算通过。第一种协作方式称为 all 方式(或者说“与关系”),第二种方式则被称为 any 方式(或者说“或关系”)。默认情况下,Nginx 使用的是 all 方式。
        include /usr/local/matrix/etc/control/access_control.conf; # 包含access阶段的处理程序路径
    

    location @php 
        include tengine.fastcgi_params;
        fastcgi_param  SCRIPT_FILENAME "$document_root/index.php";
        fastcgi_pass 127.0.0.1:8094;
    

    location /  # 访问$uri的php文件
        try_files $uri @php;
    

php-fpm配置

[global]
pid = run/php-fpm.pid # 设置pid文件的位置,默认目录路径 /usr/local/php/var
error_log = log/php-fpm.log # 记录错误日志的文件,默认目录路径 /usr/local/php/var
process_control_timeout = 0 # 子进程等待master进程对信号的回应(默认单位:s秒),可选s秒,m分,h时,d天
process.max = 2048 # 控制最大进程数,使用时需谨慎
daemonize = yes # 将fpm转至后台运行,如果设置为"no",那么fpm会运行在前台
rlimit_files = 65535 # 设置打开文件描述符的限制
rlimit_core = 67108864 # 设置主进程rlimit最大核数
events.mechanism = epoll # 使用处理event事件的机制
emergency_restart_threshold = 10 # 如果子进程在这个时间段内带有IGSEGV或SIGBUS退出,则重启fpm,默认0表示关闭这个功能
emergency_restart_interval = 5 # 设置时间间隔来决定服务的初始化时间(默认单位:s秒),可选s秒,m分,h时,d天

; auto include phpfpm configure
include = etc/fpm.d/*.conf # 用于包含一个或多个文件,如果glob(3)存在(glob()函数返回匹配指定模式的文件名或目录)
[xxx.os.ke.com]
user = www # 进程的发起用户和用户组,用户user是必须设置,group不是
group = www # 进程的发起用户和用户组,用户user是必须设置,group不是
listen = 127.0.0.1:9090 # 监听ip和端口
listen.allowed_clients = 127.0.0.1 # 允许FastCGI客户端连接的IPv4地址,多个地址用','分隔,为空则允许任何地址发来链接请求
pm = dynamic #  选择进程池管理器如何控制子进程的数量(dynamic、static、ondemand)
pm.max_children = 512 # dynamic:同一时刻能够存活的最大子进程的数量
pm.start_servers = 16 # dynamic:在启动时启动的子进程数量
pm.min_spare_servers = 16 # dynamic:处于空闲"idle"状态的最小子进程,如果空闲进程数量小于这个值,那么相应的子进程会被创建
pm.max_spare_servers = 32 # dynamic:最大空闲子进程数量,空闲子进程数量超过这个值,那么相应的子进程会被杀掉
pm.max_requests = 1500 # dynamic:在派生新的子进程前,每一个子进程应该处理的请求数目,在第三方库中解决内存溢出很有用,设置为0则不会限制
pm.status_path = /matrix_monitor_page # dynamic:配置一个URI,以便查看fpm状态页
slowlog = /data0/www/logs/$pool-slow_log # 用于记录慢请求
request_slowlog_timeout = 3 # 慢日志请求超时时间,对一个php程序进行跟踪。
request_terminate_timeout = 20 # 终止请求超时时间,在worker进程被杀掉之后,提供单个请求的超时间隔。由于某种原因不停止脚本执行时,应该使用该选项,0表示关闭不启用 (在php.ini中,max_execution_time 一般设置为30,表示每一个脚本的最大执行时间)
catch_workers_output = no # 将worker的标准输出和错误输出重定向到主要的错误日志记录中,如果没有设置,根据FastCGI的指定,将会被重定向到/dev/null上
security.limit_extensions = "" # 限制FPM执行解析的扩展名,如: .php .php3 .php4 .php5

; BASE CONFIG
env[IDC]=jx
env[IPADDR]=xxx
env[HOSTNAME]=xxx
env[MATRIX_CACHE_DIR] = "/data0/www/cache/xxx.os.ke.com/"
env[MATRIX_PRIVDATA_DIR] = "/data0/www/privdata/xxx.os.ke.com/"
env[MATRIX_APPLOGS_DIR] = "/data0/www/applogs/xxx.os.ke.com/"

总结

  1. 在php-fpm的配置文件中,有两个指令非常重要,就是"pm.max_children" 和 “request_terminate_timeout”
    · “pm.max_children” 确定了php-fpm的处理能力,原则上时越多越好,但这个是在内存足够打的前提下,每开启一个php-fpm进程要占用近30M左右的内存
    · 如果请求访问较多,那么可能会出现502,504错误。对于502错误来说,属于繁忙进程而造成的,对于504来说,就是客户发送的请求在限定的时间内没有得到相应,过多的请求导致“504 Gateway Time-out”。这里也有可能是服务器带宽问题。
  2. 另外一个需要注意的指令"request_terminate_timeout",它决定php-fpm进程的连接/发送和读取的时间,如果设置过小很容易出现"502 Bad Gateway" 和 “504 Gateway Time-out”,默认为0,就是说没有启用,不加限制,但是这种设置前提是你的php-fpm足够健康,这个需要根据实际情况加以限定。

以上是关于Nginx&php-fpm配置的主要内容,如果未能解决你的问题,请参考以下文章

Web服务器群集——Nginx动态网站架构(笔记)

fastCGI与PHP-fpm

nginx php-fpm记录php错误日志怎么配置

Docker 生产就绪 php-fpm 和 nginx 配置

PHP返回页面空白原因分析-Nginx+PHP

配置Nginx和php-fpm用Sock套接字连接时,找不到php-fpm.sock的原因