遇到一个奇葩情况,gitlab进入某个项目管理使用“通用”功能时直接报错500,如下图所示

之前也尝试看了下日志,也没有找到根本原因,因为系统使用一切正常除了“通用”功能,也没有diy功能,所以怀疑可能是一些刁钻的问题导致,比如环境、编码等等,直到今天准备正儿八经的解决这个问题。

问题排查

先看varlog下的日志:

/var/log/gitlab/production.log

Started GET "/yun*****/edit" for 114.102.184.128 at 2020-09-23 10:39:16 +0800
Processing by ProjectsController#edit as HTML
Parameters: {"namespace_id"=>"yun****", "id"=>"yun****"}
Completed 500 Internal Server Error in 16ms (ActiveRecord: 1.9ms | Elasticsearch: 0.0ms)

URI::InvalidComponentError (bad component(expected host component): git_yun****):
lib/api/helpers/related_resources_helpers.rb:23:in `expose_url'
app/controllers/projects_controller.rb:39:in `edit'
lib/gitlab/i18n.rb:53:in `with_locale'
lib/gitlab/i18n.rb:59:in `with_user_locale'
app/controllers/application_controller.rb:411:in `set_locale'
lib/gitlab/middleware/multipart.rb:101:in `call'
lib/gitlab/request_profiler/middleware.rb:14:in `call'
ee/lib/gitlab/jira/middleware.rb:15:in `call'
lib/gitlab/middleware/go.rb:17:in `call'
lib/gitlab/etag_caching/middleware.rb:11:in `call'
lib/gitlab/middleware/rails_queue_duration.rb:22:in `call'
lib/gitlab/metrics/rack_middleware.rb:15:in `block in call'
lib/gitlab/metrics/transaction.rb:53:in `run'
lib/gitlab/metrics/rack_middleware.rb:15:in `call'
lib/gitlab/middleware/read_only/controller.rb:40:in `call'
lib/gitlab/middleware/read_only.rb:16:in `call'
lib/gitlab/middleware/basic_health_check.rb:25:in `call'
lib/gitlab/request_context.rb:18:in `call'
lib/gitlab/metrics/requests_rack_middleware.rb:27:in `call'
lib/gitlab/middleware/release_env.rb:10:in `call'


从日志里看出来是host问题,于是仍然google一番,直到在网上找到一些类似问题的描述,我看到了一些共性:

 

 

原来这是ruby语言中某些地方的特性,不支持绑定带下划线的域名地址

真相就是这么简单,这个问题遇到的应该不多,但是一旦碰到,很难追随到是域名下划线的问题。

其实类型域名带下划线的限制还是很多的,比如微信公众号的回掉接口也是不支持下划线的。

所以今后考虑到兼容性起子域名的时候还是不要带下划线,就好比文件名、目录等尽量不用中文导致的编码解析问题类似。

重新配置

那么简单记录一下重新配置域名的过程:

  1. 配置文件中修改绑定的域名,配置文件:/etc/gitlab/gitlab.rb,参数:external_url
  2. 重新加载配置:gitlab-ctl reconfigure
  3. 重新启动:gitlab-ctl restart
  4. 修改nginx绑定域名: /usr/local/nginx/conf/nginx.conf
  5. 重启nginx:service nginx restart

以上,备忘。