如何在 Ubuntu 22.04 上安装和配置 Nginx 和 Let's Encrypt

1,082 阅读14分钟

1. 引言

1.1 Nginx 和 Let's Encrypt 的简介

Nginx:

Nginx (发音为 "Engine-X") 是一个开源的高性能 Web 服务器软件,自从其首次发布以来,由于其稳定性、丰富的功能集和低资源消耗,已经成为了许多高流量网站的首选。除了作为 Web 服务器外,Nginx 也广泛应用于以下场景:

  1. 反向代理: 当用户发送请求到服务器时,Nginx 可以将这些请求转发到其他服务器,然后再将结果返回给用户。这样的做法可以用来优化服务器性能、增强安全性或者作为负载均衡。
  2. 负载均衡器: 在多服务器环境中,Nginx 可以根据各种算法分发用户的请求,以确保每台服务器都得到均衡的负载。这样可以保证资源的有效利用和增强网站的可用性。
  3. 邮件代理服务器: Nginx 还可以处理 IMAP、POP3 和 SMTP 协议的邮件请求。
  4. 静态内容缓存: 对于不经常变化的内容,Nginx 可以缓存其输出,从而加快响应速度并减少服务器的负载。

Nginx 之所以如此受欢迎,不仅仅是因为它的功能性,而且因为它的架构设计,能够很好地处理数万到数十万的并发连接,而不会增加明显的资源消耗。

Let's Encrypt:

Let's Encrypt 是一个开放和自动化的证书颁发机构 (CA) ,其主要目标是创建一个更加安全和隐私保护的网络。它提供免费的 SSL/TLS 证书,使得加密通讯变得既简单又无成本。

几个突出特点如下:

  1. 免费: Let's Encrypt 的使命是推进网络的安全性,因此它为所有用户免费提供证书。
  2. 自动化: 使用 Let's Encrypt 提供的工具,如 Certbot,用户可以轻松地自动获取和续订证书。
  3. 透明: 所有颁发或撤销的证书都会公开记录,任何人都可以查询。
  4. 开放: Let's Encrypt 的设计和实现都是公开的,它受到了许多组织的支持和捐赠。
  5. 跨平台: Let's Encrypt 可以与大多数现代的 Web 服务器和操作系统无缝集成。

借助 Nginx 和 Let's Encrypt,用户可以轻松地搭建高性能、安全、并且受到加密保护的网站。

1.2 Ubuntu 22.04 的概述

Ubuntu 22.04 LTS (Long Term Support) 是 Ubuntu 操作系统的一个版本,它为用户提供了长达五年的安全更新和修复。这个版本是为了满足企业用户和其他需要长期稳定运行环境的用户的需求而设计的。它具有许多重要的功能和改进,可以帮助用户更高效、更安全地管理和运行他们的服务器和网络应用程序。

  1. 安全更新: Ubuntu 22.04 LTS 提供了长达五年的安全更新,确保系统在长期内保持安全可靠。这对于运行关键应用程序和服务的企业用户来说非常重要。
  2. 系统性能: Ubuntu 22.04 LTS 通过优化内核和系统服务来提供更好的性能和响应速度,从而确保服务器能够快速、高效地运行。
  3. 容器化和虚拟化: Ubuntu 22.04 LTS 提供了强大的容器和虚拟化支持,包括对 Docker 和 Kubernetes 的支持。这使得用户能够轻松地部署和管理容器化应用程序和服务。
  4. 网络管理: Ubuntu 22.04 LTS 提供了改进的网络管理和配置工具,帮助用户简化网络设置和故障排除。
  5. 软件包管理: Ubuntu 22.04 LTS 通过其强大的软件包管理系统,提供了大量的软件和工具,以帮助用户轻松地安装、更新和管理服务器软件。
  6. 硬件支持: Ubuntu 22.04 LTS 提供了广泛的硬件支持,确保与各种服务器硬件和网络设备的良好兼容性。
  7. 社区支持: Ubuntu 22.04 LTS 有着强大的社区支持,用户可以通过社区获得技术帮助和资源。
  8. 云服务和云原生支持: Ubuntu 22.04 LTS 也为云服务和云原生应用提供了强大的支持,使得它成为运行在公有云、私有云和混合云环境中的理想选择。

通过这些功能和改进,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 文件作为其默认配置文件。

  1. 使用 nano 编辑器打开默认的虚拟主机文件:
 sudo nano /etc/nginx/sites-available/default
  1. 在文件中,你可以看到一个类似这样的配置块:
 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: 匹配特定请求的指令块。
  1. 根据你的需要修改相应的配置项。例如,你可以更改 root 路径或添加其他域名到 server_name
  2. 保存并退出 nano 编辑器。
  3. 为确保配置没有语法错误,使用以下命令检查:
 sudo nginx -t
  1. 如果没有任何错误,重启 Nginx 以使更改生效:
 sudo systemctl restart nginx

3.2 配置防火墙规则

为了确保外部用户可以访问通过 Nginx 托管的网站,你可能需要更新防火墙规则。

  1. 允许 Nginx 的完整流量通过防火墙:
 sudo ufw allow 'Nginx Full'
  1. 为了查看当前的防火墙状态和规则,请运行:
 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 okaytest 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 和反向代理服务器,但在配置或运行过程中可能会出现问题。以下是一些解决方法:

  1. 检查配置文件的语法错误: 每次修改 Nginx 的配置文件后,建议先检查其语法是否正确。使用以下命令来检查:
 nginx -t

如果输出显示 "syntax is okay" 和 "test is successful",则说明配置文件没有问题。如果出现错误信息,根据提示进行相应的修改。

  1. 查看错误日志: Nginx 的错误日志通常提供有关问题的详细信息。你可以查看 /var/log/nginx/error.log 来获得更多的错误详情。
  2. 确保端口未被占用: 如果 Nginx 提示 80 或 443 端口已经被占用,可以使用 netstatlsof 命令检查哪个进程占用了这些端口,并考虑停止或重新配置那些进程。

8.2 证书更新失败

SSL/TLS 证书的续期是一个常见的操作,但有时可能会出现问题。以下是解决方法:

  1. 检查 cron 任务: 确保你的 cron 任务设置正确并正在运行。可以使用 crontab -l 查看用户的 cron 任务。
  2. 检查日志: 查看 Certbot 或其他证书续期工具的日志,找出可能的错误信息。
  3. 手动续期: 尝试手动运行 Certbot 或其他工具来续期证书,并观察其输出,这样可以更直观地了解问题所在。

8.3 泛域名证书

泛域名证书(Wildcard certificate)可以保护域名及其所有子域名。续期时可能会遇到问题:

  1. 确保 DNS 记录仍然有效: 泛域名证书通常需要通过 DNS 验证来续期。确保你的 DNS 记录(如 CNAME 或 TXT 记录)仍然有效。
  2. 检查权限: 确保你有修改 DNS 记录的权限。如果你使用的是第三方的 DNS 服务,可能需要登录到那里进行操作。
  3. 手动验证: 在某些情况下,你可能需要手动添加或修改 DNS 记录来完成验证。根据证书提供商的提示进行操作。

9. 最后

为了充分利用 Nginx 和 Let's Encrypt 的优势,强烈建议深入了解这两个工具。访问 Nginx 和 Let's Encrypt 的官方文档,以获取更多深入的信息和教程。此外,还有许多社区论坛和专家博客,提供了关于这两个工具的高级技巧和最佳实践。