1. 引言
1.1 Nginx 和 Let's Encrypt 的简介
Nginx:
Nginx (发音为 "Engine-X") 是一个开源的高性能 Web 服务器软件,自从其首次发布以来,由于其稳定性、丰富的功能集和低资源消耗,已经成为了许多高流量网站的首选。除了作为 Web 服务器外,Nginx 也广泛应用于以下场景:
Nginx 之所以如此受欢迎,不仅仅是因为它的功能性,而且因为它的架构设计,能够很好地处理数万到数十万的并发连接,而不会增加明显的资源消耗。
Let's Encrypt:
Let's Encrypt 是一个开放和自动化的证书颁发机构 (CA) ,其主要目标是创建一个更加安全和隐私保护的网络。它提供免费的 SSL/TLS 证书,使得加密通讯变得既简单又无成本。
几个突出特点如下:
借助 Nginx 和 Let's Encrypt,用户可以轻松地搭建高性能、安全、并且受到加密保护的网站。
1.2 Ubuntu 22.04 的概述
Ubuntu 22.04 LTS (Long Term Support) 是 Ubuntu 操作系统的一个版本,它为用户提供了长达五年的安全更新和修复。这个版本是为了满足企业用户和其他需要长期稳定运行环境的用户的需求而设计的。它具有许多重要的功能和改进,可以帮助用户更高效、更安全地管理和运行他们的服务器和网络应用程序。
通过这些功能和改进,Ubuntu 22.04 LTS 为企业用户和IT专业人员提供了一个稳定、可靠、易于管理的服务器操作系统平台。
2. 安装 Nginx
2.1 更新系统软件包列表
在安装 Nginx 之前,为了确保你能获取到最新版本的软件包,建议首先更新你的系统软件包列表。
sudo apt update && sudo apt upgrade
这条命令将会同步系统的软件包列表,确保你可以安装或更新到最新的软件版本。
2.2 安装 Nginx 软件包
安装 Nginx 只需一个简单的命令:
sudo apt install nginx
执行这条命令后,系统会询问你是否要继续安装,通常输入 "y" 确认即可。等待安装过程完成,Nginx 就已经成功安装在你的系统上了。
2.3 启动和管理 Nginx 服务
安装完 Nginx 后,你可以使用以下命令来启动它:
sudo systemctl start nginx
为了确保 Nginx 在系统重启后能自动启动,你需要将它设置为开机自启:
sudo systemctl enable nginx
其他常用命令:
- 停止 Nginx 服务:
sudo systemctl stop nginx
- 重启 Nginx 服务:
sudo systemctl restart nginx
- 查看 Nginx 服务状态:
sudo systemctl status nginx
安装和设置完成后,你可以通过浏览器访问服务器的 IP 地址,看到 Nginx 的欢迎页面,这表示 Nginx 已成功安装并正在运行。
3. Nginx 基本配置
3.1 配置主机虚拟文件
Nginx 通过虚拟主机文件来管理多个域名的配置。默认情况下,Nginx 使用 /etc/nginx/sites-available/default
文件作为其默认配置文件。
sudo nano /etc/nginx/sites-available/default
server {
listen 80 default_server;
listen [::]:80 default_server;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name _;
location / {
try_files $uri $uri/ =404;
}
}
listen
: 指定服务器监听的端口。root
: 指定Web站点的根目录。index
: 默认显示的文件。server_name
: 用于此配置块的域名(_表示任何域名)。location
: 匹配特定请求的指令块。
root
路径或添加其他域名到 server_name
。 sudo nginx -t
sudo systemctl restart nginx
3.2 配置防火墙规则
为了确保外部用户可以访问通过 Nginx 托管的网站,你可能需要更新防火墙规则。
sudo ufw allow 'Nginx Full'
sudo ufw status
此时,你应该看到 "Nginx Full" 已被允许通过防火墙。
4. 安装 Certbot 和 Let's Encrypt 插件
Certbot 是 Let's Encrypt 的一个客户端,用于从 Let's Encrypt 自动获取和安装 SSL 证书。运行以下命令安装 Certbot 和 Certbot 的 Nginx 插件:
sudo apt install certbot python3-certbot-nginx
5. 申请和配置泛域名证书
泛域名证书(也称为通配符证书)是一个特殊类型的 SSL 证书,它允许你为主域名及其所有子域名提供安全的 HTTPS 连接。在配置大量的子域名时,泛域名证书是一个非常有用的工具,因为你只需要一个证书就可以覆盖所有子域名。
5.1 申请泛域名证书
生成泛域名证书: 使用以下命令为你的域名生成泛域名证书。
sudo certbot certonly --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory -d yourdomain.com -d *.yourdomain.com
在运行上述命令后,Certbot 会给出一些指示,要求你为域名添加一个特定的 DNS TXT 记录。这是为了验证你对该域名的控制权。确保按照给出的指示正确添加 DNS 记录,并等待其生效,然后继续操作。
完成验证: 一旦 DNS 记录生效并被 Certbot 验证,你的泛域名证书就会被生成和存储在 /etc/letsencrypt/live/yourdomain.com/
目录中。
5.2 配置 Nginx 使用泛域名证书
打开 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/default
指定证书和私钥: 在适当的 server
块中,找到或添加以下行,并确保它们指向你的泛域名证书和私钥的路径:
ssl_certificate /etc/letsencrypt/live/yourdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/yourdomain.com/privkey.pem;
保存并退出: 保存文件并退出编辑器。
测试 Nginx 配置:
sudo nginx -t
确保没有错误返回。
重新加载 Nginx:
sudo systemctl reload nginx
现在,你的 Nginx 服务器应该已经成功配置了泛域名证书,并为你的域名及其所有子域名提供了安全的 HTTPS 连接。
6. 自动更新 Let's Encrypt 证书
当你使用 Let's Encrypt 证书时,一个常见的问题是如何保证证书的持续有效性。默认情况下,Let's Encrypt 的证书有效期为 90 天,所以为了确保你的服务不会因为证书过期而中断,最好的做法是自动续期。
6.1 为什么要自动续期?
手动续期证书不仅是一个繁琐的任务,而且还存在人为忘记的风险。如果证书过期,那么使用该证书的服务可能会被打断,导致用户体验下降,甚至可能影响到业务。通过设置自动续期,你可以确保网站和服务始终使用有效证书。
6.2 设置定时任务
Cron 是一种在 Linux 系统上运行定时任务的工具。我们可以利用它来自动运行 certbot renew
命令,确保证书始终保持最新。
首先,编辑 crontab:
sudo crontab -e
当你打开 crontab 时,可能会看到一些已经存在的任务。不要修改它们,而是在文件的末尾添加以下行,设置每天在凌晨 2 点自动尝试更新证书:
0 2 * * * /usr/bin/certbot renew --quiet
--quiet
选项意味着只有在发生错误或需要交互时,命令才会产生输出。这样,你就不会因为定期的续期尝试而收到不必要的通知。
6.3 测试证书续期
在设置定时任务之前,你应该首先测试续期过程是否可以正常工作。这可以确保当真正到达续期时,一切都会按预期进行。
使用以下命令进行测试:
sudo certbot renew --dry-run
--dry-run
选项将模拟续期过程,但不会实际更改任何证书。如果这个命令成功运行并没有报错,那么你可以确信真正的续期过程也会顺利进行。
7. 优化和安全增强
Web 安全在当今互联网时代是至关重要的。随着网络攻击手段的不断升级和多样化,保护网站免受潜在威胁是每个网站管理员和开发者的首要任务。以下是一些建议,可用于增强你的网站安全性。
7.1 使用 HTTPS 强制重定向
在今天,使用 HTTPS 不再是选择,而是必须。HTTPS 不仅保证数据在传输过程中的加密,还能确认网站的身份。
在 Nginx 中实现 HTTP 到 HTTPS 的强制重定向:
配置 Nginx
打开 Nginx 配置文件。这通常位于 /etc/nginx/nginx.conf
或 /etc/nginx/sites-available/your_domain_name
。在该文件中,你可能已经有一个监听端口 80(HTTP)的 server
块。在这里,你只需添加一个重定向到 HTTPS 的指令。
同时,确保你有一个监听端口 443(HTTPS)的 server
块,并配置了你的 SSL 证书。
以下是一个简化的示例:
# HTTP Server Block
server {
listen 80;
server_name yourdomain.com www.yourdomain.com;
# 强制重定向到 HTTPS
location / {
return 301 https://$host$request_uri;
}
}
# HTTPS Server Block
server {
listen 443 ssl;
server_name yourdomain.com www.yourdomain.com;
ssl_certificate /etc/nginx/ssl/your_domain_name.com.crt; # 你的证书路径
ssl_certificate_key /etc/nginx/ssl/your_domain_name.com.key; # 你的私钥路径
# 其他配置,如 location 块等...
}
重新加载或重启 Nginx
保存你的配置文件并检查其语法是否正确:
sudo nginx -t
如果一切正常,你将看到 syntax is okay
和 test is successful
的消息。然后重新加载 Nginx 以应用更改:
sudo systemctl reload nginx
以上就是在 Nginx 中配置 HTTP 到 HTTPS 的强制重定向的步骤。此外,为了提高安全性,建议深入研究并配置更高级的 SSL/TLS 设置和策略。
7.2 安装 ModSecurity 或其他 WAF
什么是WAF?
Web Application Firewall(WAF)是专为识别和阻止Web应用程序中的恶意流量而设计的。它工作在应用层,帮助保护你的网站免受SQL注入、跨站脚本和其他众多Web应用攻击。
为什么选择ModSecurity?
ModSecurity 是一个流行的开源 WAF,可以与Apache、Nginx和IIS等Web服务器无缝集成。除了提供基本的WAF功能,它还支持自定义规则集,使管理员可以根据自己的需求进行细致的配置。
当然,除了 ModSecurity,还有很多其他优秀的WAF解决方案,如 Cloudflare、AWS WAF 等。选择适合你的平台和需求的WAF是至关重要的。
8. 常见问题和故障排除
面对 Nginx 和 SSL 证书的问题时,有一系列的步骤和方法可以帮助我们解决这些问题。下面我们详细介绍如何排除一些常见的问题。
8.1 Nginx 无法启动
Nginx 是一个高性能、高并发的 HTTP 和反向代理服务器,但在配置或运行过程中可能会出现问题。以下是一些解决方法:
nginx -t
如果输出显示 "syntax is okay" 和 "test is successful",则说明配置文件没有问题。如果出现错误信息,根据提示进行相应的修改。
/var/log/nginx/error.log
来获得更多的错误详情。netstat
或 lsof
命令检查哪个进程占用了这些端口,并考虑停止或重新配置那些进程。8.2 证书更新失败
SSL/TLS 证书的续期是一个常见的操作,但有时可能会出现问题。以下是解决方法:
crontab -l
查看用户的 cron 任务。8.3 泛域名证书
泛域名证书(Wildcard certificate)可以保护域名及其所有子域名。续期时可能会遇到问题:
9. 最后
为了充分利用 Nginx 和 Let's Encrypt 的优势,强烈建议深入了解这两个工具。访问 Nginx 和 Let's Encrypt 的官方文档,以获取更多深入的信息和教程。此外,还有许多社区论坛和专家博客,提供了关于这两个工具的高级技巧和最佳实践。