今天给服务器安装了Nginx,并配置了SSL,网址左边终于有了萌萌哒的小绿锁,这里还是做一下记录。

先是安装Nginx

1
2
3
$ wget http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ rpm -ivh nginx-release-centos-7-0.el7.ngx.noarch.rpm
$ yum install nginx

启动Nginx

1
$ systemctl start nginx

这样Nginx服务就已经启动完成了,输入服务器ip地址就可以看到Nginx主页,然后我们需要把Hexo服务的4000端口转发到Nginx的80端口,查看Nginx配置文件/etc/nginx/nginx.conf,看到需要修改conf.d目录下的/etc/nginx/conf.d/default.conf文件

1
2
3
4
5
6
7
8
9
10
11
12
server {
listen 80;
server_name ppxu.me *.ppxu.me;
location / {
proxy_pass http://127.0.0.1:4000/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...

重启Nginx

1
$ systemctl restart nginx

现在访问网站,在响应头里就可以看到Server:nginx/1.8.0,说明Nginx环境已经正常了,下面准备搞上HTTPS。

这里就不详述HTTPS的原理了,对我们这个小博客而言,搞个免费的SSL证书就可以了,这里推荐https://startssl.com/或者https://www.wosign.com/,申请成功后把下载下来的对应版本的证书文件上传到服务器上,包含公钥xx.crt和私钥xx.key

然后编辑/etc/nginx/conf.d/default.conf

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
listen 443 ssl;
server_name ppxu.me *.ppxu.me;
ssl on;
ssl_certificate /etc/nginx/conf.d/ppxu.crt;
ssl_certificate_key /etc/nginx/conf.d/ppxu.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'AES128+EECDH:AES128+EDH:!aNULL';
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_stapling on;
ssl_stapling_verify on;
location / {
proxy_pass http://127.0.0.1:4000/;
proxy_redirect off;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
...

重启Nginx,如果一切顺利,现在就可以通过https://ppxu.me访问到本网站了,但是如果直接输入ppxu.me的话会报400错误,显示

1
The plain HTTP request was sent to HTTPS port

所以我们需要将http的请求强制使用https访问,最方便的办法是启用HSTS,在nginx的配置中添加

1
add_header Strict-Transport-Security "max-age=31536000; includeSubdomains";

这样只要是支持HSTS的浏览器,就可以自动完成http到https的替换,而且是直接在浏览器本地完成的,对于不支持的浏览器,只能在服务器做重定向了,继续在Nginx配置中添加一条规则

1
error_page 497 https://$host$uri;

这样我们的网站就已经完全支持了HTTPS访问,可以在这个网站https://www.ssllabs.com/ssltest/analyze.html对网页进行安全评测,如果评分不够高的话可以再看看如何加强nginx的SSL安全

/img/ssl.png

参考资料