CentOS7系统内核优化配置============
参数追加到Linux系统的/etc/sysctl.conf文件中,然后使用如下命令使修改生效:/sbin/sysctl -p
参数net.core.netdev_max_backlog,表示当每个网络接口接受数据包的速率比内核处理这些包的速率快时,允许发送队列的数据包的最大数目,我们调整为262144.
net.core.netdev_max_backlog = 262144
该参数用于调节系统同时发起的TCP连接数,一般默认值为128,在客户端高并发的请求的情况下,该默认值较小,可能导致连接超时或者重传问题,我们可以根据实
际情况结合并发数来调节此值。
net.core.somaxconn = 262144
该参数用于设定系统中最多允许存在多少TCP套接字不被关联到任何一个用户文件句柄上,如果超过这个数字,没有与用户文件句柄关联到TCP套接字将立即被复位,
同时发出警告信息,这个限制只是为了简单防治Dos攻击,一般系统内存充足的情况下,可以增大这个参数。
net.ipv4.tcp_max_orphans = 262144
该参数用于记录尚未收到客户端确认信息的连接请求的最大值,对于拥有128内存的系统而言,此参数的默认值为1024,对小内存的系统则是128,一般在系统内存比
较充足的情况下,可以增大这个参数的赋值。
net.ipv4.tcp_max_syn_backlog = 262144
该参数用于设置时间戳,这个可以避免序列号的卷绕,在一个1Gb/s的链路上,遇到以前用过的序列号概率很大,当此值赋值为0时,警用对于TCP时间戳的支持,默认
情况下,TCP协议会让内核接受这种异常的数据包,针对Nginx服务器来说,建议将其关闭。
net.ipv4.tcp_timestamps = 0
该参数用于设置内核放弃TCP连接之前向客户端发送SYN+ACK包的数量,为了建立对端的连接服务,服务器和客户端需要进行三次握手,第二次握手期间,内核需要发
送SYN并附带一个回应前一个SYN的ACK,这个参数主要影响这个过程,一般赋予值为1,即内核放弃连接之前发送一次SYN+ACK包。
net.ipv4.tcp_synack_retries = 1
该参数的作用与上一个参数类似,设置内核放弃建立连接之前发送SYN包的数量,赋值为1。
net.ipv4.tcp_syn_retries = 1
#/etc/group 文件是用户组的配置文件,内容包括用户和用户组,并且能显示出用户是归属哪个用户组或哪几个用户组,因为一个用户可以归属一个或多个不同的用户组;同一用 户组的用户之间具有相似的特征。比如我们把某一用户加入到root用户组,那么这个用户就可以浏览root用户家目录的文件,如果root用户把某个文件 的读写执行权限开放,root用户组的所有用户都可以修改此文件,如果是可执行的文件(比如脚本),root用户组的用户也是可以执行的;#
#定义Nginx运行的用户和用户组
user www www;
#############################################################################################################################
#worker_cpu_affinity这个参数要结合 worker_processes来一起使用。其中 先说 worker_processes。
#worker_processes指明了nginx要开启的进程数,据官方说法,一般开一个就够了,多开几个,可以减少机器io带来的影响。 一般为当前机器总cpu核心数的1到2倍。如,我的机器为双核,那么开4个足够了。
#worker_processes 2;
#worker_cpu_affinity 01 10;
#worker_processes 4;
#worker_cpu_affinity 0001 0010 0100 1000;
#若要2核CPU开4进程,那么可以写为:
#worker_processes 4;
#worker_cpu_affinity 01 10 01 10;
#2核是 01,四核是0001,8核是00000001,有多少个核,就有几位数,1表示该内核开启,0表示该内核关闭。
#worker_processes最多开启8个,8个以上性能提升不会再提升了,而且稳定性变得更低,所以8个进程够用了。配置完毕后,重启nginx 。ok!
#默认情况下,Nginx的多个进程有可能跑在某一个CPU或CPU的某一核上,导致Nginx进程使用硬件的资源不均,因此绑定Nginx进程到不同的CPU上是为了充分利用硬件的多CPU多核资源的目的。
#worker_cpu_affinity用来为每个进程分配CPU的工作内核,参数有多个二进制值表示,每一组代表一个进程,每组中的每一位代表该进程使用CPU的情况,1代表使用,0代表不使用。所以我们使用worker_cpu_affinity 0001 0010 0100 1000;来让进程分别绑定不同的核上。
worker_processes 2;
worker_cpu_affinity 01 10;
#指定错误日志的存放路径,错误日志记录级别可选为【debug | info | notice | warn | error | crit】
error_log logs/error.log crit;
#指定PID的存放路径,pid文件存放路径则该文件存放的就是Nginx主进程号
pid logs/nginx.pid;
#worker_rlimit_nofile 这个指令是指当一个nginx 进程打开的最多文件描述符数目,理论值应该是最多打开文
#件数(ulimit -n)与nginx 进程数相除,但是nginx 分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。
#现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。
#这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
#查看该值命令:ulimit -n 或者 cat /proc/sys/fs/file-max
#使用 ulimit Cn 65535 可即时修改ulimit打开文件数的值,但重启后就无效了。
#linux系统文件描述符的方法:sysctl -a | grep fs.file
worker_rlimit_nofile 65535;
#################################################### events配置参数 #########################################################################
-------use epoll---------
设置事件驱动模型使用epoll。事件驱动模型有use [kqueue | rtsig | epoll | /dev/poll | select | poll | eventport];
配置指定了线程轮询的方法,使用的I/O模型,linux 推荐epoll 高效的方法;FreeBSD 推荐使用kqueue 高效的方法
-------worker_connections---------
设置一个进程理论允许的最大连接数,理论上越大越好,但不可以超过worker_rlimit_nofile的值。
还有个问题,linux系统中有个指令open file resource limit,它设置了进程可以打开的文件句柄数量,可以用下面的指令查看你的linux系统中open file resource limit指令的值,cat /proc/sys/fs/file-max
可以将该指令设置为65535
echo “65535” > /proc/sys/fs/file-max; sysctl -p
理论上每台nginx 服务器的最大连接数为worker_processes(进程数)*worker_connections(每个进程最大连接数)。
-------accept_mutex---------
这个牵扯到《UNIX网络编程》第一卷中提到的“惊群”问题(Thundering herd problem),
大致意思是当某一时刻只有一个网络连接到来时,多个睡眠进程会被同时叫醒,但只有一个进程可获得连接,如果每次唤醒的进程数目太多,会影响一部分系统性能。
在Nginx服务器的多进程下,就可能出现这个问题,为了解决这个问题,Nginx配置了包含这样一条指令accept_mutex,当其设置为开启的时候,将会对多个Nginx进程接受连接进行序列化,
防止多个进程对连接的争抢。当服务器连接数不多时,开启这个参数会让负载有一定程度的降低。
但是当服务器的吞吐量很大时,为了效率,请关闭这个参数;并且关闭这个参数的时候也可以让请求在多个worker间的分配更均衡。所以我们设置accept_mutex off;
-------multi_accept---------
配置指定nginx在收到一个新连接通知后尽可能多的接受更多的连接
events {
use epoll;
worker_connections 1024;
accept_mutex off;
multi_accept off;
}
#############################################################################################################################
http {
###################################################全局参数配置##########################################################################
include mime.types;
default_type application/octet-stream;
#access_log主要是记录"谁来登陆了,从哪里登陆的,登陆后发生了什么",以下的 log_format main 就是access_log的格式,main是格式名称
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log logs/access.log main;
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65;
#gzip on;
###################################################反向代理的实例##########################################################################
#添加upstream节点domain,domain是自定义组名的名字
#weight(权重)指定轮询几率,weight和访问比率成正比,要注意的是 weight 与 ip_hash 是不能同时使用的,原因很简单,他们是不同且彼此冲突的策略。
#max_fails
#fail_timeout
upstream do_main_web{
server 192.168.0.10:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.11:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.12:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.13:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.14:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.0.15:80 weight=1 max_fails=2 fail_timeout=30s;
}
#第一个虚拟机,用来反向代理do_main_web这组服务器
server {
listen 80;
server_name www.qimiaoer.com;
location / {
root html;
index index.html index.htm;
#如果后端的某一台服务器返回502、504、执行超时等错误时,系统会自动把请求转发到upstream负载均衡池中的另一台服务器,实现故障转移,利用proxy_next_upstream实现线路容灾
proxy_next_upstream http_502 http_504 error timeout invalid_header;
proxy_pass http://do_main_web;
#当后端的WEB服务器上有多个基于域名的虚拟主机时,要通过添加Header头信息Host,这样后端WEB服务器才能识别反向代理的访问请求由那个虚拟主机处理!
proxy_set_header Host www.qimiaoer.com;
#使用反向代理之后,后端服务器就不能直接通过$_SERVER["REMOTE_ADDR"]获取用户的真实IP啦,获取到的是Nginx负载均衡服务器IP,所以要通过下面的设置让后端服务获取用户的真实IP.
proxy_set_header X-Forwarded-For $remote_addr;
}
location ~ [^/]\.php(/|$)
{
try_files $uri =404;
#fastcgi_pass指定FastCGI服务器监听端口(fastcgi_pass localhost:9000)或Unix套接字(fastcgi_pass unix:/tmp/php-cgi.sock)
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
#参数设定 #传递为PHP变量名 #Nginx自有变量,可自定义
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;
fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;
# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;//设置浏览器缓存 30天
}
location ~ .*\.(js|css)?$
{
expires 12h;//设置浏览器缓存 12小时
}
location ~ /\.
{
deny all;
}
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
#匹配所有虚拟主机
include vhost/*.conf;
}
#ps -ef | grep nginx 命令查找nginx的主进程号,master process 标示是主进程,worker process标示子进程
#启动nginx,-c 制定配置文件的路径,如果不加 -c,Nginx 会默认加载其安装目录conf子目录中的nginx.conf文件。
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
#以下命令 可以测试是否可以平滑重启,如果配置有错误 会提示配置的错误位置,直到配置完全正确;这样可以防止网站因为配合错误而中断
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
#平滑重启的命令-HUP;其它的参数(INT 快速关闭;QUIT 从容关闭;HUP 平滑重启,重新加载配置文件;USR1 重新打开日志文件,在切割日志时用途较大;USR2 平滑升级可执行程序(/usr/local/nginx/sbin/中的执行程序);WINCH 从容关闭工作进程)
kill -HUP 主进程;
kill -INT 主进程;
kill -QUIT 主进程;
…
#或者
kill -HUP /usr/local/nginx/logs/nginx.pid
;
…