欢迎光临众联科技,开始互联网之旅! 请〖登录〗 〖注册〗
Nginx、FPM配置及优化
发布时间:2018/8/7 14:55:34   发布来源:众联科技

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读取。


(责任编辑:众联科技)
微信公众号
微信公众号 关注有礼
  • 服务支持
  •