0%

折腾云服务器(Ubuntu)之nginx反向代理篇

使用工具

  • certbot
  • nginx
  • 一台 Ubuntu 22 云服务器
  • 若干域名
  • Cloudflare

操作步骤

  1. 购买域名
  2. 把域名托管到你喜欢的平台下 这里采用 Cloudflare 进行,转移托管权限自行参考 Cloudflare 给出的解决方法
  3. 在 Cloudflare 的域名管理下进入 DNS-记录 部分
  4. 使用 A记录 指向你的服务器ip地址 这样可以实现一个域名的多次到等于的无限域名的利用

    例如我在服务器部署好了一个A服务,此时我可以用 A记录
    A a-service ip_address (记得关闭 Cloudflare 提供的 DNS 代理服务,这个是付费的)
    此时可以访问 a-service.domain-name 这串地址访问到我们想要在服务器实现服务的入口了

  5. 回到自己的服务器上,部署 nginx
    1
    apt install nginx
  6. 再使用 systemctl 启动 nginx 服务,并设置为开机自启
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    systemctl start nginx
    systemctl enable nginx

    #一些其他的 systemctl 命令
    # 停止服务
    sudo systemctl stop [服务名]

    # 重启服务
    sudo systemctl restart [服务名]

    # 重新加载配置(不重启服务)
    sudo systemctl reload [服务名]
  7. 此时我们可以回去开始配置 nginx 的反向代理了

    首先我们要来学习一下软连接
    为了不破坏默认的软件配置环境,我们会希望柔和的方式来修改软件的配置,所以我们需要通过软连接的操作去映射文件
    nginx 提供了两个文件夹来配置: /etc/nginx/sites-available/ 与 /etc/nginx/sites-enabled/
    前者是用来存放可选列表,后者存放启用的规则

  8. /etc/nginx/sites-available/ 中创建一个适当名字后最为 .conf 的文件,按照以下规则编写配置
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    server {
    listen 443 ssl;
    server_name a-service.domain-name;

    ssl_certificate /etc/letsencrypt/live/a-service.domain-name/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/a-service.domain-name/privkey.pem;
    include /etc/letsencrypt/options-ssl-nginx.conf;
    ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem;

    location / {
    proxy_pass http://127.0.0.1:port;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_http_version 1.1;
    proxy_set_header Connection "";
    }
    }

    server {
    listen 80;
    server_name a-service.domain-name;
    return 301 https://$host$request_uri;
    }
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    # 让我们来解析一下上面这一段
    # 从第21行的server{} 的作用是:监听80端口、定义通过a-service.domain-name访问(访问这个域名时,nginx才会匹配到这一段server下的配置)、返回一个状态码和请求想要https下的url地址

    # 回到第2-3行:监听443端口、定义通过a-service.domain-name访问

    # 目前第5-8行是没有的,可以先不写着,这些是用于 SSL 认证的部分

    # 第10-17行:
    # localtion / 这里定义访问这个域名的根目录下才会触发这部分的版块
    # proxy_pass http://127.0.0.1:port; 这里定义将会重定向(代理)到本地的一个端口(port)下
    # proxy_set_header Host $host; 保留原始的host请求头
    # proxy_set_header X-Real-IP $remote_addr; 将客户端真实 IP 转发给后端
    # proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 保存经过代理的客户端 IP 链
    # proxy_set_header X-Forwarded-Proto $scheme; 告诉后端请求是 HTTP 还是 HTTPS
    # proxy_http_version 1.1; 某些方法(如 PROPFIND、PUT、DELETE)需要 HTTP/1.1 才支持持久连接。所以,如果你需要这个服务长久的提供增删改服务,那就配置上这个
    # proxy_set_header Connection ""; 防止 Nginx 自动添加 Connection: close,保持 WebDAV 请求的长连接
  9. 此时你按照上面的配置完成之后可以使用 nginx 提供的语法检查 nginx -t。成功了就开始软路由链接文件到对应的地址下
    1
    sudo ln -s /etc/nginx/sites-available/service.conf /etc/nginx/sites-enabled/service.conf
  10. 重启 nginx systemctl restart nginx
  11. 此时可以在公网中访问你想要的服务地址 a-service.domain-name,但你很可能是会链接不进去,被报告说该网站不安全,因此我们接下来要接着解决网站不安全的问题
  12. 网站因为没有 SSL 证书,所以无法被标识为安全的网站。我们需要使用 certbot 来自动获取证书
    1
    2
    3
    4
    # 安装 certbot
    apt install certbot
    # 使用 certbot 自动申请你想要的域名的 SSL 证书
    certbot --nginx -d a-service.domain-name
  13. 运行完成之后你的 service.conf 里面大概率会多出在上面配置中的第5-8行的配置。如果没有的话,就把在终端输出的文件路径按照上面的配置来填写内容
  14. 然后再检查 nginx 的语法 nginx -t,成功后重启 nginx 服务 systemctl restart nginx
  15. 此时可以成功访问我们想要拿到的服务内容了

后记

买了个在美国的云服务器之后可以折腾好多东西,很好玩。(主要是个公网ip)
我利用了这个云服务器搭配 Cloudflare Pages/Worker(部署Telegraph-Image )、Telegram、使用我的云服务器反代,实现在中国大陆可以不使用代理翻墙也能上传/预览我在 Telegram 的图片
博客写到这里发现我服务又挂了 UTC+8 2025.08.27 01:09

不对!没挂!是我图片太大导致的没法上传 UTC+8 2025.08.27 01:12
image