How to install Wordpress and apply SSL on Nginx

前一篇文章中我介绍了如何在VPS上搭建Nginx环境和简单的Server Block设置,这一篇我来介绍一下如何在主域名安装Wordpress。

这一篇我可以偷下懒,因为我是完全按照下面这篇文章安装成功的。

How to Install WordPress with PHP 7.1 and Nginx on Debian 9

一步步按照上文来设置应该就可以成功安装,本文会着重探讨server block的设置以及SSL证书的使用。

SSL installation and Server block configuration

对于一个服务器host几个网站(包括子网站)来说,一般都是在各自的Server Block里设置该网站使用的SSL证书。直接在其Server Block指向其证书即可,我这里参考了Mozilla的SSL Configuration Generator来生成Server block

1
nano /etc/nginx/site-available/aufomm.com
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
server {
listen 443 ssl http2;
server_name aufomm.com;

root /var/www/html/aufomm.com;
index index.php index.html;

# 需要注意的是这个证书的文件格式必须把服务器证书和中介证书放在一个文件里面。有一些CA在客户选择Ngxin服务器的时候会自动生成正确的格式。不然的话客户需要手动把证书文件叠加成以下形式来保存。
#-----BEGIN CERTIFICATE-----
#服务器证书的base64代码
#-----END CERTIFICATE-----
#-----BEGIN CERTIFICATE-----
#中介证书的base64代码
#-----END CERTIFICATE-----
ssl_certificate /etc/ssl/www.aufomm.com.crt;
ssl_certificate_key /etc/ssl/www.aufomm.com.key;

ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;
}

由于我使用的是Multidomain的SSL证书而且我要secure的网站都在同一个服务器上,所以我不需要在每一个Server Block专门设置证书。我只需要在Nginx Config的文件里面设置整个服务器指向证书文件即可。

1
nano /etc/nginx/nginx.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
http {
....

##
# SSL Settings
##

# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /etc/ssl/www_aufomm_com.pem;
ssl_certificate_key /etc/ssl/www_aufomm_com.pkey;

# modern configuration. tweak to your needs.
ssl_protocols TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;

....
}

Direct connections to HTTPS and non-www to www

这个步骤说白了就是强制所有base domain的流量到www并且所有的链接都通过HTTPS的链接来连接。假设上一步我们已经在nginx.cong里面已经设置好了SSL证书。理论来说我们接下来只需要修改basedomain的Server block即可。

以下就是我最后的Server Block

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
server {
listen 80;
server_name aufomm.com;
return 301 https://www.aufomm.com$request_uri;
}

server {
listen 443 ssl http2;
server_name www.aufomm.com;
root /var/www/html/aufomm.com;
index index.php index.html index.htm;

access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;

location / {
try_files $uri $uri/ /index.php?q=$uri&$args;
}

location ~* \.(jpg|jpeg|gif|css|png|js|ico|html)$ {
access_log off;
expires max;
}

location ~ /\.ht {
deny all;
}

location ~ \.php$ {
fastcgi_index index.php;
fastcgi_keep_conn on;
include /etc/nginx/fastcgi_params;
fastcgi_pass unix:/run/php/php7.1-fpm.sock;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}

本来以为这一步之后应该可以完美解决问题,但是我遇到的情况是SSL设置没问题,但是blog的地址确不会跳转到www。后来发现在Wordpress里面需要设置博客地址这个才会生效。

nonwwwtowww

一开始这里默认是basedomain和http,我把他改成https和www的形式之后,搭配上面的Server block设定,就达到了我想要的效果。