Nginx+Let's Encrypts个人泛域名网站架设

Nginx+Let's Encrypts个人泛域名网站架设

目前,我们只需要花费很少的钱甚至利用云服务提供商的活动0元就能买到一台云服务器主机,各种开源简单易用的工具更是多不胜数。对于个人开发者或爱好者来说,搭建一个私有网站做内容共享或者私有远程服务是轻而易举的。

现在的浏览器为了安全都强制要求 https 协议,我们对网站的需求也一般不止一个应用,所以本文对笔者自己的一个网站架设方案做一下记录,也希望能给点击本文的朋友一定的帮助。

笔者的需求和目标是希望架设一个基础的服务器环境,这个环境需要能提供 https 支持并且后续能基于当前的环境很容易快速的做网站应用的扩充,这个需求使用 Nginx代理 和 Let’s Encrypt免费的CA证书就能实现。

安装 Nginx

安装 Nginx 的方式一般通过命令安装即可,若有定制化需求的话,也可以采用编译安装的方式去定制 Nginx 。我的服务器使用的是 CentOS 系统,对 Nginx 不熟的用户建议直接在 root 用户下使用如下命令安装:

1
2
3
4
yum install -y epel-release
yum install -y nginx
# 安装后可通过查找 nginx 在哪里
whereis nginx

这种方式安装后 Nginx 的配置文件一般在 /etc/nginx 中。

编译安装的话,我们可以根据需要增加或移除一些模块,也可以指定安装路径,但是编译安装需要安装编译环境及一些依赖库。一般来说,服务器这样的应用,我们安装到一个普通用户下用普通用户权限运行可能会更加安全,但是 Linux 中 1000 以下的端口都需要具有 root 权限才能监听使用,nginx 在普通用户下使用就需要做端口映射将 80 443 端口映射到大于 1000 的端口上,后续获取 CA 证书也需要 root 权限,会涉及到一些权限的变更,比较烦琐,我们个人用户就直接在 root 用户安装好了,源码安装的具体安装流程如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 安装编译器及依赖
yum install -y make cmake gcc gcc-c++ pcre pcre-devel zlib zlib-devel openssl openssl-devel
# 下载 Nginx 源码包
mkdir nginx
cd nginx
wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 解压源码包
tar zxf nginx-1.18.0.tar.gz
cd nginx-1.18.0/
# 安装配置,--prefix指定安装路径
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module --with-file-aio --with-http_realip_module
# 编译安装
make && make install
# 建一个软连接到 /usr/bin/ 下,这样环境就能直接搜索执行 nginx
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

通过以上步骤,Nginx 便安装完成了。启动 nginx 在命令行直接运行 nginx 即可;如果想设置 nginx 在开机启动的话,对于 CentOS 系统来说,你可以将 nginx 添加到系统的守护进程中。Nginx 服务的实际运行是根据相应的配置文件来指导运行的,由于 https 的CA证书文件也要配置到 nginx 的配置文件中,所以接下来我们先去获取 Let's Encrypt 免费证书,之后再对 nginx 服务进行配置。

获取CA证书

Let’s Encrypt 的证书获取需要安装一些工具,这里我们最好去参考一下Let’s Encrypt官网给的安装方式与建议,这里使用官方推荐的Certbot ACME 客户端的命令行安装方式。直接去到 Certbot 网站 根据提示完成工具的获取与安装。

按提示选择 Nginx 和系统 CentOS8:

certbot

然后它要求我们需要先安装 snapd 去获取 certbot,我们直接点击链接 进入snapcraft’s网站 ,选择我们自己的系统,根据提示依次输入如下命令即可完成安装(假设你是 root 用户):

1
2
3
4
5
6
7
8
9
# 添加 epel 仓库
dnf install epel-release
dnf upgrade
# 安装snapd
yum install snapd
# 设置守护进程开机启动
systemctl enable --now snapd.socket
# 创建软连接
ln -s /var/lib/snapd/snap /snap

完成 snapd 安装后,我们回到 Certbot 进行获取证书工具的安装,按照官方教程,依次执行如下命令:

1
2
snap install core
snap refresh core

执行实际操作前,如果曾安装过 certbot-auto 或其他 certbot 相关的包,请先移出他们,你可以参考如下三条命令:

1
2
3
apt-get remove certbot
dnf remove certbot
yum remove certbot

做完上述操作后,我们便可以执行下述命令实际去安装 Certbot :

1
2
snap install --classic certbot
ln -s /snap/bin/certbot /usr/bin/certbot

Certbot 安装好了!你可以通过如下命令去获取证书并将证书自动的配置到 Nginx 的配置文件中,当然也可以参考我后续的配置进行手动配置。

1
certbot --nginx # 或 certbot certonly --nginx

手动获取证书输入如下命令(注意 *.ereel.cn是申请范域名证书,请注意替换你的域名):

1
certbot certonly --manual --preferred-challenges dns -d *.ereel.cn

依照命令行提示一步一步确认执行,可能会需要输入你的邮箱进行验证,以及问你是否接受推送服务信息之类的,这根据情况填写即可;之后会提示让你在自己的域名上增加一条 TXT 类型的 DNS 解析记录 _acme-challenge.ereel.cn 并填入提示的字符串,完成之后回到命令行终端回车,certbot 确认你添加的解析记录后便会将证书相关的密钥文件放在 /etc/letsencrypt/live/ereel.cn/ 里面;之后将这个密钥文件路径配置到 nginx 配置文件中即可。

Nginx 配置

Nginx 的主配置文件是 /usr/local/nginx/conf/nginx.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
25
26
27
28
29
30
31
32
33
34

# ...

http {
# ...
include conf.d/*.conf;

server {
listen 80;
server_name www.ereel.cn;

return 301 https://www.ereel.cn$request_uri; # 强制转发到https
}

# HTTPS server
#
server {
listen 443 ssl;
server_name www.ereel.cn;

# ssl on;
ssl_certificate /etc/letsencrypt/live/ereel.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ereel.cn/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;

location / {
root html;
index index.html index.htm;
}
}
}

上述是删除了一部分配置后的结构,可以看到,在这个配置中我强制将 http 转发到了https,这里面主要配置了 www.ereel.cn 的访问服务,这个文件在 http 块里有多个 server ,每个 server 实际上是对应一个站点,从配置 include conf.d/*.conf; 中我们可以看到,主配置文件中将 conf.d/ 文件夹中所有 .conf 为后缀的文件都包含了进来,所以我们多个站点最直接的做法就是每个站点放在一个文件中,不同站点的配置需求放不同的文件,这便于维护管理。这样,比如我要增加一个博客的站点,我可以在 conf.d/ 中增加一个名为 blog.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
25
26
27
28
29
30
31
32
33
34
35
server  {
listen 80;
server_name blog.ereel.cn;

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

server {
listen 443 ssl;
server_name blog.ereel.cn;

# ssl on;
ssl_certificate /etc/letsencrypt/live/ereel.cn/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ereel.cn/privkey.pem;
ssl_session_timeout 5m;
ssl_protocols SSLv3 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
ssl_prefer_server_ciphers on;

location / {
proxy_pass http://localhost:8020;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
proxy_set_header Accept-Encoding gzip;
proxy_connect_timeout 150;
proxy_send_timeout 100;
proxy_read_timeout 100;
proxy_buffers 4 32k;
client_max_body_size 500m; # Big number is we can post big commits.
client_body_buffer_size 128k;
}

后续我们如果想增加站点的话,其实拷贝一份 blog.conf 重命名,改动一下其中的域名与转发端口即可。改动了配置文件,我们需要手动重新载入才能生效,使用如下命令是重载配置:

1
nginx -s reload

刷新CA证书

值得注意的是,Let’s Encrypt 的证书只能维持三个月,到期后需要重新获取证书,你可以参考官方的方法添加 crontab 自动任务并生成RSA密钥对将公钥放置到你域名解析服务商的服务器上自动更新证书,不嫌麻烦的话你可以向我一样,收到到期邮件后重复上述命令重新申请即可。

作者

ereel

发布于

2022-05-18

更新于

2022-05-18

许可协议

    


评论