到目前为止,我以一种相当简单的方式使用了 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 的期望行为:
我将非常感谢您的建议!
结果是什么
亲爱的先生们,这个项目是在一切顺利后添加的。我听从了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
好吧,总而言之 - 现在一切如何运作的正确图片(以免误导任何人):


默认情况下,该指令
server创建一个侦听端口 80 的配置。要指定服务器的端口,请使用指令listen。如果一个块中有server多个listen,则创建的服务器将侦听所有指定的端口。在你的情况下,我会做两个条目
server,一个 HTTP 用于 port80,一个 STREAM 用于 port443 ssl。为什么
stream要使用第 443 个端口。如果您为此端口创建一个简单的块server,那么您需要向它添加证书,正如您所写的那样,这些证书存储在 gitlab 中。因此,只需要在gitlab的外部端口和8443端口之间广播tcp流量即可。至少,它可能看起来像这样:使用此配置,所有流向端口 443 的流量都将重定向到地址为 192.168.0.10 的后端,端口为 8443。所有 TLS / SSL 处理都转移到后端。
但事实上,我会做不同的事情。我会将所有请求重定向到第 80 个端口到第 443 个端口,并将业务逻辑挂在安全端口上。也就是说,我会在 gitlab 使用 HTTPS 并且只保留 HTTP 的能力上打分。
我通常通过
certbot. 我将证书存储在输入服务器上,并且在边界内流量畅通无阻。仅供参考,在处理
proxy_pass指令的服务器中是index多余的,因为您将所有请求重定向到 gitlab。