前言
目前,我们常用的网站,都已升级到https访问,而且很多的专家也建议实施全站https,下面记录了我在升级https过程中遇到的几个坑,希望能对后来者有所帮助。
先展示效果图

思路
要实现https访问网站,需要理清思路。
1. 申请网站ssl安全证书: 2. 验证域名所有权
验证方式一般分为:DNS验证和文件验证,大多数人可能使用的DNS验证,因为我没有备案域名,所以只能采用文件验证。
3. 下载证书和部署
将证书上传到服务器,并在Nginx服务器中添加https访问的配置项,基本就可以访问了,下面来说说具体的过程。
1. 申请证书
大多数人都是通过阿里云或者是腾讯云来申请ssl安全证书的,我自己的服务器也是腾讯云,因为自己没有备案,所以使用FreeSSL。

输入自己想要配置ssl的域名,并输入邮箱点击创建即可。
填坑:
由于自己没有备案域名,使用别人分配的二级域名,因此需要选择文件验证,而上面的默认是使用DNS验证,所以出现了错误。

2. 使用文件验证域名所有权
点击创建之后,会在下面展示文件验证需要的文件、文件夹和文件内容,并在服务器上域名对应的目录下,创建如图所示的文件夹和文件,并将内容写入到文件中,但是会发现访问域名下的这个文件的时候出现下面的错误。

填坑:访问域名时出现403

因为服务器访问时出现了403,所以需要查看log错误日志,这个文件是在/var/log/nginx/error.log,查看错误日志,显示如图:

原因是:当前登录的是root用户,创建文件和文件夹的时候,默认用户和用户组是root,而在Nginx的服务器配置中,默认的访问用户是:nginx,所以才会出现403错误,因此需要将创建的文件和文件夹的用户和用户组修改为nginx,使用的命令如下:
chown -R nginx:nginx api
现在访问网站,正常显示内容了,如下图:

3. SSL申请证书端验证域名
现在可以访问域名了,因此需要在freessl网站验证,可以先点检测,然后再验证。 验证成功之后,可以点击下载证书,然后将证书上传到服务器,或者是在服务器中创建对应的文件,然后将内容粘贴过去也行。证书如下:

4. 上传证书、配置https访问
现在已经将证书上传到服务器,接着是配置ssl。 在配置ssl之前,我们可以创建一个文件夹,专门存储ssl的证书,这样所有的证书都是存放在一起,便于管理。 配置Nginx,打开当前域名对应的Nginx配置,修改下面的几个配置项:
1. 修改监听端口号,由原来的80改为443
listen 443; #将原来的80改成443
2. 添加ssl的证书地址和密钥地址
ssl on; #设置开启https访问
ssl_certificate /home/Fly/keys/api.crt; #配置证书位置
ssl_certificate_key /home/Fly/keys/api-private.key; #配置密钥位置
注意:在配置ssl时,每个配置项结束之后,需要加上分号,否则重启Nginx会报错
完整的Nginx配置如下:
server {
listen 80;
server_name ***.com;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
set $root /home/wwwroot/api;
ssl on;
ssl_certificate /home/Fly/keys/api.crt;
ssl_certificate_key /home/Fly/keys/api-private.key;
location / {
root $root;
index index.html index.htm index.php;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
配置完毕之后,重启Nginx服务器,命令:
service nginx restart
现在可以使用https进行访问,显示如图:

5. 将所有的http请求都重定向到https请求
目前我们在浏览器中直接输入域名的话,默认是http请求,它就会请求到下面的页面。

所以需要在配置文件中增加一个server,使用rewrite,将所有的http请求重定向到https,配置如下:
server {
listen 80;
server_name xxx.com;
rewrite ^(.*) https://$host$1 permanent; #请求重定向到https
}
重启Nginx服务器,现在访问时,所有的请求都会转到https。
总结:
通过此次的操作,明白了Nginx的基本配置和具体的配置项的含义,下次出现问题就不会摸不着头脑了,当然还有不足之处:目前证书只能使用1年,一年之后需要重新申请证书,比较麻烦,后面研究一下,如何在证书快到期之后,自动重新申请并配置,不需要手动操作。