- 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 http://www.example.com;
ssl_certificate http://www.example.com.crt;
ssl_certificate_key http://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读取。