- 特定服务 NGINX 配置
- 启用 HTTPS
- 更改默认的 proxy headers
- 配置极狐GitLab 信任的代理以及 NGINX
real_ip
模块 - 配置 PROXY 协议
- 使用非捆绑的网络服务器
- NGINX 配置选项
- 在 NGINX 配置中插入自定义设置
- 自定义错误页面
- 使用已有的 Passenger 和 NGINX 安装
- 配置 NGINX 状态监控
- 模板
NGINX 配置
此页面为管理员和 DevOps 工程师提供为极狐GitLab 安装配置 NGINX 的配置信息和方法。它包括针对捆绑的 NGINX(Linux 软件包)、Helm charts 或自定义设置的性能优化和特定于安全性的基本指导。
特定服务 NGINX 配置
如果要为不同服务配置 NGINX 配置,编辑 gitlab.rb
文件即可。
使用 nginx['<some setting>']
键可以对极狐GitLab Rails 应用进行配置。其它服务也有类似的键,例如 pages_nginx
、mattermost_nginx
和 registry_nginx
。所有 nginx
的可用配置也同样适用于这些服务的 <service_nginx>
配置,并且与极狐GitLab NGINX 使用相同的默认值。
如果要为一些独立服(诸如 Mattermost)配置 NGINX,使用 gitlab_rails['enable'] = false
而非 nginx['enable'] = false
。更多信息,可以查看为极狐GitLab Mattermost 运行独立的服务。
修改 gitlab.rb
时,用户需要为每个服务分别进行 NGINX 配置。nginx['foo']
的配置不会复制到服务特定的 NGINX 配置(例如 registry_nginx['foo']
或 mattermost_nginx['foo']
等等)。例如,要为极狐GitLab、Mattermost 和 Registry 配置 HTTP 到 HTTPS 的重定向,以下配置应添加到 gitlab.rb
。
nginx['redirect_http_to_https'] = true
registry_nginx['redirect_http_to_https'] = true
mattermost_nginx['redirect_http_to_https'] = true
启用 HTTPS
默认情况下,Linux 软件包安装不使用 HTTPS。如果您想为 gitlab.example.com
启用 HTTPS,有以下两个选项。
更改默认的 proxy headers
默认情况下,当您指定了 external_url
,Linux 软件包安装在大多数环境中设置了一些合理的 NGINX proxy headers。
例如,当您在 external_url
中指定了 https
格式,则 Linux 安装包的设置如下:
"X-Forwarded-Proto" => "https",
"X-Forwarded-Ssl" => "on"
然而,如果您的实例位于更复杂的设置之中,例如在反向代理之后,您需要调整 proxy headers 来避免如下错误:
The change you wanted was rejected
Can't verify CSRF token authenticity Completed 422 Unprocessable
如果要覆盖默认 headrs:
-
编辑
/etc/gitlab/gitlab.rb
nginx['proxy_set_headers'] = { "X-Forwarded-Proto" => "http", "CUSTOM_HEADER" => "VALUE" }
-
保存文件并重新配置GitLab 使更改生效。
通过这种方法,您可以按需指定 NGINX 支持的任何 header。
配置极狐GitLab 信任的代理以及 NGINX real_ip
模块
默认情况下,NGINX 和极狐GitLab 记录所连接客户端的 IP 地址。
如果您的极狐GitLab 实例位于反向代理之后,您可能不需要代理 IP 地址显示为客户地址。
如果要配置 NGINX 来使用不同的地址,将您的反向代理添加到 real_ip_trusted_addresses
列表中:
# Each address is added to the the NGINX config as 'set_real_ip_from <address>;'
nginx['real_ip_trusted_addresses'] = [ '192.168.1.0/24', '192.168.2.1', '2001:0db8::/32' ]
# other real_ip config options
nginx['real_ip_header'] = 'X-Forwarded-For'
nginx['real_ip_recursive'] = 'on'
对于这些选项的描述,可以查看 NGINX realip
模块文档。
默认情况下,Linux 软件包安装使用 real_ip_trusted_addresses
中的 IP 地址作为极狐GitLab 信任代理,用户不会使用那些列表中的 IP 进行登录。
保存文件并重新配置GitLab 使更改生效。
配置 PROXY 协议
如果您想使用 PROXY 协议 在极狐GitLab 前面使用 HAProxy 之类的代理:
-
编辑
/etc/gitlab/gitlab.rb
:# Enable termination of ProxyProtocol by NGINX nginx['proxy_protocol'] = true # Configure trusted upstream proxies. Required if `proxy_protocol` is enabled. nginx['real_ip_trusted_addresses'] = [ "127.0.0.0/8", "IP_OF_THE_PROXY/32"]
-
保存文件并重新配置极狐GitLab,使更改生效。
启用后,NGINX 仅接受这些侦听器上的 PROXY 协议流量。 确保调整您可能拥有的任何其他环境,例如监控检查。
使用非捆绑的网络服务器
默认情况下,Linux 软件包安装捆绑有 NGINX 的极狐GitLab 实例。Linux 软件包安装允许 gitlab-www
用户访问网络服务器,gitlab-www
用户位于同名的群组中。要允许外部网络服务器访问极狐GitLab 实例,需要将外部网络服务器用户添加到 gitlab-www
群组。
要使用其它 Web 服务器,例如 Apache 或已有的 NGINX 实例,您需要执行以下步骤:
-
禁用捆绑的 NGINX。
在
/etc/gitlab/gitlab.rb
中设置:nginx['enable'] = false
-
设置非捆绑网络服务器用户的用户名。
Linux 软件包安装没有针对外部网络服务器用户的默认设置。您必须在配置中进行指定。比如:
- Debian/Ubuntu:对 Apache 和 NGINX 来说,默认用户都是
www-data
。 - RHEL/CentOS:NGINX 用户是
nginx
。
确保您提前安装了 Apache/NGINX,这样已创建了网络服务器用户,否则重新配置时 Linux 软件包安装会失败。
例如网络服务器用户是
www-data
。在/etc/gitlab/gitlab.rb
中设置:```ruby web_server['external_users'] = ['www-data'] ```
该设置是一个数组,您可以指定添加多个用户到
gitlab-www
群组。执行
sudo gitlab-ctl reconfigure
命令以使更改生效。如果您使用 SELinux,并且您的 Web 服务器在 SELinux 限制文件下运行,您可能需要放宽对 Web 服务器的限制。
确保网络服务器用户对外部网络服务器使用的所有目录具有正确的权限,否则您将收到
failed (XX: Permission denied) while reading upstream
错误。 - Debian/Ubuntu:对 Apache 和 NGINX 来说,默认用户都是
-
将非捆绑的网络服务器添加到受信任代理列表中。
通常 Linux 软件包安装的可信列表默认为捆绑的 NGINX 配置中,
real_ip
模块的配置内容。对于非捆绑的网络服务器,需要直接配置该列表,如果网络服务器与极狐GitLab 实例不在同一台机器上,列表中需要包括您的网络服务器 IP 地址。否则,用户将显示为从您的网络服务器的 IP 地址登录。
```ruby gitlab_rails['trusted_proxies'] = [ '192.168.1.0/24', '192.168.2.1', '2001:0db8::/32' ] ```
-
(可选)使用 Apache 时,设置正确的极狐GitLab Workhorse。
Apache 需要连接到 TCP 端口而不是 UNIX 套接字。要允许极狐GitLab Workhorse 监听 TCP 端口(默认为 8181),编辑
/etc/gitlab/gitlab.rb
:```ruby gitlab_workhorse['listen_network'] = "tcp" gitlab_workhorse['listen_addr'] = "127.0.0.1:8181" ```
执行
sudo gitlab-ctl reconfigure
命令以使更改生效。 -
下载正确的网络服务器配置。
转到极狐GitLab 仓库并下载所需的配置。根据您是否使用 SSL 为极狐GitLab 提供服务,选择正确的配置文件。您可能需要进行一些更改,例如:
- 将
YOUR_SERVER_FQDN
的值设置为您的 FQDN。 - 如果您使用 SSL,则更改您的 SSL 密钥的位置。
- 更改您的日志文件的位置。
- 将
NGINX 配置选项
GitLab 提供了多种配置选项,以便为您的具体需求定制 NGINX 行为。使用这些参考项来微调您的 NGINX 设置,并优化极狐GitLab 的性能和安全性。
设置 NGINX 监听地址
默认情况下,NGINX 将接受所有本地 IPv4 地址上的传入连接。
您可以更改地址列表。
-
编辑
/etc/gitlab/gitlab.rb
# Listen on all IPv4 and IPv6 addresses nginx['listen_addresses'] = ["0.0.0.0", "[::]"] registry_nginx['listen_addresses'] = ['*', '[::]'] mattermost_nginx['listen_addresses'] = ['*', '[::]'] pages_nginx['listen_addresses'] = ['*', '[::]']
-
保存文件并重新配置极狐GitLab,使更改生效。
设置 NGINX 监听端口
默认情况下,NGINX 将监听 external_url
中的指定端口,或使用正确的端口(HTTP 为 80,HTTPS 为 443)。如果您在反向代理后运行极狐GitLab,您可能想要使用其它的监听端口。
要修改监听端口:
-
编辑
/etc/gitlab/gitlab.rb
。比如使用8081
端口:nginx['listen_port'] = 8081
-
保存文件并重新配置极狐GitLab,使更改生效。
NGINX 日志的详细级别
默认情况下,NGINX 会以 error
详细级别记录日志。您可以通过更改日志级别以不同的级别登录。
要改变日志级别:
-
编辑
/etc/gitlab/gitlab.rb
。nginx['error_log_level'] = "debug"
-
保存文件并重新配置极狐GitLab,使更改生效。
可以从 NGINX 文档中找到有效值。
设置 Referrer-Policy header
默认情况下,极狐GitLab 将所有响应的 Referrer-Policy header 设置为 strict-origin-when-cross-origin
。这使得客户端:
- 在发出同源请求时,发送完整的 URL 作为 referrer。
- 仅在发出跨域请求时发送源。
如果要修改 header:
-
编辑
/etc/gitlab/gitlab.rb
。nginx['referrer_policy'] = 'same-origin'
您也可以禁用该 header,使客户端使用默认设置:
nginx['referrer_policy'] = false
-
保存文件并重新配置极狐GitLab,使更改生效。
注意,将其设置为 origin
或 no-referrer
,会破坏极狐GitLab 中需要完整引用 URL 的某些功能。
禁用 Gzip 压缩
默认情况下,极狐GitLab 对超过 10240 字节的文本数据启用 Gzip 压缩。要禁用此行为:
-
编辑
/etc/gitlab/gitlab.rb
。nginx['gzip_enabled'] = false
-
保存文件并重新配置极狐GitLab,使更改生效。
gzip
设置仅适用于极狐GitLab 主应用,不适用于其它服务。禁用代理请求缓冲
可以通过更改 request_buffering_off_path_regex
在特定位置选择性地禁用请求缓冲。
-
编辑
/etc/gitlab/gitlab.rb
:nginx['request_buffering_off_path_regex'] = "/api/v\\d/jobs/\\d+/artifacts$|/import/gitlab_project$|\\.git/git-receive-pack$|\\.git/gitlab-lfs/objects|\\.git/info/lfs/objects/batch$"
-
重新配置极狐GitLab,并 HUP NGINX,使其优雅地重新加载更新的配置:
sudo gitlab-ctl reconfigure sudo gitlab-ctl hup nginx
配置 robots.txt
要为您的实例配置 robots.txt
:
-
创建一个自定义的
robots.txt
文件并记住它的路径。 -
编辑
/etc/gitlab/gitlab.rb
:nginx['custom_gitlab_server_config'] = "\nlocation =/robots.txt { alias /path/to/custom/robots.txt; }\n"
用您自定义的
robots.txt
文件路径替换/path/to/custom/robots.txt
。 -
保存文件并重新配置极狐GitLab,使更改生效。
此项配置会增加一个自定义 NGINX 配置来为您自定义的 robots.txt
文件服务。
在 server block 中添加自定义 NGINX 设置
要想在极狐GitLab NGINX server
块中加入自定义设置:
-
编辑
/etc/gitlab/gitlab.rb
:# Example: block raw file downloads from a specific repository nginx['custom_gitlab_server_config'] = "location ^~ /foo-namespace/bar-project/raw/ {\n deny all;\n}\n"
-
保存文件并重新配置极狐GitLab,使更改生效。
定义的字符串将被插入到 /var/opt/gitlab/nginx/conf/gitlab-http.conf
中的 server
block 末尾。
gitlab.rb
文件中定义了相同的设置,这些自定义设置可能会发生冲突。注意
-
如果您在添加新的 location,需要在字符串中包含以下内容,或已包含在 NGINX 配置中。
proxy_cache off; proxy_http_version 1.1; proxy_pass http://gitlab-workhorse;
没有以上配置,任何 sub-location 将返回 404。
-
不能添加根路径
/
location 或/assets
location,因为已经存在于gitlab-http.conf
。
在 NGINX 配置中插入自定义设置
如果要在 NGINX 配置中添加自定义设置:
-
编辑
/etc/gitlab/gitlab.rb
:# Example: include a directory to scan for additional config files nginx['custom_nginx_config'] = "include /etc/gitlab/nginx/sites-enabled/*.conf;"
-
保存文件并重新配置极狐GitLab,使更改生效。
这将在 /var/opt/gitlab/nginx/conf/nginx.conf
中的 http
块的末尾插入已定义的字符串。
例如,如果要创建并开启自定义 server 块:
- 在
/etc/gitlab/nginx/sites-available
目录中创建自定义 server 块。 - 如果
/etc/gitlab/nginx/sites-enabled
目录不存在,创建此目录。 -
为了开启自定义 server 块,创建软连接:
sudo ln -s /etc/gitlab/nginx/sites-available/example.conf /etc/gitlab/nginx/sites-enabled/example.conf
-
重新加载 NGINX 配置:
sudo gitlab-ctl hup nginx
或者,您可以重启 NGINX
sudo gitlab-ctl restart nginx
您可以将服务器块的域作为备用名称>添加到生成的 Let’s Encrypt SSL 证书中。
在升级期间以及手动执行 sudo gitlab-ctl backup-etc
时,/etc/gitlab/
目录中的自定义 NGINX 设置将备份到 /etc/gitlab/config_backup/
。
自定义错误页面
如果要修改默认极狐GitLab 错误页面上的文本:
-
编辑
/etc/gitlab/gitlab.rb
:nginx['custom_error_pages'] = { '404' => { 'title' => 'Example title', 'header' => 'Example header', 'message' => 'Example message' } }
上述示例修改了默认的 404 错误页面。您可以用这种方式修改任何有效的 HTTP 错误码,比如 404 或者 502.
-
保存文件并重新配置极狐GitLab,使更改生效。
将生成下方的 404 页面。
使用已有的 Passenger 和 NGINX 安装
在某些情况下,您可能想要极狐GitLab 实例使用已有的 Passenger 和 NGINX 安装,但同时保留使用 Linux 软件包进行升级和安装时的便利性。
当禁用 NGINX 时,您将无法访问 Linux 软件包安装的其它服务,例如 Mattermost,除非您在 nginx.conf
中手动添加。
配置
为了配置极狐GitLab 以使用已有的 Passenger 和 NGINX 安装:
-
编辑
/etc/gitlab/gitlab.rb
:# Define the external url external_url 'http://git.example.com' # Disable the built-in NGINX nginx['enable'] = false # Disable the built-in Puma puma['enable'] = false # Set the internal API URL gitlab_rails['internal_api_url'] = 'http://git.example.com' # Define the web server process user (ubuntu/nginx) web_server['external_users'] = ['www-data']
-
保存文件并重新配置极狐GitLab,使更改生效。
配置 Vhost (server block)
在您的自定义 Passenger/NGINX 实例中:
-
创建以下站点配置文件:
upstream gitlab-workhorse { server unix://var/opt/gitlab/gitlab-workhorse/sockets/socket fail_timeout=0; } server { listen *:80; server_name git.example.com; server_tokens off; root /opt/gitlab/embedded/service/gitlab-rails/public; client_max_body_size 250m; access_log /var/log/gitlab/nginx/gitlab_access.log; error_log /var/log/gitlab/nginx/gitlab_error.log; # Ensure Passenger uses the bundled Ruby version passenger_ruby /opt/gitlab/embedded/bin/ruby; # Correct the $PATH variable to included packaged executables passenger_env_var PATH "/opt/gitlab/bin:/opt/gitlab/embedded/bin:/usr/local/bin:/usr/bin:/bin"; # Make sure Passenger runs as the correct user and group to # prevent permission issues passenger_user git; passenger_group git; # Enable Passenger & keep at least one instance running at all times passenger_enabled on; passenger_min_instances 1; location ~ ^/[\w\.-]+/[\w\.-]+/(info/refs|git-upload-pack|git-receive-pack)$ { # 'Error' 418 is a hack to re-use the @gitlab-workhorse block error_page 418 = @gitlab-workhorse; return 418; } location ~ ^/[\w\.-]+/[\w\.-]+/repository/archive { # 'Error' 418 is a hack to re-use the @gitlab-workhorse block error_page 418 = @gitlab-workhorse; return 418; } location ~ ^/api/v3/projects/.*/repository/archive { # 'Error' 418 is a hack to re-use the @gitlab-workhorse block error_page 418 = @gitlab-workhorse; return 418; } # Build artifacts should be submitted to this location location ~ ^/[\w\.-]+/[\w\.-]+/builds/download { client_max_body_size 0; # 'Error' 418 is a hack to re-use the @gitlab-workhorse block error_page 418 = @gitlab-workhorse; return 418; } # Build artifacts should be submitted to this location location ~ /ci/api/v1/builds/[0-9]+/artifacts { client_max_body_size 0; # 'Error' 418 is a hack to re-use the @gitlab-workhorse block error_page 418 = @gitlab-workhorse; return 418; } # Build artifacts should be submitted to this location location ~ /api/v4/jobs/[0-9]+/artifacts { client_max_body_size 0; # 'Error' 418 is a hack to re-use the @gitlab-workhorse block error_page 418 = @gitlab-workhorse; return 418; } # For protocol upgrades from HTTP/1.0 to HTTP/1.1 we need to provide Host header if its missing if ($http_host = "") { # use one of values defined in server_name set $http_host_with_default "git.example.com"; } if ($http_host != "") { set $http_host_with_default $http_host; } location @gitlab-workhorse { ## https://github.com/gitlabhq/gitlabhq/issues/694 ## Some requests take more than 30 seconds. proxy_read_timeout 3600; proxy_connect_timeout 300; proxy_redirect off; # Do not buffer Git HTTP responses proxy_buffering off; proxy_set_header Host $http_host_with_default; 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_pass http://gitlab-workhorse; ## The following settings only work with NGINX 1.7.11 or newer # ## Pass chunked request bodies to gitlab-workhorse as-is # proxy_request_buffering off; # proxy_http_version 1.1; } ## Enable gzip compression as per rails guide: ## http://guides.rubyonrails.org/asset_pipeline.html#gzip-compression ## WARNING: If you are using relative urls remove the block below ## See config/application.rb under "Relative url support" for the list of ## other files that need to be changed for relative url support location ~ ^/(assets)/ { root /opt/gitlab/embedded/service/gitlab-rails/public; gzip_static on; # to serve pre-gzipped version expires max; add_header Cache-Control public; } error_page 502 /502.html; }
不要忘记将上面示例中的 git.example.com
更新为您的服务器 URL。
如果您收到 403 forbidden 返回,确保在 /etc/nginx/nginx.conf
中启用了 passenger:
-
取消这行注释:
# include /etc/nginx/passenger.conf;
-
重新加载 NGINX 配置:
sudo service nginx reload
配置 NGINX 状态监控
默认情况下,NGINX 健康检查端点配置在 127.0.0.1:8060/nginx_status
,以监控您的 NGINX 服务器状态。
端点展示的信息如下:
Active connections: 1
server accepts handled requests
18 18 36
Reading: 0 Writing: 1 Waiting: 0
- Active connections - 开放的连接总数。
- 展示 3 个指标数字。
- 所有接受的连接。
- 所有处理的连接。
- 处理的请求总数。
- Reading:NGINX 读取的请求 header。
- Writing:NGINX 读取请求体,处理请求,或将响应写入客户端。
- Waiting:Keep-alive 连接。该数字取决于 keepalive-timeout。
配置 NGINX 状态选项
要配置 NGINX 状态选项:
-
编辑
/etc/gitlab/gitlab.rb
:nginx['status'] = { "listen_addresses" => ["127.0.0.1"], "fqdn" => "dev.example.com", "port" => 9999, "options" => { "access_log" => "on", # Disable logs for stats "allow" => "127.0.0.1", # Only allow access from localhost "deny" => "all" # Deny access to anyone else } }
如果要禁用 NGINX 状态选项:
nginx['status'] = { 'enable' => false }
-
保存文件并重新配置极狐GitLab,使更改生效。
配置用户上传权限
为了确保可以访问用户上传的内容,您的 NGINX 用户(通常为 www-data
)应被添加到 gitlab-www
群组中。使用以下命令:
sudo usermod -aG gitlab-www www-data
模板
配置文件和捆绑的极狐GitLab NGINX 配置类似,但有一下区别:
- 使用 Passenger 而不是 Puma 的配置。
- 默认情况下 HTTPS 并未开启,但是您可以开启它。
对 NGINX 配置做完变更后:
- 对基于 Debian 的系统,重启 NGINX
sudo service nginx restart
- 对其他操作系统,参考操作系统的文档以找到正确的命令重启 NGINX。