Nginx基础篇-Nginx 源码编译安装与平滑升级

Nginx基础篇-Nginx 源码编译安装与平滑升级

Nginx官网下载地址
http://nginx.org/

1.安装依赖包

yum -y install pcre-devel zlib-devel gcc gcc-c++ make

2.创建运行用户、组

useradd -M -s /sbin/nologin nginx

3.编译安装

cd /opt
tar zxvf nginx-1.12.0.tar.gz -C /opt/
 
cd nginx-1.12.0/
./configure \
--prefix=/usr/local/nginx \				      		#指定nginx的安装路径
--user=nginx \										#指定用户名
--group=nginx \										#指定组名
--with-http_stub_status_module						#启用 http_stub_status_module 模块以支持状态统计
 
make && make install
 
ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/		#让系统识别nginx的操作命令

4.检查、启动、重启、停止nginx服务

nginx -t									#检查配置文件是否配置正确
nginx										#启动		
cat /usr/local/nginx/logs/nginx.pid		    #先查看nginx的PID号
kill -3 <PID号>
kill -s QUIT <PID号>						#停止
killall -3 nginx
killall -s QUIT nginx
 
kill -1 <PID号>						    	#重载
kill -s HUP <PID号>
killall -1 nginx
killall -s HUP nginx					  	#日志分隔,重新打开日志文件
kill -USR1 <PID号>						 	#平滑升级
kill -USR2 <PID号>

5.添加Nginx系统服务

vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecrReload=/bin/kill -s HUP $MAINPID
ExecrStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
 
chmod 754 /lib/systemd/system/nginx.service		#赋权,除了root以外的用户都不能修改
systemctl start nginx.service
systemctl enable nginx.service

6.全局配置

vim /usr/local/nginx/conf/nginx.conf 
 
#user nobody; 					#运行用户,若编译时未指定则默认为 nobody
worker_processes 1; 			#工作进程数量,可配置成服务器内核数 * 2
#error_log logs/error.log; 		#错误日志文件的位置
#pid logs/nginx.pid; 			#PID 文件的位置

7.HTTP配置

http {
	##文件扩展名与文件类型映射表
    include       mime.types;
 
	##默认文件类型
    default_type  application/octet-stream;
 
	##日志格式设定
    #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;
 	##此选项允许或禁止使用socke的TCP_CORK的选项(发送数据包前先缓存数据),此选项仅在使用sendfile的时候使用
    #tcp_nopush     on;
 
	##连接保持超时时间,单位是秒
    #keepalive_timeout  0;
    keepalive_timeout  65;
 
	##gzip模块设置,设置是否开启gzip压缩输出
    #gzip  on;
 
##Web 服务的监听配置
server {
	##监听地址及端口
	listen 80; 
	##站点域名,可以有多个,用空格隔开
	server_name www.lic.com;
 
	##网页的默认字符集
	charset utf-8;
 
	##根目录配置
	location / {
	
		##网站根目录的位置/usr/local/nginx/html
		root html;
	
		##默认首页文件名
		index index.html index.htm;
	}
 
	##内部错误的反馈页面
	error_page 500 502 503 504 /50x.html;
	##错误页面配置
	location = /50x.html {
		root html;
	}
}
}

8.平滑升级和回滚

nginx编译安装平滑升级的过程

1.将旧Nginx二进制文件换成新Nginx程序文件(注意先备份,新nginx二进制文件只执行make不执行make install)
2.向master进程发送USR2信号
3.master进程修改pid文件名加上后缀.oldbin,成为nginx.pid.oldbin
4.master进程用新Nginx文件启动新master进程成为旧master的子进程,系统中将有新旧两个Nginx
5.主进程共同提供Web服务,当前新的请求仍然由旧Nginx的worker进程进行处理,将新生成的master
进程的PID存放至新生成的pid文件nginx.pid
6.向旧的Nginx服务进程发送WINCH信号,使旧的Nginx worker进程平滑停止
7.向旧master进程发送QUIT信号,关闭老master,并删除Nginx.pid.oldbin文件
如果发现升级有问题,可以回滚∶向老master发送HUP,向新master发送QUIT

9.编译安装nginx新版本1.23.2

cd /opt
tar zxvf nginx-1.23.2.tar.gz -C /opt/
 
cd /opt/nginx-1.23.2/
./configure \
--prefix=/usr/local/nginx \				      		#指定nginx的安装路径
--user=nginx \										#指定用户名
--group=nginx \										#指定组名
--with-http_stub_status_module						#启用 http_stub_status_module 模块以支持状态统计

#只需要make 不需要make install make

10.备份旧的nginx二进制文件,copy新的nginx到usr/local/nginx/sbin/下

#重命名旧的nginx
mv /usr/local/nginx/sbin/nginx nginx.bak

#拷贝新的nginx
cp objs/nginx /usr/local/nginx/sbin/
cd /usr/local/nginx/sbin/
ls -ltr

11.检查&发送USR2信号进行平滑升级

#检查
./nginx -t
ps -auxf |grep nginx

# 发送 USR2 平滑升级信号
#USR2 平滑升级可执行程序,将存储有旧版本主进程PID的文件重命名为nginx.pid.oldbin,并启动新的nginx
#此时两个master的进程都在运行,只是旧的master不在监听,由新的master监听80
#此时Nginx开启一个新的master进程,这个master进程会生成新的worker进程,这就是升级后的Nginx进程,此时老的进程不会自动退出,但是当接收到新的请求不作处理而是交给新的进程处理。
kill -USR2 `ps -ef | grep "nginx: master process" | grep -v grep | awk '{print $2}'`

# 查看最新进程状态
# 可以看到两个master,新的master是旧版master的子进程,并生成新版的worker进程

#先关闭旧nginx的worker进程,而不关闭nginx主进程方便回滚
#向原Nginx主进程发送WINCH信号,它会逐步关闭旗下的工作进程(主进程不退出),这时所有请求都会由新
版Nginx处理
kill -WINCH `cat /usr/local/nginx/run/nginx.pid.oldbin`

#经过一段时间测试,新版本服务没问题,最后退出老的master
kill -QUIT `cat /usr/local/nginx/run/nginx.pid.oldbin`

备注:要是nginx.pid.oldbin文件没有生成,需要自行判断新旧nginx得PID进行上述命令即可

你可能感兴趣的:(Nginx,Nginx学习,nginx,运维,服务器)