技术交流

Nginx+WordPress 全站启用Https SSL安全加密连接

9102年都过去了,难道我的站还要挂着http不加小锁头吗?
自己鼓捣一个小时就搞定了全站 SSL 安全连接,看一看我是怎么做的。

一、准备 SSL 安全证书

个人网站使用的免费证书有很多选择,本文选择使用 Let’s Encrypt 项目 获取免费证书。

部署推荐使用 Certbot ACME 客户端 ,它可以在不下线服务器的前提下自动执行证书颁发和安装。易于使用,适用于许多操作系统。官方页面对新手很友好,直接提供了命令建议。

对于CentOS 8 + Nginx 的部署,只需要几步即可完成。

1.安装 Certbot。

wget https://dl.eff.org/certbot-auto
sudo mv certbot-auto /usr/local/bin/certbot-auto
sudo chown root /usr/local/bin/certbot-auto
sudo chmod 0755 /usr/local/bin/certbot-auto

2.获取证书

虽然 Certbot 提供了一键自动配置 Nginx

sudo /usr/local/bin/certbot-auto --nginx

但我更推荐仅获取证书,之后再手动修改配置。

sudo /usr/local/bin/certbot-auto certonly --nginx

申请到的证书会保存在以下目录

/etc/letsencrypt/live/ideajayve.club/

目录包含以下文件在内的多个文件,修改Nginx配置时会用到它们的路径。
privkey.pem : 证书私钥文件
fullchain.pem: 证书文件

3.创建自动证书续期服务

echo "0 0,12 * * * root python -c 'import random; import time; time.sleep(random.random() * 3600)' && /usr/local/bin/certbot-auto renew" | sudo tee -a /etc/crontab > /dev/null

二、开启 Nginx 转发重定向

修改自己网站的配置文件,通常在以下目录

  • /etc/nginx/conf.d/

1.修改原有的 80 端口监听的 HTTP server{} 为强制重定向

修改后的 Nginx HTTP server{} 参考:

# HTTP Server rewrite
server {
	listen 80;
	server_name ideajayve.club www.ideajayve.club;
	rewrite ^ https://$server_name$request_uri permanent;
}

2.添加新的 443 端口监听的 HTTPS server{}

修改后的 Nginx HTTPS server{} 参考:

# HTTPS Server
server {
	listen 443 ssl http2;
	server_name  ideajayve.club www.ideajayve.club;
	
	# Log
	access_log  /var/log/nginx/ideajayve-access.log;
	error_log /var/log/nginx/ideajayve-error.log;

    location / {
        root   /var/www/ideajayve;
        index index.php  index.html index.htm;
    }

	# PHP listen
    location ~ \.php$ {
        root           /var/www/ideajayve;
        fastcgi_pass   unix:/run/php-fpm/www.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
		fastcgi_buffers 256 4k;
        include        fastcgi_params;
    }

	# SSL
	ssl_certificate /etc/letsencrypt/live/ideajayve.club/fullchain.pem;
	ssl_certificate_key /etc/letsencrypt/live/ideajayve.club/privkey.pem;
	ssl_ciphers "CHACHA20:GCM:HIGH:!DH:!RC4:!aNULL:!eNULL:!LOW:!3DES:!MD5:!EXP:!PSK:!SRP:!DSS";
	ssl_session_cache shared:SSL:10m;
	ssl_session_timeout 10m;
}

将以上两段配置文本整合在同一个配置文件中,执行命令重启 Nginx。

systemctl restart nginx

现在访问主站看看,地址栏左边已经可以显示 Https 小锁头。

三、开启 WordPress 强制 SSL

修改 WordPress 根目录下的 wp-config.php, 追加以下代码:

/* 强制后台和登录使用 SSL */
define('FORCE_SSL_LOGIN', true);
define('FORCE_SSL_ADMIN', true);

现在 WordPress 的登录和后台都已开启强制使用 SSL。

四、修复 WordPress 站内图片链接

之前上传到媒体库的图片都被 WordPress 记录了带有 http:// 前缀的绝对地址,我们可以通过修改数据库来修复。或者直接修改当前使用的主题目录下的 function.php,追加以下代码:

/* 替换图片链接为 https */
function my_content_manipulator($content){
    if( is_ssl() ){
        $content = str_replace('http://158.247.196.28/wp-content/uploads', 'http://158.247.196.28/wp-content/uploads', $content);
    }
    return $content;
}
add_filter('the_content', 'my_content_manipulator');

还需要关心网站内链的修改,进入 WordPress 后台仪表盘

  • 修改“菜单”当中的所有“自定义链接”为相对路径;
  • 修改“设置”→“常规”里的 “WordPress 地址”和“站点地址”前缀为 https://
  • 好好想想,是否还有其他写下绝对地址的地方…

如果修改自定义链接后,遇到 WordPress 访问文章 404 的情况,需要修改网站 Nginx 配置

修改并添加两部分 WordPress 重定向规则:

# HTTPS Server
server {
    location / {
        root   /var/www/ideajayve;
        index index.php  index.html index.htm;
		
		# WordPress rewrite
		if (-f $request_filename/index.html){ 
		rewrite (.*) $1/index.html break; 
		} 
		if (-f $request_filename/index.php){ 
			rewrite (.*) $1/index.php; 
		} 
		if (!-f $request_filename){ 
			rewrite (.*) /index.php; 
		} 
    }
	
	# WordPress Admin Page rewrite
	rewrite /wp-admin$ $scheme://$host$uri/ permanent;
}

保存后重启 Nginx

systemctl restart nginx

之前访问出现 404 错误的文章,现在可以正常访问了。

至此,Nginx + WordPress 全站 SSL 已经开启,访问已安全加密。

追随着自己的感觉。

发表评论

电子邮件地址不会被公开。 必填项已用*标注