云服务器部署nginx+https+websocket(wss)+续约ssl(完整版)

Https部署

1、概要

网站转成https是大势所趋,但是在国内,推进的过程显然要比国外慢很多。

现阶段如果将自己的网站改成https以后,会碰到这样的尴尬现象:如果在页面上引用了http://的链接或者图片,用户在浏览器上会看到类似该网站是非安全网站的警告,对于网站运营者来说可以说非常冤。由于很多链接是第三方的,没有办法去控制。

对于api接口类的网站,就不存在混合的问题,所以首先应该从api后台接口部分开始用https。(ios已经强制要求接口地址必须为https了)

大牌提供商的SSL证书可不便宜,对于大公司也许不算什么,但是对于小公司及个人来说贵了。现在国外出现的免费SSL服务商Let’s Encrypt,绝对是小公司或者开发者的福音。

这里整理了在CentOS7 + nginx安装和使用Let’s Encrypt的完整过程。

官方网站:https://letsencrypt.org

申请let’s encript 证书可以有三种方式:
我们使用一种即可

  1. 通过certbot脚本

没有特殊情况,首选采用certbot脚本方式

下面的笔记就是基于certbot的方式


由于letsencrypt证书的有效期只有90天,需要长期使用的话,需要在失效前进行延长申请。用certbot脚本工具,可以将延期申请的脚本写到定时任务来自动完成,非常方便。

2、前提条件

  1. 拥有一个域名,例如www.xxx.com (在国内主机的用的话,还需要通过ICP备案)
  2. 在域名服务器创建一条A记录,指向云主机的公网IP地址。例如www.xxx.com指向xxx.xxx.xxx.xxx的IP地址
  3. 要等到新创建的域名解析能在公网上被解析到。
  4. 据说国内的域名提供商对letsencrypt的支持非常差,但是经过试验,至少现阶段用dnspod解析的域名还没碰到问题。

3、安装nginx

1、一般都是通过宝塔面板安装(推荐)

宝塔教程笔者将在后面分享(当然也可自行百度。)

2、命令行

yum install -y nginx

配置nginx站点

新建站点目录:mkdir /opt/www/站点 -p #站点一般就是域名 /opt/www可自定义目录
执行命令:chown nginx:nginx /opt/www/站点/ -R
编辑配置文件:vi /etc/nginx/conf.d/域名.conf

执行vi /etc/nginx/conf.d/域名.conf

将以下内容复制到该文件中

server {
listen 80;
server_name demo.mydomain.com;#你的域名
charset utf-8;
 
root /opt/www/demo.mydomain.com;#站点目录
index index.html index.htm;
 
access_log  /var/log/nginx/demo.mydomain.com_access.log;
error_log   /var/log/nginx/demo.mydomain.com_error.log;
}

启动nginx

systemctl start nginx

注意:要确认CentOS服务器开放80口及443端口

防火墙端口配置

1 切换到root用户,并输入命令:firewall-cmd --query-port=443/tcp 确认端口是否开放

返回no

可以看出,端口443并没有对外开放

2 输入命令: firewall-cmd --get-active-zones 拿到zone名称

3 输入命令:firewall-cmd --zone=public --add-port=443/tcp --permanent

永久开放443端口

4 输入命令:firewall-cmd --reload ,重启防火墙

5 再次查看端口是否开放了:firewall-cmd --query-port=443/tcp

可以看到返回yes,表明端口开放成功

在浏览器上确认访问到http://demo.mydomain.com 如果没有页面的话,正常情况下应该会显示403错误。nginx站点配置完成。

4、安装certbot工具

yum install -y epel-release
yum install -y certbot

5、使用certbot命令第一次申请证书

 # 使用方法:
        	certbot certonly --webroot -w [Web站点目录] -d [站点域名] -m [联系人email地址] --agree-tos
 #对比    	
            certbot certonly --webroot -w /opt/www/demo.mydomain.com -d demo.mydomain.com -m myname@gmail.com --agree-tos

说明:

在这里插入图片描述
在填 -d 站点域名的时候不要疏忽了主机记录(这里是www):

​ 比如: www.123.com 填 123.com就可能会出错

在这里插入图片描述

注意:联系人email地址要填写真实有效的,letsencrypt会在证书在过期以前发送预告的通知邮件。 申请成功后,会显示以下Congratulations信息

在这里插入图片描述

这里面就包含了证书的保存位置

在这里插入图片描述

查看证书有效期的命令

openssl x509 -noout -dates -in /etc/letsencrypt/live/[demo.mydomain.com]/cert.pem

显示的是格林威治时间,不知道怎么才能显示当前时区。

6、设置定时任务自动更新证书

letsencrypt证书的有效期是90天,但是可以用脚本去更新。

1、使用定时器crontab

linux下使用crontab命令被用来提交和管理用户需要周期性执行的任务。

a、检查服务器crontab是否可用

注:这是centos7下的命令,ubuntu是cron

#查看crontab状态
service crond status 

在这里插入图片描述

b、若不可用就尝试启动
#开启crontab
service crond start
c、若还是不行就尝试安装
yum install  vixie-cron
yum install  crontabs
d、编辑定时任务

在上述情况正常下

执行

crontab -e #:修改 crontab 文件,如果文件不存在会自动创建。

第一次执行是空文档

我们添加如下代码:

# 每月1号0时执行执行一次更新,并重启nginx服务器
00 00 01 * * /usr/bin/certbot renew --quiet && /bin/systemctl restart nginx

按 i 进入编辑, 复制代码后,ESC, 输入:wq 保存

再次crontab -e 便可看见文件中有代码了

在这里插入图片描述

说明:

# 更新证书
certbot renew --dry-run
# 如果不需要返回的信息,可以用静默方式
certbot renew --quiet

crontab的说明:

#crontab -选项
-e:修改 crontab 文件,如果文件不存在会自动创建。 
-l:显示 crontab 文件。 
-r:删除 crontab 文件。(慎用!)
-ir : 删除 crontab 文件前提醒用户。
-u<用户名称>:指定crontab 文件用户名称。

#crontab 参数
crontab文件:指定包含待执行任务的crontab文件。
例如:
shell脚本
python脚本
cron脚本文件等

#crontab 服务
#查看crontab状态
service crond status 
#开启crontab
service crond start
#关闭crontab
service crond stop
#重启crontab
service crond restart

定时任务示例

在crontab文件中写入需要执行的命令和时间,该文件中每行都包括六个域,其中前五个域是指定命令被执行的时间,最后一个域是要被执行的命令。每个域之间使用空格或者制表符分隔。格式如下:

minute hour day-of-month month-of-year day-of-week commands
–分 -------时----------日-----------------月------------星期几 ----要执行的命令

合法值为:00-59 00-23 01-31 01-12 0-6 (0 is sunday)

  • 除了数字还有几个特殊的符号:

    *代表所有的取值范围内的数字
    "/“代表每的意思,”/5"表示每5个单位
    "-"代表从某个数字到某个数字
    ","分开几个离散的数字

#示例:
30 21 * * * /etc/init.d/smb restart 	#每晚的21:30重启smb

0 12 * * * /home/gim/project/hello.sh	#每天中午12点的执行shell脚本

0 13 * * 0 /home/gim/project/hello.sh	#每周日13点的执行shell脚本

0 4 1 1 * command line		#1月1日早上4点

0 11 4 * 1-3 command line	#每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

02 4 * * * root run-parts /etc/cron.daily	#每天(凌晨4:02)执行/etc/cron.daily内的脚本 - root用户执行

15 */2 * * * echo "Have a break now." >> /tmp/test.txt	#每两个小时(第一个为15,指明没两个小时的第15min中执行一次)

0 23-7/2,8 * * * echo "Have a good dream" >> /tmp/test.txt	#晚上11点到早上8点之间每两个小时和早上八点

30 12 * * * /usr/local/bin/python3 /home/gim/project/calculate_summary4pro.py 0 >> /home/gim/project/logs/python3/python$(date +\%Y\%m\%d).log 2>&1	#每天中午12点半执行一次python脚本,并把执行的日志结果追加到当天的日志文件中。

【 知识扩展】

Linux下的任务调度分为两类:系统任务调度和用户任务调度。

系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。

在oracle 中可以利用dbms_job包定时执行pl/sql、sql过程,在像备份等需要在操作系统级定时任务只能采用crontab来完成。

【注意事项】
%
在crontab中%是有特殊含义的,表示换行的意思。如果要用的话必须进行转义%
59 1 1-7 4 * test 'date +\%w' -eq 0 && /root/a.sh
注:commands(参数文件)注意以下几点

要是存在文件,要写绝对路径。
即使是打印也不会显示在显示屏,在后台运行,最好重定向日志。
环境变量
环境变量的值,在crontab 文件中获取不到,所以要注意,可以写脚本。
文件或用户权限
查看当前用户是否有权限执行参数文件,当前命令是否有权限。

7、配置nginx,使用证书开通https站点

1、生成Perfect Forward Security(PFS)键值

mkdir /etc/ssl/private/ -p

cd /etc/ssl/private/

openssl dhparam 2048 -out dhparam.pem

Perfect Forward Security(PFS)是个什么东西,中文翻译成完美前向保密,一两句话也说不清楚,反正是这几年才提倡的加强安全性的技术。如果本地还没有生成这个键值,需要先执行生成的命令。

2、配置nginx站点

例如,样例内容如下:

server {
listen 80;
server_name demo.mydomain.com;#你的域名
rewrite ^ https://$server_name$request_uri? permanent;
}
server {
  listen 443 ssl;
  server_name demo.mydomain.com;
  charset utf-8;
  root /opt/www/demo.mydomain.com;#站点位置
  index index.html index.htm;
  access_log  /var/log/nginx/demo.mydomain.com_access.log;#日志
  error_log  /var/log/nginx/demo.mydomain.com_error.log;
  # letsencrypt生成的文件
  ssl_certificate /etc/letsencrypt/live/demo.mydomain.com/fullchain.pem;#步骤五中那个路径
  ssl_certificate_key /etc/letsencrypt/live/demo.mydomain.com/privkey.pem;
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets on;
  ssl_dhparam /etc/ssl/private/dhparam.pem;#这里你应该cd /etc/ssl/private 
  #看看dhparam.pem的真实名字:一般是: 前缀-dhparam.pem;
  #比如pure-ftpd-dhparams.pem
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
  ssl_prefer_server_ciphers on;
}

在浏览器打开http://demo.mydomain.com, 如果正常跳转到https://demo.mydomain.com,就算成功了。 如果是chrome浏览器,在地址栏点击小锁的图标,可以查看证书的详情

3、其他配置+wss的配置

server {
    listen 80;
    server_name 你的域名;
    rewrite ^ https://$server_name$request_uri? permanent;
}
server {    
    listen 443 ssl;
    server_name 你的域名;
    charset utf-8;
    root /www/wwwroot/你的域名;
    index index.html index.htm;
       
    access_log  /www/wwwlogs/你的域名.log;
    error_log  /www/wwwlogs/你的域名_error.log;
    
  ssl_certificate /etc/letsencrypt/live/你的域名/fullchain.pem;
  ssl_certificate_key /etc/letsencrypt/live/你的域名/privkey.pem;
 
  ssl_session_timeout 1d;
  ssl_session_cache shared:SSL:50m;
  ssl_session_tickets on;
  ssl_dhparam /etc/ssl/private/pure-ftpd-dhparams.pem;
 
  ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  # 一般推荐使用的ssl_ciphers值: https://wiki.mozilla.org/Security/Server_Side_TLS
  ssl_ciphers 'ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-DSS-AES128-GCM-SHA256:kEDH+AESGCM:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA:ECDHE-ECDSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-DSS-AES128-SHA256:DHE-RSA-AES256-SHA256:DHE-DSS-AES256-SHA:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128:AES256:AES:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK';
  ssl_prefer_server_ciphers on;

    location / {
        root    html;
        index   index.html index.htm;
        proxy_set_header Host $http_host;
        proxy_pass      http://127.0.0.1:8080;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    location /ws{
        proxy_pass       http://127.0.0.1:21016/ws;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
    

}

这样你就可以通过 https://你的域名来访问你的项目了

也可以通过 wss://域名/ws来访问websocket了

希望对你有所帮助,谢谢你的阅读。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值