
一、nginx平滑升级1 nginx安装与自启动配置安装ngnix-1.30.0版本访问/nginx.org/download/找到对应版本复制链接wget下载[rootserver25 ~]# tar zxf nginx-1.30.0.tar.gz[rootserver25 ~]# cd nginx-1.30.0/[rootserver25 nginx-1.30.0]# vim auto/cc/gcc#关闭调试模式如下图[rootserver25 nginx-1.30.0]# yum install -y gcc pcre-devel openssl-devel[rootserver25 nginx-1.30.0]# ./configure --with-http_ssl_module --with-http_stub_status_module[rootserver25 nginx-1.30.0]# make make install[rootserver25 nginx-1.30.0]# ln -s /usr/local/nginx/sbin/nginx /usr/sbin[rootserver25 nginx-1.30.0]# nginx -t[rootserver25 nginx-1.30.0]# nginx如果希望nginx可以自启动可以给其设置启动文件访问https://mailman.nginx.org/pipermail/nginx/2019-May/057976.html可以找到启动文件的模板[rootserver25 nginx-1.30.0]# vim /etc/systemd/system/nginx.service[rootserver25 nginx-1.30.0]# systemctl daemon-reload[rootserver25 nginx-1.30.0]# systemctl enable nginx测试下载ngnix-1.30.4版本[rootserver25 ~]# wget https://nginx.org/download/nginx-1.30.4.tar.gz[rootserver25 ~]# tar zxf nginx-1.30.4.tar.gz[rootserver25 ~]# cd nginx-1.30.4/[rootserver25 nginx-1.30.4]# vim auto/cc/gcc[rootserver25 nginx-1.30.4]# ./configure --with-http_ssl_module --with-http_stub_status_module[rootserver25 nginx-1.30.4]# make#生成的二进制文件在objs/下的nginx[rootserver25 objs]# cd /usr/local/nginx/sbin/[rootserver25 sbin]# ls#这里我发现有两个版本应是之前的环境没清理干净[rootserver25 sbin]# ./nginx -vnginx version: nginx/1.30.0#验证后发现正在运行的版本是1.30.0[rootserver25 sbin]# ./nginx.old -vnginx version: nginx/1.30.4#原来的版本是1.30.4现在停用了依旧可以做升级只是要备份的为正在运行的程序2 备份原程序[rootserver25 sbin]# cp nginx nginx.bak #备份[rootserver25 sbin]# lsnginx nginx.bak nginx.old[rootserver25 sbin]# cd[rootserver25 ~]# cd nginx-1.30.4/[rootserver25 nginx-1.30.4]# cd objs/[rootserver25 objs]# lsautoconf.err Makefile nginx nginx.8 ngx_auto_config.h ngx_auto_headers.h ngx_modules.c ngx_modules.o src3 拷贝新程序[rootserver25 objs]# cp -f nginx /usr/local/nginx/sbin/nginxcp: overwrite ‘/usr/local/nginx/sbin/nginx’? y#程序正在占用-f强制拷贝4 升级新程序获取当前nginx主进程pid[rootserver25 objs]# ps ax|grep nginx[rootserver25 objs]# kill -USR2 9962 #执行后应该会唤醒新程序如出现下图情况进程列表没有出现一组新的 masterworker 进程需要回退5 回退[rootserver25 ~]# cd /usr/local/nginx/[rootserver25 nginx]# lsclient_body_temp conf fastcgi_temp html logs proxy_temp sbin scgi_temp uwsgi_temp[rootserver25 nginx]# cd sbin/[rootserver25 sbin]# pwd/usr/local/nginx/sbin[rootserver25 sbin]# lsnginx nginx.bak nginx.old[rootserver25 sbin]# cp -f nginx.bak nginxcp: overwrite ‘nginx’? y[rootserver25 sbin]# nginx -s stop[rootserver25 sbin]# ps ax|grep nginx[rootserver25 sbin]# nginx -t[rootserver25 sbin]# ps ax|grep nginx重新启动再按原来步骤升级出现新的进程升级成功但仍有旧版本在运行[rootserver25 sbin]# nginx[rootserver25 sbin]# ps ax|grep nginx[rootserver25 sbin]# cd[rootserver25 ~]# ls[rootserver25 ~]# cd nginx-1.30.4/[rootserver25 nginx-1.30.4]# ls[rootserver25 nginx-1.30.4]# cd objs/[rootserver25 objs]# cp -f nginx /usr/local/nginx/sbin/nginxcp: overwrite ‘/usr/local/nginx/sbin/nginx’? y[rootserver25 objs]# ps ax|grep nginx[rootserver25 objs]# kill -USR2 34232[rootserver25 objs]# ps ax|grep nginx测试新程序已接管版本变为1.30.4关闭原worker进程但保留主进程[rootserver25 objs]# kill -WINCH 34232若运行一段时间发现新程序不稳定可以回退为原版本还原nginx程序# cp -f nginx.old nginx唤醒原进程# kill -HUP PID回收新版本的worker进程kill-WINCHPID 关闭新版本主进程kill-QUITPID二、nginx并发优化1. Nginx 程序本身并发优化1.1 进程调度相关worker_processes工作进程数量推荐设置等于 CPU 核心数worker_cpu_affinity绑定 worker 进程到指定 CPU 核心CPU 亲和减少上下文切换一个进程可以绑定一个核心CPU有多少个核就有几位数1代表内核开启0代表内核关闭。把 worker 进程绑定固定 CPU 核心减少 CPU 上下文切换提升性能、降低延迟。若有3个核配置为100 10 001worker数量也与CPU核心数一致1.2 单进程连接上限worker_connections 1024含义单个 worker 进程最大同时维持连接数可打开文件数限制默认为1024修改为65535两个核可连接65535*2修改完配置后nginx -s reload生效1.3 最大并发计算nginx作为http服务器时max_clients worker_processes * worker_connectionsnginx作为反向代理服务器时需除以2max_clients worker_processes * worker_connections / 22. Linux 系统层面限制优化2.1. 用户进程文件句柄限制配置文件/etc/security/limits.conf作用控制进程最多打开文件需要用一个普通用户运行创建一个普通用户指定其为不登录用户[rootserver25 ~]# useradd -M -d /usr/local/nginx/ nginx[rootserver25 ~]# usermod -s /sbin/nologin nginx[rootserver25 ~]# vim /usr/local/nginx/conf/nginx.conf[rootserver25 ~]# nginx -s stop[rootserver25 ~]# nginx -t[rootserver25 ~]# nginx要限制nginx程序只需限制nginx这个用户[rootserver25 ~]# vim /etc/security/limits.conf#此文件即改即生效2.2 系统全局最大文件句柄限制内核参数fs.file-max说明系统整体所有进程合计最大打开文件数量由内存大小决定。查看[rootserver25 ~]# sysctl -a|grep file即使内核允许打开65535*2个文件热插拔模块的limit模块会限制数量默认1024超过则会大量报错若想修改可参照2.1节内容。2.3 TCP 源端口范围客户端向外发起连接参数net.ipv4.ip_local_port_range 1024 65535作用定义出站连接可用源端口区间防止端口耗尽。2.4 Listen 监听队列长度参数net.core.somaxconn 2048作用TCP 握手等待队列高并发防止新建连接丢包。2.5 TIME-WAIT 连接优化net.ipv4.tcp_tw_reuse 1允许复用 TIME-WAIT 端口net.ipv4.tcp_tw_recycle 1快速回收示例配置2.3—2.5所涉及服务[rootserver25 ~]# sysctl -a|grep net.ipv4.ip_local_port_range[rootserver25 ~]# vim /etc/security/limits.conf#直接将配置写入文件[rootserver25 ~]# sysctl --system[rootserver25 ~]# sysctl -a|grep net.ipv4.ip_local_port_range三、nginx负载均衡器为保证实验环境纯净更换了服务端和测试端服务端server25192.168.40.145客户端server26192.168.40.146[rootserver25 ~]# cd /usr/local/nginx/conf[rootserver25 conf]# vim nginx.conf #在httpd中添加配置#可在https://nginx.org/en/docs/http/load_balancing.html查找[rootserver25 conf]# nginx -t[rootserver25 conf]# nginx -s reload测试[rootserver26 ~]# vim /etc/hosts #加入服务端的域名解析[rootserver26 ~]# curl www.westos.org关闭server23的httpd服务再测试只能访问server22打开服务后恢复正常说明其具有健康检测功能