JAKE
Nginx(发音为“Engine-X”)已迅速成为全球最流行的 Web 服务器之一。人们之所以青睐它,是因为其速度快、资源占用低,并能同时处理多种任务,例如展示网站内容或将 Web 请求转发到其他服务器。
使用 Nginx 有许多优点:它在提供静态网页方面表现出色,同时也擅长将 Web 请求代理到后端服务器。此外,你可以通过灵活配置,使其完全满足你的网站或应用程序的具体需求。
然而,与所有在线工具一样,安全性至关重要。尽管 Nginx 在初始安装时已经相对安全,但始终建议进一步加强防护措施。在本指南中,我们将向你展示如何在 Ubuntu 系统上搭建一个安全且功能完整的 Nginx 服务器,用于托管你的网站和应用程序。
前提条件
首先,你需要准备一台服务器用于部署 Nginx。具体选择取决于你的实际需求:对于轻量级或简单场景,虚拟私有服务器(VPS)通常已足够;但如果你预计会有较大的访问负载,或对性能有更高要求,则建议选择专用服务器(Dedicated Server)。无论哪种选择,都必须确保你拥有完整的 root 权限,以便顺利安装和管理 Nginx。
在操作系统方面,Nginx 兼容多种系统,包括 Ubuntu、CentOS、Debian、Fedora、RHEL(Red Hat Enterprise Linux)、FreeBSD 和 OpenBSD。本指南将采用 Ubuntu 作为操作系统。Ubuntu 为 Nginx 提供了一个稳定、安全且支持良好的运行平台。
在 Ubuntu 上安装 Nginx
得益于 Ubuntu 强大的包管理器,Nginx 的安装过程非常简单。以下是详细步骤:
步骤 1:更新软件包列表
确保你的系统拥有最新的可用软件包及其版本列表,这有助于获取最新的软件和安全补丁。
sudo apt update
步骤 2:安装 Nginx
现在,使用 apt 包管理器安装 Nginx:
sudo apt install nginx
执行此命令后,系统可能会提示你确认是否继续安装(因为会占用额外磁盘空间)。按 Y 键,然后按 Enter 继续。
步骤 3:启动并启用 Nginx
安装完成后,启动 Nginx 服务,并设置为开机自启:
sudo systemctl start nginx
sudo systemctl enable nginx
步骤 4:验证 Nginx 安装
要确认 Nginx 是否正确安装,可检查其运行状态:
sudo systemctl status nginx
如果一切正常,输出应显示 Nginx 服务处于 active (running) 状态。你也可以通过浏览器访问服务器的 IP 地址进行验证:
http://your_server_ip_address
如果看到 Nginx 默认欢迎页面,说明服务器已成功安装并可正常访问。
步骤 5:配置防火墙
默认情况下,Ubuntu 的 UFW 防火墙会阻止大多数入站连接。为允许 HTTP(端口 80)和 HTTPS(端口 443)流量,请执行以下命令:
sudo ufw allow 'Nginx Full'
该命令将同时放行普通(HTTP)和加密(HTTPS)流量。
恭喜!至此,Nginx 已成功安装并在你的 Ubuntu 服务器上运行。
在 Ubuntu 上配置 Nginx
Nginx 安装完成后,下一步是进行配置。虽然 Nginx 开箱即用,但通过微调其设置,可以显著提升性能与安全性。如果你还不熟悉 Nginx 的配置流程,本节将为你提供全面解析。
理解配置结构
Nginx 与其他服务器软件类似,依赖配置文件来定义其行为。理解这些文件的层级结构和用途,是有效管理服务器的关键。所有配置文件均位于 /etc/nginx 目录下:
/etc/nginx/nginx.conf- 用途:这是 Nginx 的主配置文件,包含影响全局行为的指令,适用于服务器上托管的所有站点。
- 结构:文件内包含多个上下文(context),如
http、server和location。其中http控制通用 Web 服务器设置,而server和location通常用于特定站点或 URL 路径。 - 可定制性:虽然可以在此文件中直接修改,但建议将站点专属配置放在独立的 server block 文件中(见下文),以保持主配置文件简洁易读。
/etc/nginx/sites-available- 用途:此目录用于存放每个网站或 Web 应用的独立配置文件。这些文件代表潜在可托管的站点,但尚未被 Nginx 实际启用。
- 命名规范:通常建议以域名命名配置文件(如
example.com),便于管理多个站点。 - 灵活性:通过分离各站点配置,管理员可为不同站点应用不同的规则、优化策略和安全设置,实现精细化控制。
/etc/nginx/sites-enabled- 用途:该目录包含指向
sites-available中已启用站点配置的符号链接(symbolic links)。只有在此目录中的站点才会被 Nginx 实际提供服务。 - 符号链接机制:当你准备“上线”某个站点时,只需创建从
sites-available到sites-enabled的符号链接。这样可轻松启用或停用站点,而无需删除配置文件——只需添加或移除符号链接即可。 - 重要提示:切勿直接编辑
sites-enabled中的文件。由于它们是符号链接,修改会反映到sites-available的原始文件中。请始终在sites-available中编辑原始文件,然后测试并重载 Nginx 以应用更改。
- 用途:该目录包含指向
设置基本 Server Block(虚拟主机)
Nginx 的 server block 功能相当于 Apache 的虚拟主机(Virtual Host),允许你在单个 Nginx 实例上托管多个网站。通过为不同站点组织独立配置,server block 提供了精准的 Web 托管控制能力。以下是设置基本 server block 的步骤:
步骤 1:创建配置文件
首先,为你的网站创建一个配置文件:
sudo nano /etc/nginx/sites-available/mywebsite
nano 是一个终端文本编辑器。如不熟悉操作,可使用 CTRL + O 保存,CTRL + X 退出。
步骤 2:编写 Server Block 配置
在该文件中,输入以下配置:
server {
listen 80;
server_name mywebsite.com www.mywebsite.com;
root /var/www/mywebsite;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
listen 80;:指示 Nginx 监听 80 端口(HTTP 默认端口)的入站连接。server_name:指定此 server block 对应的域名。Nginx 将对mywebsite.com和www.mywebsite.com的请求使用此配置。root:指定网站文件在服务器上的存放目录。本例中为/var/www/mywebsite。index:定义当客户端请求目录时默认返回的文件。例如,访问http://mywebsite.com/时,Nginx 会尝试返回/var/www/mywebsite/index.html。location:用于对特定路径的请求应用更具体的规则。try_files $uri $uri/ =404;表示 Nginx 会先尝试将请求路径作为文件提供,再作为目录提供,若两者均不存在,则返回 404 错误。
步骤 3:激活 Server Block
配置文件创建后并不会自动生效。需通过创建符号链接将其激活:
sudo ln -s /etc/nginx/sites-available/mywebsite /etc/nginx/sites-enabled/
此操作相当于“发布”配置,使其可处理实际流量。
步骤 4:测试配置
在应用更改前,务必检查配置是否有语法错误:
sudo nginx -t
Nginx 会解析所有配置并返回反馈。若显示成功信息,说明配置无误。
步骤 5:重载 Nginx
Nginx 配置更改不会立即生效,需手动重载:
sudo systemctl reload nginx
该命令会平滑重载 Nginx,在不中断现有连接的情况下应用新配置。
步骤 6(可选):托管更多网站
想添加更多站点?流程完全一致。理论上,你可以在服务器性能允许范围内托管几乎无限数量的虚拟主机。对每个新站点:
- 在
sites-available中创建唯一配置文件; - 在
sites-enabled中创建符号链接; - 测试并重载 Nginx。
通过重复上述步骤,你可以轻松扩展 Nginx 以服务多个网站。
使用 Let's Encrypt 启用 SSL/TLS 加密
目前我们的网站通过 HTTP(端口 80)提供未加密内容。虽然这适用于开发和测试环境,但对于正式上线的网站而言并不符合安全标准。HTTP 传输的数据可能被窃听或篡改。因此,必须使用 HTTPS——HTTP 的安全版本,通过 SSL/TLS 实现数据加密传输。
虽然你可以购买第三方 SSL 证书,但 Let's Encrypt 是一个免费且安全的替代方案,适用于大多数网站。Let's Encrypt 是一个提供域名验证型 SSL 证书的免费项目,其优势包括:
- 免费:完全零成本。
- 自动化:简化证书申请与续期流程。
- 安全可靠:提供强安全性,且被主流浏览器广泛信任。
- 透明公开:所有证书均公开记录。
- 开源开放:欢迎社区贡献。
步骤 1:安装 Certbot
Certbot 可自动完成 Let's Encrypt 证书的申请、续期及 Web 服务器配置。
添加仓库并安装 Certbot:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx
步骤 2:生成并安装 SSL 证书
Certbot 不仅会获取证书,还会自动修改 Nginx 配置,添加监听 443 端口的 HTTPS server block:
sudo certbot --nginx -d yourdomain.com -d www.yourdomain.com
注意:请将
yourdomain.com替换为你的实际域名。执行后,Nginx 即可通过 HTTPS 提供服务。
步骤 3:配置自动续期
Let's Encrypt 证书有效期为 90 天,但建议每 60 天续期一次。Certbot 的 renew 命令会自动检查证书有效期并执行续期。
为确保证书及时更新,可配置定时任务(cron job):
sudo crontab -e
在文件末尾添加以下行,以每天凌晨 2 点检查续期:
0 2 * * * /usr/bin/certbot renew --quiet
该定时任务每日运行,若发现证书即将过期,Certbot 会自动续期,并触发 Nginx 重载以加载新证书。
加固 Nginx 安全配置
你的网站现已上线、运行,并启用了加密。但安全永无止境。以下是一些高级设置,可进一步增强 Nginx 的安全性。
禁用服务器令牌(Server Tokens)
默认情况下,Nginx 会在错误页面和响应头的 Server 字段中显示其版本号。这可能带来安全风险,因为攻击者可利用特定版本的已知漏洞。
编辑主配置文件:
sudo nano /etc/nginx/nginx.conf
在 http 块中添加或修改以下行:
server_tokens off;
保存并关闭文件,然后重载 Nginx:
sudo systemctl reload nginx
配置强 SSL 策略
强 SSL 策略确保服务器仅使用最安全、现代的加密协议和密码套件。在 nginx.conf 中添加或修改以下行(保留这些即可):
ssl_protocols TLSv1.2 TLSv1.3;
保存、退出并重载 Nginx。
启用 HTTP 严格传输安全(HSTS)
HSTS(HTTP Strict Transport Security)是一种安全机制,强制浏览器仅通过 HTTPS 与服务器通信,永不回退到不安全的 HTTP。这能有效防范中间人攻击(MITM)和 Cookie 劫持。
在你的 server block 中添加:
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
保存、退出并重载 Nginx。
为特定目录启用密码认证
为保护网站敏感区域(如管理后台),可使用 Nginx 内置功能要求用户名和密码。首先,使用 OpenSSL 创建密码文件:
sudo sh -c "echo -n 'username:' >> /etc/nginx/.htpasswd"
注意:将
username替换为你想要的用户名。
然后使用 OpenSSL 生成密码并追加到文件:
sudo sh -c "openssl passwd -apr1 >> /etc/nginx/.htpasswd"
系统会提示你输入并确认密码。
在 Nginx 配置中,于你想保护的 location 块内添加:
auth_basic "Restricted Access";
auth_basic_user_file /etc/nginx/.htpasswd;
保存配置,退出并重载 Nginx:
sudo systemctl reload nginx
Nginx 限速(Rate Limiting)
限速是一种服务器保护机制,类似于保安控制进入大楼的人数。它限制用户在设定时间内的请求次数,防止单个用户或恶意机器人通过大量请求压垮服务器。这有助于抵御 DDoS 攻击,确保真实用户能正常访问。
编辑主配置文件:
sudo nano /etc/nginx/nginx.conf
在 http 块中定义限速规则,例如:
limit_req_zone $binary_remote_addr zone=mylimit:10m rate=10r/s;
说明:
$binary_remote_addr:表示用户 IP 地址。zone=mylimit:10m:分配名为 “mylimit” 的 10MB 共享内存,可存储约 16 万个 IP 地址的信息。rate=10r/s:限制每个 IP 每秒最多 10 个请求。
然后,在 sites-available 中的站点配置文件里,将限速应用到 server 或 location 块:
limit_req zone=mylimit burst=20 nodelay;
保存、退出并重载 Nginx。
为 Nginx 配置 Fail2Ban
Fail2Ban 是一款实时监控服务器日志的安全工具。当检测到可疑行为(如多次登录失败或疑似攻击模式),它会立即“封禁”相关 IP 地址,暂时阻止其访问。这既能防止未授权访问,也能抵御流量洪泛攻击。
安装 Fail2Ban:
sudo apt install fail2ban
复制默认配置:
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
编辑 jail.local 文件,添加针对 Nginx 的规则。具体配置可参考社区提供的成熟方案。
保存、退出并重启 Fail2Ban:
sudo systemctl restart fail2ban
设置开机自启:
sudo systemctl enable fail2ban
Nginx 性能优化
在 Web 内容交付中,每一毫秒都至关重要。页面加载缓慢会劝退用户、提高跳出率,并损害网站声誉。当今用户期望网站快速、流畅地加载。优化性能不仅提升用户体验,也有助于搜索引擎排名。以下是提升 Nginx 性能的关键技巧。
启用 Gzip 压缩
Gzip 是一种广泛使用的 Web 内容压缩技术,其优势包括:
- 减少数据传输量:压缩后传输的数据更少,加快速度并节省带宽(尤其在按流量计费时可降低成本)。
- 加速页面加载:压缩文件体积更小,客户端下载更快,用户体验更流畅。
编辑主配置文件:
sudo nano /etc/nginx/nginx.conf
在 http 块中添加以下 Gzip 配置:
gzip on; # 启用 gzip 压缩
gzip_disable "msie6"; # 禁用 IE6 的 gzip(因其存在兼容问题)
gzip_vary on; # 允许代理缓存 gzip 和非 gzip 版本
gzip_proxied any; # 即使是代理请求也压缩
gzip_comp_level 6; # 压缩级别(1 最低,9 最高)
gzip_buffers 16 8k; # 为压缩分配的内存缓冲区
gzip_http_version 1.1; # 仅对 HTTP/1.1 及以上版本请求压缩
gzip_types
text/plain
text/css
application/json
application/javascript
text/xml
application/xml
application/xml+rss
text/javascript; # 指定需压缩的 MIME 类型
保存配置并重载 Nginx:
sudo systemctl reload nginx
静态文件缓存
网页通常包含图片、CSS、JS 等静态资源。若这些资源被浏览器缓存,后续访问可直接从本地加载,无需重新下载。这既加快了页面加载速度,又减轻了服务器负担。
编辑你的站点配置:
sudo nano /etc/nginx/sites-available/mywebsite
在专门处理静态资源的 location 块中添加:
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
expires 30d; # 指示浏览器缓存这些文件 30 天
add_header Cache-Control "public, no-transform"; # 补充缓存控制头
}
保存修改并重载 Nginx:
sudo systemctl reload nginx
保持安全与更新:总结
你已学习了大量关于 Nginx 安装与调优的知识。但请记住,部署完成并非终点。如同任何工具,Nginx 也需要定期维护。我们不仅讲解了如何让 Nginx 运行起来,更重要的是如何使其安全可靠。在当今网络环境中,安全是网站的基本要求。遵循本指南的步骤,你已为网站及其访客提供了坚实保障。
同时,软件持续演进,新功能和安全补丁不断发布。因此,请定期访问 Nginx 官方网站,了解最新动态。
总而言之:保持服务器安全,紧跟更新节奏。你的网站和用户都会感谢你。