YOLO813

网站屏蔽公网IP地址的直接访问以及Nginx的平滑升级

    每个可以正常访问的域名背后都有一个公网IP,但是我们通常都希望用户可以通过DNS解析的域名来对网站进行访问,如果你的网站只是通过80端口访问的话,那么可以在原本的nginx配置文件server段添加如下代码对以IP地址访问你网站的用户返回403代码,例如

server {
    listen 80 default;
    server_name _;
    return 403;
}
# 原来的server段
server {
    listen       80;
    server_name  www.domain.com domain.com;
}


    但如果你的端口中还可以通过443端口访问,那么当访问https://your_ip时你的证书域名信息其实都已经被暴露出来了,例如

    这样也是不安全的,而NGINX 1.19.4 中添加了一个新的配置项 ssl_reject_handshake 用于拒绝握手,所以我要做的事就是把nginx版本升级到最新版本即可。

    我的nginx版本为nginx/1.18.0,查看版本以及当时的配置命令

/usr/local/nginx/sbin/nginx -V

    升级测试步骤如下:

# 备份配置文件夹
cd /usr/local/nginx/;tar -zcvf conf.tar.gz conf/

    下载最新稳定版nginx

cd /opt/;wget http://nginx.org/download/nginx-1.22.1.tar.gz
tar -zxvf nginx-1.22.1.tar.gz


    编译nginx,进行到make即可,不用安装make install,在这里原始nginx仍然可以正常接受请求,不用担心

cd /opt/nginx-1.22.1/
# 从版本信息中获取到的配置
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --add-dynamic-module=/opt/ngx_http_geoip2_module-master
# 注意执行完make就可以了
make


    复制新的nginx二进制文件替换

# 备份原 nginx 二进制文件
mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx0324.bak
cp /opt/nginx-1.22.1/objs/nginx /usr/local/nginx/sbin/


    如果在复制的时候提示下方错误,那么请看一下你是否使用的是复制而非重命名

cp: cannot create regular file '/usr/local/nginx/sbin/nginx': Text file busy

    重命名nginx二进制文件并不会导致nginx停止,除非你在此刻重启了nginx,所以放心操作。

    测试nginx是否正常运行,以及版本号:

/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -V


    目前我的nginx进程号如下

    一切符合预期之后,就可以给nginx发送平滑迁移信号

kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`

    此时,查看pid所在路径可以看到有两个文件,分别对应两个新老nginx进程的PID号码

ls -ilh /usr/local/nginx/logs/nginx.*

    从容关闭旧的Nginx进程,可以看到老进程只剩下一条

kill -WINCH  `cat /usr/local/nginx/logs/nginx.pid.oldbin`

    结束工作进程,完成此次升级

kill -QUIT  `cat /usr/local/nginx/logs/nginx.pid.oldbin`

    此时在nginx配置文件中可以添加ssl_reject_handshake功能了,再次添加如下代码:

# 80
server {
    listen 80 default;
    server_name _;
    return 403;
}
# 443
server {
    listen 443 default_server;
    server_name _;
    # 直接拒绝握手
    ssl_reject_handshake on;
  }


    再次以IP访问,可以看见如下内容

参考:

https://zinglix.xyz/2021/10/04/nginx-ssl-reject-handshake/
https://nginx.org/en/download.html
https://zhuanlan.zhihu.com/p/193078620
-TERM, INT: 立刻退出
-QUIT: 等待工作进程忙完结束后再退出
-KILL: 强制终止进程
-HUP: 重新加载配置文件,使用新的配置启动新的工作进程,正常关闭旧的工作进程
-USR1: 重新打开日志文件
-USR2: 执行升级,并启动新的主进程,实现热升级
-WINCH: 逐步关闭工作进程或者说正常关闭工作进程