Nginx 是全球使用最广泛的 web servers 之一,很多网站使用它作为 Web 服务器或反向代理来使用。
**本文的环境是 Ubuntu 22.04 和 Nginx 1.18.0 。**
1. 安装 Nginx
通过 apt 来安装 Nginx。
# 更新 apt 源
sudo apt update
# 开始安装 Nginx
sudo apt install nginx
在安装结束后,Ubuntu 会启动 Nginx ,可以通过通过以下命令来查看 Nginx 的服务状态来进行确认:
systemctl status nginx
在输出的信息中如果有看到 Active: active (running)
的字样就表示 Nginx 已经在运行了。
2. 开放端口
一般来说,Nginx 很多情况下都是作为反代来运行的,它一定会用到 80 和 443 端口。
通过 ufw 开打开这两个端口:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
检查和确认端口状态:
sudo ufw status
在输出的开放端口列表中应该能看到 80 和 443 端口,说明端口开放了。
这时候,通过其它计算机上的浏览器直接访问服务器的 ip 地址,应该就看到 Nginx 的欢迎页面了!
如果看不到 Nginx 的欢迎页面,那应该是 Nginx 没有权限访问 /var/www/ 目录的问题,调整一下权限即可。
3. 反代配置示例
3.1. 配置
这里假设的是:你在服务器本机上已经有了一个运行在 5005 端口上的 Web 应用程序。
先创建一个名为 test123.com 的 server ,这里以独立的配置文件为例,我们将在 /etc/nginx/sites-available/
目录下创建一个名为 test123.com
的 server 配置文件。
用 vim 来创建文件:
sudo vim /etc/nginx/sites-available/test123.com
粘贴如下内容:
server {
listen 80;
server_name test123.com;
location / {
proxy_pass http://127.0.0.1:5005;
# 其它代理配置
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
这个配置文件中的,会把 test123.com 的主机名请求转发到本机的 5005 端口上,这样就实现了基本的代理配置。
保存并退出。
然后将配置文件链接到 /etc/nginx/sites-enabled/
目录中:
sudo ln -s /etc/nginx/sites-available/test123.com /etc/nginx/sites-enabled/
这样,Nginx 才会加载该配置,因为 sites-available 中的配置文件代表的是可用的,而 sites-enabled 中的配置文件才是启用的。
测试验证配置:
sudo nginx -t
测试通过后,让 Nginx 重新加载配置:
sudo systemctl reload nginx
3.2. 测试
编辑 hosts 文件,将 测试服务器 的 IP 与 test123.com
绑定,之后就可以直接通过浏览器来访问 test123.com
了。
3.3. 隐藏 Nginx 版本号
Nginx 会在 http 头和出现错误页的时候会有醒目的版本号提示,为了隐私和安全,应该将其关闭。
打开配置文件:
sudo vim /etc/nginx/nginx.conf
确认在 http 区段中是否存在 server_tokens off;
的配置项:如果存在该配置项但是被注释掉了的,请取消注释,如果找不到该配置项则自行加上该配置项。
修改保存后测试配置是否正常:
sudo nginx -t
配置测试确认正常后让 Nginx 重新加载配置:
sudo systemctl reload nginx
之后在客户端看到的 http 响应头中就不会带有包含 nginx 信息的 server 段了。
4. Let’s Encrypt(配置https)
4.1. 安装 Certbot 和它的 Nginx 插件
sudo apt install certbot python3-certbot-nginx
4.2. 为指定主机(域)名获取证书
前提:需要在 Nginx 中已经配置好了对应的 server 块。
执行命令:
sudo certbot --nginx -d xxxxxxxxxx.com -d www.xxxxxxxxxx.com
输出(参考):
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address (used for urgent renewal and security notices)
(Enter 'c' to cancel): xxxxxxxx@gmail.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Please read the Terms of Service at
https://letsencrypt.org/documents/LE-SA-v1.4-April-3-2024.pdf. You must agree in
order to register with the ACME server. Do you agree?
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Would you be willing, once your first certificate is successfully issued, to
share your email address with the Electronic Frontier Foundation, a founding
partner of the Let's Encrypt project and the non-profit organization that
develops Certbot? We'd like to send you email about our work encrypting the web,
EFF news, campaigns, and ways to support digital freedom.
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
(Y)es/(N)o: y
Account registered.
Requesting a certificate for xxxxxxxxxx.com and www.xxxxxxxxxx.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/xxxxxxxxxx.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/xxxxxxxxxx.com/privkey.pem
This certificate expires on 2024-12-19.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for xxxxxxxxxx.com to /etc/nginx/sites-enabled/xxxxxxxxxx.com
Successfully deployed certificate for www.xxxxxxxxxx.com to /etc/nginx/sites-enabled/xxxxxxxxxx.com
Congratulations! You have successfully enabled HTTPS on https://xxxxxxxxxx.com and https://www.xxxxxxxxxx.com
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
If you like Certbot, please consider supporting our work by:
* Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
* Donating to EFF: https://eff.org/donate-le
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
到这里,就已经可以通过 https 来访问网站了。
4.3. 证书的自动续订
为了鼓励用户自动化他们的证书更新过程,Let’s Encrypt 的证书有效期只有九十天。 certbot 通过添加一个每天运行两次的 systemd 计时器来为我们处理这个问题,并自动更新任何在到期后 30 天内的证书。
可以使用以下命令查询计时器的状态systemctl:
sudo systemctl status certbot.timer
输出(参考):
● certbot.timer - Run certbot twice daily
Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
Active: active (waiting) since Fri 2024-09-20 14:32:29 CST; 18min ago
Trigger: Sat 2024-09-21 03:25:09 CST; 12h left
Triggers: ● certbot.service
Sep 20 14:32:29 vmi2154015.contaboserver.net systemd[1]: Started Run certbot twice daily.
用以下命令测试更新:
sudo certbot renew --dry-run
如果您没有看到任何错误,说明 certbot 的自动更新工作正常。