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


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

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

    1.安装依赖包

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

    2.创建运行用户、组

    useradd -M -s /sbin/nologin nginx
    
    • 1

    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的操作命令
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    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号>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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 文件的位置
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    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;
    	}
    }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55

    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 模块以支持状态统计
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    #只需要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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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进行上述命令即可
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
  • 相关阅读:
    SpringMVC统一异常处理配置
    antd table表格支持多选框选择当前列,进行格式设置等
    【java学习—九】内部类(7)
    学会这9个伪类,让你的页面 表单更人性化!!!
    基于web的老年保健品销售系统/保健品销售系统
    MySQL 高级函数大全(更新完成)
    【SVM分类】基于matlab鸽群算法优化支持向量机SVM分类【含Matlab源码 2242期】
    四、一起学习Java 对象和类
    NV-Embed论文阅读笔记
    8年研发工程师心路历程(道与术皆得)
  • 原文地址:https://blog.csdn.net/yyf0430/article/details/128074649