Nginx、FPM配置及优化

文章目录

[隐藏]

  • Nginx配置
    • main模块
    • events 模块
    • http模块
    • sendfile
    • keepalive
    • 超时
    • map
    • proxy
    • openfile
    • client buffer
    • Gzip
    • fastcgi cache
    • server模块
    • 正则
    • Rewrite
    • 文件缓存
    • FPM
    • HTTPS
    • upstream模块
    • 默认轮询(加权)
    • 最小连接数
    • IP Hash
  • FPM配置
    • global全局配置
    • 进程池配置
Nginx配置

nginx的配置主要分为6个区域,main(全局设置),events(工作模式),http(http服务),upstream(负载均衡),server(主机设置),location(url规则)。

main  events {    }  http {      upstream domain {        }      server {          location {            }      }  }  

main模块

user www www;  worker_processes 4;  worker_cpu_affinity 0001 0010 0100 1000;  error_log   /home/git/logs/error_log error;  pid        /usr/local/var/run/nginx/nginx.pid;  worker_rlimit_nofile 65535;  
  • user 用来指定worker进程运行的用户及用户组
  • worker_processes 来指定开启的worker进程数,如果是多核CPU,建议指定和CPU的数量一样的进程数即可,这里的CPU数量指物理核数。
  • worker_cpu_affinity 将不同的woker进程绑定到不同的cpu,这里指绑定到CPU[0-3],降低由于多CPU核切换造成的寄存器等现场重建带来的性能损耗。
  • error_log 用来定义全局错误日志文件。日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少。
  • pid 指定master进程ID存储位置。
  • worker_rlimit_nofile 指定最多打开的文件描述符(fd),查看用户级fd限制(ulimit -n),查看系统级fd限制(cat /proc/sys/fs/file-max),系统fd与系统内存有关。

events 模块

events用来指定nginx的事件模型及连接数上限。

events {      use epoll;      worker_connections  65535;      multi_accept on;  }  
  • use 用来指定具体的事件模型,包括select、poll、epoll、kqueue、/dev/poll、eventport、rtsig,其中select、poll是标准的事件模型,epoll(用于linux平台)和kqueue(用于BSD平台)是高效的事件模型。
  • worker_connections 定义每个nginx进程接收的最大连接数,最大客户端连接数Max_clients = worker_processes * worker_connections / 2,而作为反向代理时,Max_clients = worker_processes * worker_connections / 4。
  • multi_accept 让NGINX在接收到一个新连接通知后调用accept()来接受尽可能多的连接。

http模块

负责http服务器的设置,包括虚拟主机和反向代理。

http{      server_tokens off;      include    mime.types;      default_type  application/octet-stream;      log_format  main '$http_host$clientip$time_local$request_time$request$status$body_bytes_sent$http_referer$http_user_agent';      access_log  /home/git/logs/access_log  main;      add_header DPOOL_HEADER $hostname;      sendfile on;      tcp_nopush on;      tcp_nodelay on;        keepalive_timeout 30;      keepalive_requests 1024;        send_timeout 10;      client_body_timeout 10;      client_header_timeout 10;        map $http_x_forwarded_for $clientip {              default $http_x_forwarded_for;              ""      $remote_addr;      }      proxy_set_header X-Forwarded-For $clientip;        proxy_redirect off;      chunked_transfer_encoding off;      proxy_set_header Host $host;      proxy_ignore_client_abort on;        proxy_connect_timeout 75;      proxy_send_timeout 150;      proxy_read_timeout 150;        proxy_buffer_size 4k;      proxy_buffers 4 32k;      proxy_busy_buffers_size 64k;      proxy_temp_file_write_size 64k;        open_file_cache max=65535 inactive=20s;      open_file_cache_valid 30s;      open_file_cache_min_uses 3;        client_header_buffer_size 4k;      large_client_header_buffers 4 8k;      client_max_body_size 8m;      client_body_buffer_size 1024k;      server_names_hash_bucket_size 256;        gzip on;      gzip_min_length 1k;      gzip_buffers 4 16k;      gzip_comp_level 2;      gzip_proxied     expired no-cache no-store private auth;      gzip_types text/plain text/css text/xml application/x-javascript application/json;      gzip_vary on;        fastcgi_temp_path /dev/shm/nginx_tmp;      fastcgi_cache_path /dev/shm/nginx_cache levels=1:2 keys_zone=card_cache:20m inactive=5m max_size=1024m;      fastcgi_cache_key "$request_method$host$request_uri";      fastcgi_cache_min_uses 1;      fastcgi_cache_methods GET HEAD POST;      fastcgi_cache_bypass $cookie_nocache $arg_nocache;      fastcgi_no_cache $cookie_nocache $arg_nocache;      fastcgi_cache_use_stale error timeout http_500 http_404;  }  
  • server_tokens off用来关闭nginx版本号显示。
  • include 用来设定文件的mime类型,类型在配置文件mime.types中定义。
  • default_type 设定默认类型为二进制,即当文件类型未定义时使用。
  • log_format 用于记录日志参数及格式,此处声明为main,用于access_log的记录。
  • add_header 增加自定义响应header头,header名为自定义,header值为主机名。

sendfile

  • zero-copy机制高效传输
  • 将tcp_nopush和tcp_nodelay两个指令设置为on即数据包积累到一定量时,尽快发送。

keepalive

  • client到nginx的长连接
    • keepalive_timeout 设置keep-alive客户端连接在服务器端保持开启的超时值。
    • keepalive_requests 设置一个keep-alive连接上可以服务的请求的最大数量,当最大请求数量达到时,连接被关闭。默认是100。
  • nginx到后端server的长连接(反向代理)

nginx  http {  upstream BACKEND {  server 192.168.0.1;  keepalive 300;  }  server {  location / {  proxy_http_version 1.1;  proxy_set_header Connection "";  }  }  }  
  • upstream流配置keepalive,指定每个nginx worker到后端的最大连接数。
  • location 配置proxy_http_version 1.1(http1.1才支持keepalive), proxy_set_header Connection “”(清空客户端设置,即忽略client与nginx的连接方式)。

超时

  • send_timeout 指定向客户端传输数据的超时时间。
  • client_body_timeout 设定客户端与服务器建立连接后发送Request Body的超时时间,如果客户端在此期间没有发送任何内容,那么Nginx将返回Http 408错误(Request Time Out)。
  • client_header_timeout 设定客户端与服务器建立连接后发送Request Header的超时时间,如果在此期间没有发送数据,则同client_body_timeout一样返回HTTP408。

map

  • 是变量设置的映射表,映射表由两列组成,匹配模式和对应的值,匹配模式可以使正则。这里将clientip的值是从http_x_forwarded_for通过映射规则获取,从而获取到客户端真实的IP,而不是代理服务器IP(也可以使用nginx realip模块实现)。
  • “” 匹配当http_x_forwarded_for为空字符串时(第一次经过代理服务器)
  • default 在没有匹配到任何规则时执行(非第一次经过代理服务器)

proxy

  • proxy_ignore_client_abort 默认是关闭的,即请求过程中如果客户端端主动关闭请求或者客户端网络断掉,那么Nginx会记录499。
  • proxy_connect_timeout 定义了连接代理服务器的超时时间,一般情况下,这个值不超过75s。
  • proxy_read_timeout 定义了与代理服务器获读超时时间。
  • proxy_send_timeout 定义了与代理服务器写超时间时间。
  • proxy_buffer_size 用来响应头的缓冲区,一般4k就够了。
  • proxy_buffers 设置用来接收响应的缓冲区的数量和大小。
  • proxy_busy_buffers_size 设定高负荷下的缓冲区大小,建议为proxy_buffers中单个缓冲区大小的2倍。
  • proxy_max_temp_file_size和proxy_temp_file_write_size 指定临时文件的一次写入临时文件的大小及响应内容大于proxy_buffers指定的缓冲区时, 写入硬盘的临时文件的大小。

openfile

  • open_file_cache 缓存将最近使用的文件描述符和相关元数据(如修改时间,大小等)存储在缓存中,这里为1,000个元素定义了一个缓存,到期时间为20s。
  • open_file_cache_valid 定义时间段(以秒为单位),之后将重新验证open_file_cache中的元素。
  • open_file_cache_min_uses 将在非活动时间段之后从高速缓存中清除元素。 此指令可用于配置最小访问次数以将元素标记为活动使用。

client buffer

  • client_header_buffer_size和large_client_header_buffers 设置用于读取客户端请求头的缓冲区大小,先根据client_header_buffer_size配置的值分配一个buffer,如果分配的buffer无法容纳 request_line/request_header,那么就会再次根据large_client_header_buffers配置的参数分配large_buffer,如果large_buffer还是无法容纳,那么就会返回414(处理request_line)/400(处理request_header)错误。
  • client_max_body_size 设置nginx允许接收的客户端请求内容的最大值,及客户端请求Header头信息中设置的Content-Lenth大最大值。如果超出该指令设置的最大值,nginx将返回“Request Entity Too Large”的错误信息(HTTP的413错误码)
  • client_body_buffer_size 允许客户端请求的最大单个文件字节数。
  • server_names_hash_max_size 当配置多个server时需要开启。

Gzip

  • gzip on,开启Gzip,gzip可以帮助Nginx减少大量的网络传输工作。
  • gzip_min_length 设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
  • gzip_buffers 设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
  • gzip_comp_level gzip压缩比,1 压缩比最小处理速度最快,9 压缩比最大但耗CPU,超过2时,压缩率提升已经不明显。
  • gzip_types 匹配MIME类型进行压缩,(无论是否指定)”text/html” 类型总是会被压缩的。
  • gzip_vary 是否发送Header头Vary: Accept-Encoding响应头字段,通知接收方响应使用了gzip压缩。
  • gzip_proxied 根据某些请求和应答来决定是否在对代理请求的应答启用压缩。

fastcgi cache

  • fastcgi_temp_path 缓存文件的临时目录。
  • fastcgi_cache_path 用于设置缓存文件的存放路径。
    • levels:指定了该缓存空间有两层hash目录,设置缓存目录层数
    • keys_zone为这个缓存区起名为zone_name,20m指代缓存空间为20MB
    • inactive=5m 代表如果缓存文件5分钟内没有被访问,则删除
    • max_size代表最大缓存size
  • fastcgi_cache_methods 指定缓存的HTTP method。
  • fastcgi_cache_min_uses URL经过多少次访问被缓存。
  • fastcgi_cache_key 缓存的key名。
  • fastcgi_cache_use_stale 针对错误码的缓存。
  • fastcgi_no_cache和fastcgi_cache_bypass,通过set变量值控制指定参数的0/1,来控制缓存的使用,因为并不是所有情况下都需要缓存。

server模块

server {      listen 80;      root /home/git/www/;      server_name xstudio.me yueqian.sinaapp.com;        access_log /home/git/logs/access_log main;      error_log /home/git/logs/error_log error;        if ($uri !~ "^/(?:crossdomain.xml|favicon.ico|static/.*|robots.txt)$") {          rewrite  ".*" /index.php last;      }        location ~* ^.+.(jpg|jpeg|gif|png|bmp|css|js)$ {          access_log off;          expires 1d;          break;      }        location ~ .php$ {          set $script_uri "";          if ( $request_uri ~* "([^?]*)?" ) {                  set $script_uri $1;          }          fastcgi_param SCRIPT_URL $script_uri;          fastcgi_pass 127.0.0.1:9001;          include fastcgi_params;      }  }  
  • listen 监听的服务端口 后边加default_server指定默认虚拟主机。
  • server_name 用来指定IP地址或者域名。
  • root 表示在这整个server虚拟主机内,全部的root web根目录,区别于location下root。

正则

  • ~ 为区分大小写的匹配。
  • ~* 不区分大小写的匹配(匹配firefox的正则同时匹配FireFox)。
  • !~ 不匹配的。
  • ^~ 标识符后面跟一个字符串,将在这个字符串匹配后停止进行正则表达式的匹配。
  • = 表示精确的查找地址。

Rewrite

  • last :相当于Apache里德(L)标记,表示完成rewrite。
  • break;本条规则匹配完成后,终止匹配,不再匹配后面的规则。
  • redirect:返回302临时重定向。
  • permanent:返回301永久重定向。

文件缓存

  • expires 控制 HTTP 应答中的“ Expires ”和“ Cache-Control ”的头标
    • time:可以使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定time值来设定。
    • time值还控制”Cache-Control”的值:
    • 负数表示no-cache
    • 正数或零表示max-age=time

FPM

  • fastcgi_param 设置fastcgi接收的参数,最终传递给PHP,SCRIPT_URL为url path。
  • fastcgi_pass fastcgi的转发地址。

HTTPS

http {      ssl_session_cache   shared:SSL:10m;      ssl_session_timeout 10m;      server {          listen              443 ssl;          server_name         www.example.com;          keepalive_timeout   30;            ssl_certificate     www.example.com.crt;          ssl_certificate_key www.example.com.key;            add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;            ssl_prefer_server_ciphers on;          ssl_dhparam /etc/ssl/certs/dhparam.pem;          ssl_protocols TLSv1 TLSv1.1 TLSv1.2;          ssl_ciphers "EECDH+ECDSA+AESGCM EECDH+aRSA+AESGCM EECDH+ECDSA+SHA384 EECDH+ECDSA+SHA256 EECDH+aRSA+SHA384 EECDH+aRSA+SHA256 EECDH+aRSA+RC4 EECDH EDH+aRSA !aNULL !eNULL !LOW !3DES !MD5 !EXP !PSK !SRP !DSS !RC4";            add_header X-Frame-Options DENY;          add_header X-Content-Type-Options nosniff;          add_header X-Xss-Protection 1;          #...  
  • ssl_session_timeout : 客户端可以重用会话缓存中ssl参数的过期时间
  • ssl_session_cache 设置ssl/tls会话缓存的类型和大小,nginx工作进程共享ssl会话缓存。
  • ssl_certificate证书其实是个公钥,它会被发送到连接服务器的每个客户端,ssl_certificate_key私钥是用来解密的,所以它的权限要得到保护但nginx的主进程能够读取。
  • add_header Strict-Transport-Security,使用 HSTS 策略强制浏览器使用 HTTPS 连接
    • max-age:设置单位时间内強制使用 HTTPS 连接
    • includeSubDomains:可选,所有子域同时生效
    • preload:可选,非规范值,用于定义使用『HSTS 预加载列表』
    • always:可选,保证所有响应都发送此响应头,包括各种內置错误响应
  • HTTP/HTTPS混合配置
  • nginx
    server {
    listen 80;
    listen 443 ssl;
    server_name www.example.com;
    ssl_certificate www.example.com.crt;
    ssl_certificate_key www.example.com.key;
    #…
    }

upstream模块

在多个应用实例间做负载均衡是一个被广泛使用的技术,用于优化资源效率,最大化吞吐量,减少延迟和容错。nginx可以作为一个非常高效的HTTP(7层)负载均衡器来分发请求到多个应用服务器,并提高web应用的性能,可扩展性和可靠性。
nginx支持以下负载均衡机制(或者方法):
– round-robin/轮询: 到应用服务器的请求以round-robin/轮询的方式被分发
– least-connected/最少连接:下一个请求将被分派到活动连接数量最少的服务器
– ip-hash/IP散列: 使用hash算法来决定下一个请求要选择哪个服务器(基于客户端IP地址)

默认轮询(加权)

http {      upstream myapp1 {          server srv1.example.com weight=3;          server srv2.example.com;          server srv3.example.com;      }        server {          listen 80;          location / {              proxy_pass http://myapp1;          }      }  }  

在这个配置中,每5个新请求将会如下的在应用实例中分派: 3个请求分派去srv1,一个去srv2,另外一个去srv3.

最小连接数

当某些请求需要更长时间来完成时,最少连接可以更公平的控制应用实例上的负载。

upstream myapp1 {      least_conn;      server srv1.example.com  weight=3;      server srv2.example.com;      server srv3.example.com;  }  

IP Hash

请注意,在轮询和最少连接负载均衡方法中,每个客户端的后续请求被分派到不同的服务器。对于同一个客户端没有任何方式保证发送给同一个服务器。如果需要将一个客户端绑定给某个特定的应用服务器,那么可以使用ip-hash负载均衡机制。

upstream myapp1 {      ip_hash;      server srv1.example.com;      server srv2.example.com;      server srv3.example.com;  }  
FPM配置

global全局配置

[global]  pid = /home/git/php/var/run/php-fpm.pid  error_log = /home/git/logs/php-fpm.log  log_level = notice  rlimit_files = 65535  events.mechanism = epoll  daemonize = yes  process_control_timeout = 10  include=/home/git/php/etc/php-fpm.d/*.conf  
  • pid主进程pid文件
  • error_log 错误日志文件
  • log_level 错误级别. 可用级别为: alert(必须立即处理), error(错误情况), warning(警告情况), notice(一般重要信息), debug(调试信息). 默认: notice.
  • daemonize 后台执行FPM
  • rlimit_files 设置文件打开描述符的rlimit限制。
  • events.mechanism 使用处理event事件的机制,可用以下选项:select、pool、epoll、kqueue (*BSD)、port (Solaris)。 默认值:不设置(自动检测)。
  • process_control_timeout 设置子进程接受主进程复用信号的超时时间,默认为0时,FPM无法真正实现平滑重启。具体看上一篇文章《详解nginx及FPM平滑重启》。
  • include 用于包含一个或多个配置文件

进程池配置

通过监听不同的端口可以定义多个不同的子进程池,进程池被用与记录和统计,对于fpm能够处理进程池数目的多少并没有限制,其中$pool变量可以在任何指令中使用,他将会替代相应的进程池名字。

[www]  user=git  group=git  listen = 127.0.0.1:9001  listen.allowed_clients = 127.0.0.1    pm = dynamic  pm.max_children = 100  pm.start_servers = 60  pm.min_spare_servers = 30  pm.max_spare_servers = 100  pm.max_requests = 500    slowlog = /home/git/logs/slow_log  request_slowlog_timeout = 10  catch_workers_output = yes    php_admin_value[open_basedir] = "./:/home/git/$pool/:/tmp/xhprof/"    env[SRV_SERVER_ROOT]   = /home/git/$pool/  env[SRV_DEVELOP_LEVEL] = 4  
  • user和group指定worker运行的用户及组
  • listen指定监听的IP和端口
  • listen.allowwd_clients 设置允许连接到 FastCGI 的服务器 IPV4 地址,多个地址用’,’分隔,为空则允许任何地址发来链接请求。
  • pm 设置进程管理器如何管理子进程。可用值:static,ondemand,dynamic。必须设置。
    • static – 子进程的数量是固定的(pm.max_children)。
    • ondemand – 进程在有需求时才产生(当请求时才启动。与 dynamic 相反,在服务启动时 pm.start_servers 就启动了。
    • dynamic – 子进程的数量在下面配置的基础上动态设置。
  • pm.max_children pm 设置为 static 时表示创建的子进程的数量,pm 设置为 dynamic 时表示最大可创建的子进程的数量。
  • pm.start_servers 设置启动时创建的子进程数目。
  • pm.min_spare_servers 设置空闲服务进程的最低数目。
  • pm.max_spare_servers 设置空闲服务进程的最大数目。
  • pm.max_requests 最大处理请求数是指一个php-fpm的worker进程在处理多少个请求后就终止掉,master进程会重新派生一个新的。这个配置的主要目的是避免php解释器或程序引用的第三方库造成的内存泄露。
  • request_slowlog_timeout 当一个请求超过该设置的时间后,就会将对应的PHP调用堆栈信息完整写入到慢日志中。
  • slowlog 慢日志文件。
  • catch_workers_output 重定向运行过程中的stdout和stderr到主要的错误日志文件中. 如果没有设置, stdout 和 stderr 将会根据FastCGI的规则被重定向到 /dev/null。
  • php_admin_value 设定PHP配置值,且不会被php ini_set覆盖掉,open_basedir 定义php有权限读写的目录,$pool的值为进程池名字(www)。
  • env 设定环境变量,例如:根目录、开发/测试环境区分等,PHP可以通过$_SERVER读取。

原文出处:sinaapp -> http://yueqian.sinaapp.com/a/130.html

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » Nginx、FPM配置及优化