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