- CA&HTTPS
- Nginx的平滑升级
1.CA&HTTPS
1.1私有CA
(一)前言
CA 证书颁发机构(CA, Certificate Authority)
基于https的协议工作的一中虚拟主机,要构建这样的网站需要mod_ssl模块的支持。且需要提供两个文件:证书文件和私钥文件,证书文件是标识这个网站服务器身份的,私钥文件主要用来实现在服务器端对数据进行加密,然后在网站中传输的。证书在生产生活中需要到对应的机构去申请,在实验环境中本应该搭建一台证书服务器,
(二)生成证书及秘钥文件
1)准备存放证书和秘钥的目录 [root@nginx ~]# mkdir -p /etc/nginx/ssl
2)生成私钥 使用openssl生成基于rsa数学算法长度为1024bit的秘钥,文件必须以key为结尾
[root@nginx ~]# openssl genrsa 1024 > /etc/nginx/ssl/server.key
Generating RSA private key, 1024 bit long modulus
...............................................................++++++
................................................................++++++
e is 65537 (0x10001)3) 使用秘钥文件生成证书-申请书
[root@nginx ~]# openssl req -new -key /etc/nginx/ssl/server.key > /etc/nginx/ssl/server.csr
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN ###国家名(两个字
State or Province Name (full name) []:BJ ###省会(两个字
Locality Name (eg, city) [Default City]:BJ ###城市
Organization Name (eg, company) [Default Company Ltd]::qf ###组织名 (千锋QF
Organizational Unit Name (eg, section) []:cloud ##组织单位名
Common Name (eg, your name or your server's hostname) []:nginx.linux.com ##服务器的名字或者你的名字
Email Address []:12345678@qq.com ###可选
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []: ###密码为空
An optional company name []: ####密码为空
Common Name (eg, your name or your server's hostname) []: ###公司名空
查看申请书 [root@nginx ~]# ls /etc/nginx/ssl/
server.csr (证书申请) server.key (私钥)4)同意申请,生成证书
[root@nginx ~]# openssl req -x509 -days 365 -key /etc/nginx/ssl/server.key -in /etc/nginx/ssl/server.csr > /etc/nginx/ssl/server.crt
注释:
-x509:证书的格式,固定的
days:证书的有效期,生产生活中时间不同,价格不同
key:指定秘钥文件
in:指定证书申请文件查看证书:
[root@nginx ~]# ll /etc/nginx/ssl/
总用量 12
-rw-r--r--. 1 root root 1021 7月 12 17:31 server.crt ####证书文件
-rw-r--r--. 1 root root 676 7月 12 17:30 server.csr ####申请书。可以销毁
-rw-r--r--. 1 root root 887 7月 12 17:12 server.key ####私钥文件
(三)私有CA的https部署实战
1、创建目录 :
[root@nginx ~]# mkdir /bj
[root@nginx ~]# echo "bj ssl web" > /bj/index.html2、编辑nginx.conf文件 :
[root@nginx ~]# vim /etc/nginx/conf.d/bj.confserver {
listen 443 ssl;
server_name www.bj.com;ssl_certificate /etc/nginx/ssl/server.crt; ##路径自定义
ssl_certificate_key /etc/nginx/ssl/server.key;location / {
root /bj;
index index.html index.htm;
}
}[root@nginx ~]# nginx -t
[root@nginx ~]# nginx -s reload
[root@nginx ~]# ss -antp | grep nginx
LISTEN 0 128 *:80 *:* users:(("nginx",pid=11700,fd=6),("nginx",pid=11699,fd=6),("nginx",pid=8347,fd=6))
LISTEN 0 128 *:443 *:* users:(("nginx",pid=11700,fd=20),("nginx",pid=11699,fd=20),("nginx",pid=8347,fd=20))
3、测试访问:风险提示 接受同意即可
1.2公网CA
[root@xiaochen ~]# ll /etc/nginx/214194377980730.*
-rw-r--r-- 1 root root 1679 May 11 14:41 /etc/nginx/214194377980730.key
-rw-r--r-- 1 root root 3916 May 11 14:41 /etc/nginx/214194377980730.pem[root@xiaochen ~]# cat /etc/nginx/conf.d/default.conf
server {
listen 80;
server_name www.xuleicloud.top ;
return 301 https://www.xuleicloud.top$request_uri;
# rewrite .* https://www.xuleicloud.top$request_uri permanent;
}
server {
listen 443 ssl;
ssl on;
ssl_certificate /etc/nginx/214194377980730.pem;
ssl_certificate_key /etc/nginx/214194377980730.key;
location / {
root /usr/share/nginx/html;
index index.html index.php;
}
}
[root@xiaochen ~]# systemctl restart nginx
2.Nginx的平滑升级 【注:nginx的平滑升级时针对源码安装的nginx】
2.1原理
当需要将正在运行中的nginx升级,添加/删除服务模块时,可以在不中断服务的情况下,使用新版本,重编译的Nginx可执行程序替换旧版本的可执行程序,步骤如下:
• 使用新的可执行程序替换旧的可执行程序,对于编译安装的Nginx,可以将新版本编译安装到旧版本的nginx安装路径中.替换之前,最好备份一下旧的可执行程序
• 发送以下指令: Kill –USR2 旧版本的nginx主进程号
• 旧版本的主进程将重命名它的pid文件为.oldbin (例如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新版本的nginx可执行程序,依次启动新的主进程和新的工作进程.
• 此时,新,旧版本的nginx实例会同时运行,共同处理输入的请求.要逐步停止旧版本的nginx实例,你必须发送WINCH信号给旧的主进程,然后,它的工作进程就将开始从容关闭:kill –WINCH 旧版本的Nginx主进程号
• 一段时间后,旧的工作进程(worker process)处理了所有已连接的请求后退出,仅由新的工作进程来处理输入的请求了.
• 这时候,我们可以决定是使用新版本,还是恢复到旧的版本;
Kill –HUP 旧的主进程号:Nginx将在不重载配置文件的情况下启动它的工作进程;
Kill –QUIT 新的主进程号:从容关闭其他工作进程(woker process);
Kill –TERM 新的主进程号:强制退出;
Kill 新的主进程号或旧的主进程号:如果因为某些原因新的工作进程不能退出,则向其发送kill信号.
新的主进程退出后,旧的主进程会移除.oldbin前缀,恢复为他的.pid文件,这样,一切就都恢复到升级之前了,如果尝试升级成功,而你也希望保留新的服务器时,可发送QUIT信号给旧的主进程,使其退出而只留下新的服务器运行:
2.2平滑升级1.14.2版本到1.18版本
(一)1、编译安装新版本的nginx,指定安装目录为新目录
nginx 1.14.2 源码安装之后准备平滑升级:
准备安装工具:
yum -y install ncurses ncurses-devel openssl-devel bison gcc gcc-c++ make cmake
[root@server nginx]# tar xf /root/nginx/nginx-1.18.0.tar.gz
[root@server nginx]# cd /root/nginx/nginx-1.18.0/
[root@server nginx-1.18.0]# ./configure --prefix=/usr/local/nginx --sbin-path=/usr/local/nginx/sbin/nginx --modules-path=/usr/local/nginx/modules --conf-path=/usr/local/nginx/conf/nginx.conf --error-log-path=/usr/local/nginx/logs/error.log --http-log-path=/usr/local/nginx/logs/access.log --pid-path=/usr/local/nginx/logs/nginx.pid --lock-path=/usr/local/nginx/logs/nginx.lock[root@server nginx-1.18.0]# make
注意:不要make install,会导致原先的主程失控
(二)2、查看就的nginx的主进程号和工作进程号
[root@server ~]# ps -ef |grep nginx
(三)3、替换旧的执行程序
备份旧版本nginx主目录
# mv /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.BP
[root@server ~]# cp /root/nginx/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/
[root@server ~]# /usr/local/nginx/sbin/nginx -v 查询当前版本
nginx version: nginx/1.14.2
(四)4、 给主进程发送USR2信号
[root@server ~]# kill -USR2 `cat /usr/local/nginx/logs/nginx.pid`
[root@server ~]# cat /usr/local/nginx/logs/nginx.pid.oldbin旧版本的主进程将重命名它的pid文件为.oldbin (例如:/usr/local/nginx/logs/nginx.pid.oldbin),然后执行新版本的nginx可执行程序,依次启动新的主进程和新的工作进程.
(五)给旧进程发送 QUIT 信号,要求其从容关闭其工作进程
[root@localhost nginx-1.18.0]# kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin`
并观察当前的版本号:
[root@localhost nginx-1.18.0]# /usr/local/nginx/sbin/nginx -v
至此nginx版本从1.14 升级到1.18
(五)5、给进程发送WINCH信号
一段时间后,旧的工作进程(worker process)处理了所有已连接的请求后退出,仅由新的工作进程来处理输入的请求了.
2.3回退到以前版本
(一)原理
这时因为旧的服务器还尚未关闭它监听的套接字,所以通过下面的几步还可以恢复旧版本:
• 发送 HUP 信号给旧的主进程 - 它将在不重载配置文件的情况下启动它的工作进程。
• 发送 QUIT 信号给新的主进程,要求其从容关闭其工作进程
• 发送 TERM 信号给新的主进程,迫使其退出
• 如果因为某些原因新的工作进程不能退出,则直接将其杀死 KILL 信号
(二)第一步
[root@server ~]# kill -HUP 68595
[root@server ~]# ps aux |grep ngin[x]
root 58943 0.0 0.3 45940 3260 ? S 13:34 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nginx 58944 0.0 0.1 46388 1888 ? S 13:34 0:00 nginx: worker process
root 68595 0.0 0.1 20640 1548 ? Ss 12:12 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 80008 0.0 0.1 21060 1388 ? S 13:50 0:00 nginx: worker process
(三)第二步
[root@server ~]# kill -QUIT 58943
[root@server ~]# ps aux |grep ngin[x]
root 68595 0.0 0.1 20640 1548 ? Ss 12:12 0:00 nginx: master process /usr/local/nginx/sbin/nginx
nobody 80008 0.0 0.1 21060 1388 ? S 13:50 0:00 nginx: worker process[root@server ~]# cat /usr/local/nginx/logs/nginx.pid
68595
2.4总结
对于nginx的平滑升级:
首先解压nginx高版本的源码包;然后进入包版本的源码包目录;
进行预编译(预编译的文件参数路径要与旧版本保持一致);在进行编译;
备份旧进程sbin下的nginx ; 复制高版本解压目录objs下的nginx 到旧版本sbin下
给旧版本nginx的master进程发送USR2信号;会产生一个.pid.oldbin 的文件
再给旧版本nginx 发送QUIT信号;
nginx 服务主进程能够接受的信号:
1、TERM或INT:快速停止nginx服务
2、QUIT:平缓停止nginx 服务
3、HUP:使用新的配置文件启动进程,平缓停止原有进程,可以理解为“平滑重启”
4、USR1: 重新打开日志文件,常用户日志切割
5、USR2:使用新版本的nginx文件启动服务,之后平缓停止原有nginx进程,也就是所谓的“平滑升级”。
6、WINCH:平滑停止worker process,用于nginx服务器平滑升级。