RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1397211
Accepted
S.H.
S.H.
Asked:2022-09-05 18:42:18 +0000 UTC2022-09-05 18:42:18 +0000 UTC 2022-09-05 18:42:18 +0000 UTC

nginx:如何使用 proxy_pass 转发 80 和 443 端口?

  • 772

到目前为止,我以一种相当简单的方式使用了 nginx:http/https 调用“登陆”它,它作为 certbot 运行和更新letsencrypt的“基础”——不同域的证书。通常,静态站点使用nginx托管在服务器本身上,对于那些提供api的站点,在nginx通过http之后工作,即nginx作为ssl-termination工作。也就是说,“从互联网我们通过https访问,在网络内部我们使用http”——每个人都很高兴。

但有那么一刻,我“想要一些奇怪的东西”。即 gitlab 出现在网络内部。

Gitlab 是一个非常独立的东西,它托管https 证书。也就是说,如果我现在有来自外部的 gitlab 名称呼叫 - 那么我需要 https - 请求将在网络内部转发。

同时我可以在gitlab上自己配置http/https端口,不过现在设置为8080和8443。

我阅读了有关 proxy_ssl_server_name 指令的各种提示,但似乎没有一个适合我。在 nginx 级别使用 ssl-termination 的旧方法也不适合我。

典型的 proxy_pass 文件如下所示:

    server {

        root /var/www/<folder_of_site>;

        index index.html index.htm index.nginx-debian.html;

        server_name mygitlab.myserver.ru www.mygitlab.myserver.ru;
        client_max_body_size 2048m;

        location / {
              proxy_redirect          http://192.168.0.10:8080 /; 
              proxy_pass_header       Server;
              proxy_set_header        X-Real-IP $remote_addr;
              proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
              proxy_set_header        X-Scheme $scheme;
              proxy_set_header        Host $http_host;
              proxy_set_header        X-NginX-Proxy true;
              proxy_connect_timeout   5;
              proxy_read_timeout      240;
              proxy_intercept_errors  on;

              proxy_pass              http://192.168.0.10:8080;
        }
    }

请注意:连接从第 80 个端口传输的任何地方都没有写,显然这是默认行为。现在,如果我location可以在指令中指定端口——我只需将包含指令的文件重复两次proхy_...——显然我会得到想要的结果。

我将用这张图片来说明 nginx 的期望行为:

nginx 和 gitlab

我将非常感谢您的建议!

结果是什么

亲爱的先生们,这个项目是在一切顺利后添加的。我听从了Pak Uula的建议,并在他的回答中做了他所谓的“正确”:现在我让 nginx 进行 ssl 终止,而 Gitlab“正常工作”。事实证明,在 gitlab 中禁用 https 不需要额外的努力,手册上说“默认情况下,Omnibus GitLab 不使用 HTTPS”。

因此,一切都对我有用。对于那些将阅读这篇文章的人,我会再写一点:

第 0 步:在带有地址的打字机上的 DMZ 中192.168.0.10,我使用如下命令在容器中启动 gitlab

sudo docker run --detach \
  --hostname docker.junecat.ru \
  --publish 8443:443 --publish 8080:80 --publish 1022:22 \
  --name gitlab1 \
  --restart always \
  --volume $GITLAB_HOME/config:/etc/gitlab \
  --volume $GITLAB_HOME/logs:/var/log/gitlab \
  --volume $GITLAB_HOME/data:/var/opt/gitlab \
  --shm-size 256m \
  gitlab/gitlab-ce:latest

第一步:我为 nginx 创建一个文件,/etc/nginx/sites-available/docker.junecat.ru内容如下:

server {

  listen 80;
  listen [::]:80;

  root /var/www/docker.junecat.ru/;

  index index.html index.htm;

  server_name docker.junecat.ru www.docker.junecat.ru;

  location / {
          proxy_redirect          http://192.168.0.10:8080/  /;
          proxy_pass_header       Server;
          proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header        X-Scheme $scheme;
          proxy_set_header        X-NginX-Proxy true;
          proxy_connect_timeout   5;
          proxy_read_timeout      240;
          proxy_intercept_errors  on;

          proxy_pass              http://192.168.0.10:8080/;
          proxy_set_header Host $host;
          proxy_set_header X-Real-IP $remote_addr;
  }
}

注意命令

    sudo ln -s /etc/nginx/sites-available/docker.junecat.ru /etc/nginx/sites-enabled/

早已经完成了,而且该站点不仅处于“可用”状态,而且处于“允许”状态。

如您所见,还没有https证书。他们将出现在

第二步:告诉 sertbot 获取证书并根据它们修复 nginx 文件:

    sudo certbot --nginx -d docker.junecat.ru -d www.docker.junecat.ru

好吧,总而言之 - 现在一切如何运作的正确图片(以免误导任何人):

它是如何工作的

linux
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Pak Uula
    2022-09-06T15:03:51Z2022-09-06T15:03:51Z

    默认情况下,该指令server创建一个侦听端口 80 的配置。要指定服务器的端口,请使用指令listen。如果一个块中有server多个listen,则创建的服务器将侦听所有指定的端口。

    在你的情况下,我会做两个条目server,一个 HTTP 用于 port 80,一个 STREAM 用于 port 443 ssl。

    为什么stream要使用第 443 个端口。如果您为此端口创建一个简单的块server,那么您需要向它添加证书,正如您所写的那样,这些证书存储在 gitlab 中。因此,只需要在gitlab的外部端口和8443端口之间广播tcp流量即可。至少,它可能看起来像这样:

    stream {
        # ...
        server {
            listen     0.0.0.0:443;
            proxy_pass 192.168.0.10:8443;
        }
    }
    

    使用此配置,所有流向端口 443 的流量都将重定向到地址为 192.168.0.10 的后端,端口为 8443。所有 TLS / SSL 处理都转移到后端。

    但事实上,我会做不同的事情。我会将所有请求重定向到第 80 个端口到第 443 个端口,并将业务逻辑挂在安全端口上。也就是说,我会在 gitlab 使用 HTTPS 并且只保留 HTTP 的能力上打分。

    1. 将所有请求(无论名称如何)重定向到安全端口
    server {
            listen 80 default_server;
    
            server_name _;
            return 301 https://$host$request_uri;
    }
    
    1. 安全端口上的代理(最低配置)
    server {
            listen 443 ssl;
    
            server_name mygitlab.myserver.ru www.mygitlab.myserver.ru;
            location / {
                    proxy_pass http://192.168.0.10:8080;
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
            }
        ssl_certificate /etc/letsencrypt/live/<server name>/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/<server name>/privkey.pem; # managed by Certbot
    }
    

    我通常通过certbot. 我将证书存储在输入服务器上,并且在边界内流量畅通无阻。

    仅供参考,在处理proxy_pass指令的服务器中是index多余的,因为您将所有请求重定向到 gitlab。

    • 2

相关问题

  • 如果 fuser -k number/tcp 没有帮助,如何在 Debian 中释放端口?

  • Ubuntu。startx 不起作用。黑屏

  • --syn 在 iptables 中有什么作用?

  • 为什么需要iso格式?

  • C程序中没有密码的sudo

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5