我在 Docker 中运行 Apache Guacamole,并且我想使用 Nginx 代理管理器使其可公开访问。
这是 Guacamole 的 Docker Stack:
version: "3"
volumes:
mysql:
driver: local
services:
guacamole:
image: guacamole/guacamole:latest
container_name: guacamole_server
restart: always
ports:
- 8080:8080
depends_on:
- mysql
- guacd
environment:
- MYSQL_HOSTNAME=mysql
- MYSQL_PORT=3306
- MYSQL_DATABASE=guacamole
- MYSQL_USER=guacamole
- MYSQL_PASSWORD=secret
- GUACD_HOSTNAME=guacd
- GUACD_PORT=4822
mysql:
image: mysql:latest
container_name: guacamole_mysql
restart: always
environment:
- MYSQL_ROOT_PASSWORD=guacamole
- MYSQL_USER=guacamole
- MYSQL_PASSWORD=secret
- MYSQL_DATABASE=guacamole
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-u", "root", "--password=guacamole"]
interval: 10s
timeout: 5s
retries: 5
volumes:
- mysql:/var/lib/mysql
guacd:
image: guacamole/guacd:latest
container_name: guacamole_guacd
restart: always
当我通过本地 IP 的 8080 端口访问 Guacamole 时,一切都运行正常。
然后我向 Nginx 代理管理器添加了一个新的代理主机,其配置如下:
细节:
- 域名:(某物)
- 方案:http
- IP:192.168.123.123
- 端口:8080
- 缓存资产:已禁用
- 阻止常见漏洞:已启用
- Websockets 支持:已启用
- 访问列表:可公开访问
SSL:
- 强制 SSL:已启用
- HSTS 已启用:已启用
- HTTP/2 支持:已启用
- HSTS 子域名:已禁用
自定义位置:
- (没有任何)
先进的:
- (没有什么)
到目前为止它仍然运行良好。
如果我现在更改配置:(从https://github.com/jc21/nginx-proxy-manager/issues/104)
自定义位置:
- 地点: /
- 方案:http
- 转发主机名:192.168.123.123/guacamole/
- 端口:8080
- 高级:(无)
然后我得到一个空白页,但是所有的源代码都已加载并且所有请求的状态都是 200。在浏览器的控制台中我看到:
Uncaught SyntaxError: expected expression, got '<'
当我不使用“自定义位置”配置而是使用自己的高级配置时,也会发生同样的事情:
location / {
proxy_pass $forward_scheme://$server:$port/guacamole/;
}
我也尝试了不同的配置,但总是出现该错误。在网上搜索了很久也没找到任何提示。
答案1
不使用‘自定义位置’。
将其放入高级:
location / {
proxy_pass http://192.168.123.123:8080/guacamole/;
proxy_buffering off;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $http_connection;
proxy_cookie_path /guacamole/ /;
access_log off;
}
答案2
我相信我在尝试配置鳄梨酱时遇到了同样的问题,最近偶然发现了一个解决方案。
详情:
- 域名:example.com
- 方案:http
- IP:192.168.123.123
- 端口:8080
- 缓存资产:已禁用
- 阻止常见漏洞:已启用
- Websockets 支持:已启用
- 访问列表:可公开访问
然后,SSL:
- 强制 SSL:已启用
- HSTS 已启用:已启用
- HTTP/2 支持:已启用
- HSTS 子域名:已禁用
到目前为止一切顺利,可以通过 example.com/guacamole 访问 guacamole。
为了转发子目录,以便 example.com 指向 example.com/guacamole,自定义位置应该是:
- 地点: /
- 方案:http
- 转发主机名:example.com/guacamole
- 端口:8080
意思是,您实际上转发的是现有域子目录,而不是实际的服务器 IP。我不知道具体细节,但经过多次尝试后,这种方法对我来说是有效的。