所以我在 Ubuntu 20.04 上安装并设置了 GitLab EE 服务器(Omnibus)。 接下来,按照 GitLab PlantUML 集成 上的官方文档,我在一个 docker 容器中启动了 PlantUML,这是我使用以下命令完成的:
docker run -d --name plantuml -p 8084:8080 plantuml/plantuml-server:tomcat
接下来,我还配置了 /etc/gitlab/gitlab.rb 文件并添加了下一行用于重定向,因为我的 GitLab 服务器正在使用 SSL:
nginx['custom_gitlab_server_config'] = "location /-/plantuml/ { \n proxy_cache off; \n proxy_pass http://plantuml:8080/; \n}\n"
在管理面板的 GitLab 服务器 GUI 中,在设置 -> 常规中,当我展开 PlantUML 时,我将 PlantUML URL 的值设置为(两种方式):
第一种方法:
https://HOSTNAME:8084/-/plantuml
然后,当尝试通过此地址(https://HOSTNAME:8084/-/plantuml)通过浏览器访问它时,我得到
此站点无法提供安全连接。
HOSTNAME 发送了无效的响应。
ERR_SSL_PROTOCOL_ERROR
第二种方法: 我还尝试在设置 -> 常规 -> PlantUML -> PlantUML URL:
中尝试不同的值https://HOSTNAME/-/plantuml
然后,当尝试通过此地址(https://HOSTNAME/-/plantuml)通过浏览器访问它时,我得到
502
糟糕,GitLab 的响应时间太长了
在这两种情况下,当我使用
gitlab-ctl tail
跟踪日志时,我得到相同的错误:
[crit] *901 SSL_do_handshake() failed (SSL: error:141CF06C:SSL routines:tls_parse_ctos_key_share:bad key share) while SSL handshaking, client: CLIENT_IP, server: 0.0.0.0:443
[error] 1123593#0: *4 connect() failed (113: No route to host) while connecting to upstream
我的问题是以上两种方式中哪一种是正确的,可以使用上述配置访问 PlantUML,我是否缺少任何配置?
我认为问题是您在 docker 容器中运行 plantuml,然后尝试通过 gitlab(在本地主机上)使用名称访问它。
为了检查是否是问题所在,请更改
proxy_pass http://plantuml:8080/
到
proxy_pass http://localhost:8080/
然后用第一种方法再试一次。
您的第二种方法似乎缺少 url 中的容器端口。
你是对的。 PlantUML TomCat 或 Jetty 有同样的问题,只提供 HTTP 而不是 HTTPS。 如果您需要 HTTPS,则由 nginx 提供该层。
这是我本地 plantuml 的 Nginx 配置。我知道你想要与 gitlab 的整体集成。也许因为这是 6 个月大,你找到了解决方案。
无论如何,您可以看到 nginx 正在处理 ssl,而 proxy_pass 仅通过 http。
upstream jetty { server 127.0.0.1:8084 weight=100 max_fails=5 fail_timeout=5;}
server {
listen 443 ssl; # managed by Certbot
listen [::]:443 ssl; # managed by Certbot
listen 80;
listen [::]:80;
server_name plantuml.mycompany.example;
access_log /var/log/nginx/plantuml.mycompany.example.access.log;
error_log /var/log/nginx/plantuml.mycompany.example.error.log;
# RSA certificate
ssl_certificate /etc/letsencrypt/live/mycompany.example-0001/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/mycompany.example-0001/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
# Redirect non-https traffic to https
if ($scheme != "https") {
return 301 https://$host$request_uri;
} # managed by Certbot
location / {
proxy_set_header X-Forwarded-Host $host;
proxy_set_header X-Forwarded-Server $host;
proxy_pass http://jetty/;
sub_filter '"http://jetty/' '"/';
sub_filter_once off;
}
}
如果您找到解决方案,请分享。