nginx配置fastcgi、fastcgi缓存、php-fpm配置参考、TCP\UDP反向代理、负载均衡、高并发内核优化参考

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攻击,不用过分依靠这个限制甚至认为的减小这个值,更多的情况是增加这个值

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值