【问题标题】:Gitlab Omnibus: how to rewrite URLs with bundled nginxGitlab Omnibus:如何使用捆绑的 nginx 重写 URL
【发布时间】:2018-09-27 10:11:44
【问题描述】:

当前配置

我将 GitLab 迁移到了新服务器。作为迁移的一部分,一些存储库进行了重组。我们有一个网站直接链接到 GitLab 上的 rawblob 文件。对于这些 rawblob 文件,我想将所有 HTTPS 请求从旧 URL 重定向到新 URL。

我使用 Gitlab Omnibus 包,附带捆绑的 nginx 安装。我基于对这个问题的公认答案:Gitlab Omnibus: how to redirect all requests to another domain,这又是指官方 GitLab 文档:https://docs.gitlab.com/omnibus/settings/nginx.html#inserting-custom-settings-into-the-nginx-config

  1. 创建 nginx 配置目录,因为它还不存在:

    sudo mkdir -p /etc/nginx/conf.d/

  2. 创建/etc/nginx/conf.d/redirect.conf:

.

server {
  server_name gitlab.itextsupport.com;
  rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
}
  1. 编辑/etc/gitlab/gitlab.rb的配置文件,添加以下行:

    nginx['custom_nginx_config'] = "include /etc/nginx/conf.d/redirect.conf;"

  2. 重写nginx配置:

    sudo gitlab-ctl reconfigure

  3. 重启捆绑的nginx:

    sudo gitlab-ctl restart nginx

  4. 验证捆绑的 nginx 是否包含重定向文件:

    sudo grep 'redirect.conf' /var/opt/gitlab/nginx/conf/nginx.conf

测试配置

curl -I https://gitlab.itextsupport.com/itext/tutorial/blob/master/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java

预期结果

/samples/blob/master 之后插入。我希望看到 https://gitlab.itextsupport.com/itext/tutorial/blob/master/samples/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java 的 301 重写

实际结果

200 OK 在未修改的 URL 上。

丑陋的黑客

将此行添加到/var/opt/gitlab/nginx/conf/gitlab-http.conf 并重新启动捆绑的nginx:

rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;

通过这种方式,我已经验证了我的实际重写规则本身是正确的。

缺点:每次运行gitlab-ctl reconfigure 都会丢失此行。

问题

我需要进行哪些更改才能使 URL 重写按预期工作?没有丑陋的黑客?

其他信息

当我运行sudo /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx -T 时,我看到两个server { } 块。到目前为止,我的工作理论是 nginx 只拾取第一个服务器块,而忽略第二个。如果我能找到一种方法以与配置文件/etc/gitlab/gitlab.rb 兼容的方式合并两个服务器块,那么我的问题很可能会得到解决。

【问题讨论】:

    标签: redirect nginx gitlab gitlab-omnibus


    【解决方案1】:

    嗯,看起来答案在gitlab.rb 中盯着我看。在nginx['custom_nginx_config'] 上面一行,有nginx['custom_gitlab_server_config']。我将 include 语句放在那里,并删除了重写规则周围的 server {} 括号。这也在https://docs.gitlab.com/omnibus/settings/nginx.html#inserting-custom-nginx-settings-into-the-gitlab-server-block 的 GitLab 文档中进行了描述:

    这会将定义的字符串插入到/var/opt/gitlab/nginx/conf/gitlab-http.conf的服务器块的末尾。

    这就是我所做的:

    1. /etc/gitlab/gitlab.rb 中,注释掉nginx['custom_nginx_config'] 行并添加:

      nginx['custom_gitlab_server_config'] = "include /etc/nginx/conf.d/redirect.conf;"

    2. /etc/nginx/conf.d/redirect.conf,只保留rewrite行自己:

      rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;

    3. 重新配置 GitLab:

      sudo gitlab-ctl reconfigure

    4. 重启nginx:

      sudo gitlab-ctl restart nginx

    5. 验证nginx配置:

      sudo /opt/gitlab/embedded/sbin/nginx -p /var/opt/gitlab/nginx -T | tail -n 20

    .

    nginx: the configuration file /var/opt/gitlab/nginx/conf/nginx.conf syntax is ok
    nginx: configuration file /var/opt/gitlab/nginx/conf/nginx.conf test is successful
    
      include /etc/nginx/conf.d/redirect.conf;
    }
    
    # configuration file /etc/nginx/conf.d/redirect.conf:
    rewrite ^\/itext7\/samples\/(blob|raw)\/master\/(?!samples\/)(.*)$ https://$server_name/itext7/samples/$1/master/samples/$2 permanent;
    
    # configuration file /var/opt/gitlab/nginx/conf/nginx-status.conf:
    server  {
        listen 127.0.0.1:8060;
        server_name localhost;
        location /nginx_status {
          stub_status on;
          server_tokens off;
          access_log off;
          allow 127.0.0.1;
          deny all;
        }
    }
    
    1. 验证 URL 重写:

      curl -I https://gitlab.itextsupport.com/itext/tutorial/blob/master/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java

    .

    HTTP/1.1 301 Moved Permanently
    Server: nginx
    Date: Thu, 27 Sep 2018 11:32:23 GMT
    Content-Type: text/html
    Content-Length: 178
    Connection: keep-alive
    Location: https://gitlab.itextsupport.com/itext/tutorial/blob/master/samples/signatures/src/main/java/signatures/chapter4/C4_05_SignWithBEID.java
    Strict-Transport-Security: max-age=31536000
    

    有一件事我仍然很好奇:

    • rewrite 行结束于 server{} 块之外。
    • rewrite 行使用$server_name 变量。
    • $server_name 变量定义在内部 server{} 块中。

    这是因为nginx -T 显示包含语句的奇怪方式而在视觉上令人困惑吗? rewrite 行真的 inside server{} 块,即使它看起来是 outside?为什么事情往往不像看起来那样,为什么 GitLab 文档是用封闭的语言编写的?唉,这些思考可能永远没有答案。

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 1970-01-01
      • 2016-09-26
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-26
      相关资源
      最近更新 更多