• 文章列表
  • >
  • 正在阅读
  • Linux(Ubuntu) 安装 Nginx 及代理配置和 Let’s Encrypt 示例

    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 的自动更新工作正常。

    ©2024