nginx配置fastcgi
nginx没有处理PHP的模块,只能转发请求到fastcgi服务器,需要加载ngx_http_fastcgi_module模块。
配置说明:
fastcgi_pass address;
address为后端的fastcgi server的地址
可写在:location, if in location
fastcgi_index name;
fastcgi默认的主页资源
例如:fastcgi_index index.php;
fastcgi_param parameter value [if_not_empty];
设置传递给 FastCGI 服务器的参数值,可以是文本,变量或组合
示例:
假设已经配好fpm服务器,配置路径可以使用相对路径或者绝对路径
相对路径:
location ~* \.php$ {
root /data/php; #$document_root 调用root目录
fastcgi_pass 192.168.1.10:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
绝对路径:
location ~* \.php$ {
fastcgi_pass 192.168.1.10:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/php$fastcgi_script_name;
include fastcgi_params;
}
通过/pm_status和/ping来获取fpm server状态信息
location ~* ^/(fpm_status|ping)$ {
fastcgi_pass 后端fpm服务器IP:9000;
fastcgi_param SCRIPT_FILENAME $fastcgi_script_name;
include fastcgi_params;
}
fastcgi缓存
定义fastcgi的缓存:
fastcgi_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size[inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time][manager_threshold=time] [loader_files=number] [loader_sleep=time][loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time][purger_threshold=time];
path
缓存位置为磁盘上的文件系统路径
max_size=size
磁盘path路径中用于缓存数据的缓存空间上限
levels=levels
缓存目录的层级数量,以及每一级的目录数量,levels=ONE:TWO:THREE
keys_zone=name:size
k/v映射的内存空间的名称及大小
inactive=time
非活动时长
fastcgi_cache zone | off;
调用指定的缓存空间来缓存数据,可用位置:http, server, location
fastcgi_cache_key string;
定义用作缓存项的key的字符串
例如:fastcgi_cache_key $request_uri;
fastcgi_cache_methods GET | HEAD | POST …;
为哪些请求方法使用缓存
fastcgi_cache_min_uses number;
缓存项在inactive定义的非活动时间内至少要被访问到指定的次数方可被认作活动项
fastcgi_keep_conn on | off;
收到后端服务器响应后,fastcgi服务器是否关闭连接,建议启用长连接
fastcgi_cache_valid [code …] time;
不同的响应码各自的缓存时长
示例:
http {
fastcgi_cache_path /var/cache/nginx/fcgi_cache
levels=1:2:1
keys_zone=fcgicache:20m
inactive=120s;
...
server {
location ~* \.php$ {
...
fastcgi_cache fcgicache;
fastcgi_cache_key $request_uri;
fastcgi_cache_valid 200 302 10m;
fastcgi_cache_valid 301 1h;
fastcgi_cache_valid any 1m;
...
}
}
php-fpm配置参考
[www]
listen = 127.0.0.1:9000 #监听地址及IP
listen.allowed_clients = 127.0.0.1 #允许客户端从哪个源IP地址访问,要允许所有行首加 ;注释即可
user = nginx #php-fpm启动的用户和组,会涉及到后期文件的权限问题
group = nginx
pm = dynamic #动态模式进程管理
pm.max_children = 500 #静态方式下开启的php-fpm进程数量,在动态方式下他限定php-fpm的最大进程数
pm.start_servers = 100 #动态模式下初始进程数,必须大于等于pm.min_spare_servers和小于等于pm.max_children的值。
pm.min_spare_servers = 100 #最小空闲进程数
pm.max_spare_servers = 200 #最大空闲进程数
pm.max_requests = 500000 #进程累计请求回收值,会重启
pm.status_path = /pm_status #状态访问URL
ping.path = /ping #ping访问动地址
ping.response = ping-pong #ping返回值
slowlog = /var/log/php-fpm/www-slow.log #慢日志路径
php_admin_value[error_log] = /var/log/php-fpm/www-error.log #错误日志
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files #phpsession保存方式及路径
php_value[session.save_path] = /var/lib/php/session #当时使用file保存session的文件路径
TCP\UDP反向代理
工作于传输层的反向代理或调度器,用来模拟基于tcp或udp的服务连接,需要使用ngx_stream_core_module模块
语句:
stream { … }
定义stream相关的服务,只能写在main,即跟http同级
搭配ngx_stream_proxy_module模块,可实现代理基于TCP,UDP (1.9.13), UNIX-domain sockets的数据流
proxy_pass address;
指定后端服务器地址
proxy_timeout timeout;
无数据传输时,保持连接状态的超时时长,默认为10m
proxy_connect_timeout time;
设置nginx与被代理的服务器尝试建立连接的超时时长,默认为60s
配置示例:
stream {
upstream mysqlsrvs {
server 192.168.1.11:3306;
server 192.168.1.12:3306;
least_conn;
}
server {
listen 192.168.1.10:3306;
proxy_pass mysqlsrvs;
}
}
stream {
upstream mysql_servers {
server 192.168.1.11:3306;
server 192.168.1.12:3306;
hash $remote_addr consistent;
}
server {
listen 192.168.1.10:3306;
proxy_pass mysql_servers;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
stream {
upstream redis_servers {
server 192.168.1.11:6379 max_fails=3 fail_timeout=30s;
}
server {
listen 192.168.1.10:6379;
proxy_pass redis_servers;
proxy_timeout 60s;
proxy_connect_timeout 10s;
}
}
负载均衡
将多个服务器定义成服务器组,而由proxy_pass, fastcgi_pass等指令进行引用,需要使用ngx_http_upstream_module模块。
配置语法:
upstream name { … }
定义后端服务器组,会引入一个新的上下文,默认调度算法是wrr
只能写在http
配置示例:
upstream test {
server 192.168.1.11
server 192.168.1.12:8080
}
server的参数
weight=number
权重,默认为1
max_conns
连接后端报务器最大并发活动连接数,1.11.5后支持
max_fails=number
失败尝试最大次数;超出此处指定的次数时,server将被标记为不可用,默认为1
fail_timeout=time
后端服务器标记为不可用状态的连接超时时长,默认10s
backup
将服务器标记为“备用”,即所有服务器均不可用时才启用
down
标记为“不可用”,实现灰度发布
ip_hash
源地址hash调度方法
least_conn
最少连接调度算法,当server拥有不同的权重时其为wlc,当所有后端主机连接数相同时,则使用wrr,适用于长连接
hash key [consistent]
基于指定的key的hash表来实现对请求的调度,此处的key可以直接文本、变量或二者组合
作用:将请求分类,同一类请求将发往同一个upstream server,使用consistent参数,将使用ketama一致性hash算法,适用于后端是Cache服务器(如varnish)时使用
hash $request_uri consistent;
hash $remote_addr;
hash $cookie_ name ; #key为 name 的cookie
keepalive 连接数N;
为每个worker进程保留的空闲的长连接数量,可节约nginx端口,并减少连接管理的消耗
示例:
设置权重,默认权重是1
upstream test {
server 192.168.1.11 weight=2
server 192.168.1.12:8080
}
添加sorry服务器
upstream test {
server 192.168.1.11 weight=2
server 192.168.1.12:8080
server 127.0.0.1 backup
}
高并发内核优化参考
默认的Linux内核参数考虑的是最通用场景,不符合用于支持高并发访问的Web服务器的定义,根据业务特点来进行调整,当Nginx作为静态web内容服务器、反向代理或者提供压缩服务器的服务器时,内核参数的调整都是不同的,此处针对最通用的、使Nginx支持更多并发请求的TCP网络参数做简单的配置,修改/etc/sysctl.conf来更改内核参数
fs.file-max = 999999
表示单个进程较大可以打开的句柄数
net.ipv4.tcp_tw_reuse = 1
参数设置为 1 ,表示允许将TIME_WAIT状态的socket重新用于新的TCP链接,这对于服务器来说意义重大,因为总有大量TIME_WAIT状态的链接存在
net.ipv4.tcp_keepalive_time = 600
当keepalive启动时,TCP发送keepalive消息的频度;默认是2小时,将其设置为10分钟,可更快的清理无效链接
net.ipv4.tcp_fin_timeout = 30
当服务器主动关闭链接时,socket保持在FIN_WAIT_2状态的较大时间
net.ipv4.tcp_max_tw_buckets = 5000
表示操作系统允许TIME_WAIT套接字数量的较大值,如超过此值,TIME_WAIT套接字将立刻被清除并打印警告信息,默认为8000,过多的TIME_WAIT套接字会使Web服务器变慢
net.ipv4.ip_local_port_range = 1024 65000
定义UDP和TCP链接的本地端口的取值范围
net.ipv4.tcp_rmem = 10240 87380 12582912
定义了TCP接受缓存的最小值、默认值、较大值
net.ipv4.tcp_wmem = 10240 87380 12582912
定义TCP发送缓存的最小值、默认值、较大值
net.core.netdev_max_backlog = 8096
当网卡接收数据包的速度大于内核处理速度时,会有一个列队保存这些数据包。这个参数表示该列队的较大值
注意:下面的四个参数,需要根据业务逻辑和实际的硬件成本来综合考虑
net.core.rmem_default = 6291456
表示内核套接字接受缓存区默认大小
net.core.wmem_default = 6291456
表示内核套接字发送缓存区默认大小
net.core.rmem_max = 12582912
表示内核套接字接受缓存区较大大小
net.core.wmem_max = 12582912
表示内核套接字发送缓存区较大大小
net.ipv4.tcp_syncookies = 1
与性能无关。用于解决TCP的SYN攻击
net.ipv4.tcp_max_syn_backlog = 8192
这个参数表示TCP三次握手建立阶段接受SYN请求列队的较大长度,默认1024,将其设置的大一些可使出现Nginx繁忙来不及accept新连接时,Linux不至于丢失客户端发起的链接请求
net.ipv4.tcp_tw_recycle = 1
这个参数用于设置启用timewait快速回收
net.core.somaxconn=262114
选项默认值是128,这个参数用于调节系统同时发起的TCP连接数,在高并发的请求中,默认的值可能会导致链接超时或者重传,因此需要结合高并发请求数来调节此值。
net.ipv4.tcp_max_orphans=262114
选项用于设定系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。如果超过这个数字,孤立链接将立即被复位并输出警告信息。这个限制指示为了防止简单的DOS攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值