基于Nginx的网站配置https强制访问

基于Nginx的网站配置https强制访问

hansyee
2024-08-11 / 0 评论 / 5 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2024年08月11日,已超过245天没有更新,若内容或图片失效,请留言反馈。

1. 前言

之前的两篇文章简单记录了 Typecho 博客的搭建过程: 1.基于Rocky Linux 8.10系统使用源码搭建LNMP环境,附加安装SQLite 2.基于LNMP环境搭建Typecho博客 但这里面因为是内网演示使用的是 http访问,不涉及任何 https 的设置。现在到处都能看到网站服务器使用 https ,说是安全性好,咱不懂,也没精力和技术去研究,也不知道咱这没流量的小破站需不需要那么高的安全性,服务器上也没啥重要数据,对安全性我到没那么高要求,毕竟不知道哪天就到期关闭了。。哈哈哈!但是话说回来,对不支持 https 的网站浏览器左上角会出现红色叉叉的 http 标识,实在是太扎眼了,既然都说 https 好,那咱也来折腾一下吧,努力把这个博客搞得好看一点,正规一点,虽说没啥内容,但看着高大上也是不错的。

注:以下实验在阿里云轻量应用服务器完成,并非前两篇文章的内网实验,所以之前文中出现的内网IP 192.168.31.84 在本文中由域名 all.17zturn.com 代替,仅IP变化,其他参数配置一致。

2. 申请免费的SSL证书

要使网站支持 https 访问,首先得准备好 SSL 证书。别问我这是啥,我也不知道,专业的解释需要去专业的地方搜索,作为普通玩家,只要知道需要这么个东西就行了。首先这个证书的获取并不容易,专业的是需要收费的,且费用不低,好在现在为了推广使用 https,有许多机构推出了免费的证书申请,这里我使用的是大名鼎鼎的 Let's Encrypt。从这里申请的证书对专业用途有缺陷,有效期只有90天,但对普通玩家来说已经足够,反正到期可以再次申请新的证书,配置好脚本还可以自动进行申请。

2.1. 安装ACME客户端

引用官方的一段说明 Let's Encrypt 入门指南

为了在您的网站上启用 HTTPS,您需要从证书颁发机构(CA)获取证书(一种文件)。 Let’s Encrypt 正是其中一家证书颁发机构。 要从 Let’s Encrypt 获取您网站域名的证书,您必须证明您对域名的实际控制权。 这一过程通常由 Web 主机上运行的 ACME 协议客户端完成。

官网推荐的 AME 协议客户端是 Certbot。但是我这里选用的是acme.sh,其他更多客户端可参考官网提供的客户端列表ACME 客户端

acme.sh 的安装特别简单,以下操作都以 root 用户执行

# email字段需要替换为自己的邮箱地址
curl https://get.acme.sh | sh -s email=nopoetry@outlook.com
Shell

安装后的文件存放在 ~/.acme.sh 目录下,根据项目介绍,后续所有操作的修改都在这个文件内完成,不会污染其他系统文件。 安装完成后,推荐关闭终端并重新启动新终端,这样可以直接使用 acme.sh 命令而不用加上繁琐的路径。

2.2. 申请证书

设置默认ca服务器( acme.sh 脚本默认ca服务器是 zerossl ,经常出错,会导致获取证书的时候一直出现:Pending, The CA is processing your order, please just wait.)

acme.sh --set-default-ca --server letsencrypt
Shell

http方式验证域名(需保证 acme.sh 客户端与网站内容在同一服务器上)

# -d参数指定域名(若要申请泛域名证书,必须明确指定一条二级域名,这里是17zturn.com)
# --webroot参数需要替换为自己的网站根目录
acme.sh --issue -d 17zturn.com \
-d www.17zturn.com \
-d all.17zturn.com \
--webroot /var/www/html/typecho
Shell

这里 acme.sh 客户端会在网站根目录下创建一个验证文件并完成自动验证,验证通过即会自动生成证书。

2.3. 安装证书

需要使用 acme.sh 客户端自带的命令来安装证书,不可直接使用 ~/.acme.sh 目录下的证书文件

# -d参数指定域名(这里直接使用泛域名证书)
# --key-file 和 --fullchain-file 指定证书安装路径
# --reloadcmd参数指定nginx服务器重载配置的命令,这样在安装证书后会自动调用重载命令使网站使用新的证书
acme.sh --install-cert \
-d 17zturn.com \
--key-file /etc/ssl/17zturn.com/key.pem \
--fullchain-file /etc/ssl/17zturn.com/fullchain.pem \
--reloadcmd "systemctl reload nginx"
Shell

3. 配置Nginx支持https

3.1 http强制跳转https

配置 http 强制跳转 https 后,这样即使在浏览器输入 http://all.17zturn.com 也会自动跳转到 https://all.17zturn.com 页面。

编辑博客站点的nginx配置文件

sudo vi /usr/local/nginx/conf/vhosts/typecho.conf
Shell

将原来的 server 块的内容注释掉,修改后的所有内容如下

server {
    listen       80;
    server_name  all.17zturn.com;

    access_log   /usr/local/nginx/logs/typecho.access.log combined;

    return 301 https://$server_name$request_uri;
}
nginx

3.2 https配置

增加博客站点新的https的配置

sudo vi /usr/local/nginx/conf/vhosts/typecho-https.conf
Shell

编辑内容如下

server {
    listen       443 ssl default_server;
    server_name  all.17zturn.com;

    access_log   /usr/local/nginx/logs/typecho.access.log combined;

    root         /var/www/html/typecho;
    index        index.php index.html index.htm;

    ssl_protocols        TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_certificate      /etc/ssl/17zturn.com/fullchain.pem;
    ssl_certificate_key  /etc/ssl/17zturn.com/key.pem;

    ssl_session_cache    shared:SSL:1m;
    ssl_session_timeout  5m;

    ssl_ciphers  ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers  on;

    if (!-e $request_filename) {
        rewrite ^(.*)$ /index.php$1 last;
    }

    location / {
        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;
        }
    }

    location ~ .*\.php(\/.*)*$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}
nginx

重新加载 nginx

sudo systemctl reload nginx
Shell

浏览器访问 https://all.17zturn.com 能成功显示博客即说明配置成功。

0

评论 (0)

取消