我正在尝试运行服务 Mautic (https://hub.docker.com/r/mautic/mautic) 在 Docker 中的 NGINX 反向代理后面,无法弄清楚我做错了什么。
先简单介绍一下我的设置:
由于 Mautic 监听端口 80,并且我已经有 NGINX 容器监听端口 80,因此我在 Mautic 映像中的以下文件中将端口 80 更改为 8081:
/etc/apache2/ports.conf
/etc/apache2/sites-available/000-default.conf
我有一个 NGINX 容器在端口 80 上作为反向代理工作。我的 NGINX 容器中有以下内容/etc/nginx/conf.d/default.conf
:
server {
listen 80;
listen [::]:80;
server_name localhost;
location / {
proxy_pass http://site-client:4200;
}
location /api/ {
proxy_pass http://site-api:8055/;
}
location /mautic/ {
proxy_pass http://mautic:8081/;
}
}
我在 docker-compose.yml 文件中公开了 Mautic 的端口 8081。
现在有问题的部分:
- 如果我访问 http://localhost:8081,浏览器的 URL 会更改为 http://localhost:8081/s/dashboard,并且 Mautic 可以正常工作。
- 但是,如果我访问 http://localhost/mautic/,浏览器的 URL 会更改为 http://localhost/s/dashboard,这会将我带到我的
site-client
服务。不知何故,URL 的 /mautic/ 部分在这里丢失了。 - 因此,如果我转到 http://localhost/mautic/s/dashboard,URL 保持不变,Mautic 会加载一堆 ERR_ABORTED 404 错误(参见下面的 Chrome 开发者控制台图片)。这些文件的请求标头显示请求 URL 中仍然缺少 /mautic/ 部分(即使我手动将其包含在浏览器的 URL 中),因此由于请求标头 URL 错误而无法找到这些文件是有道理的。但为什么错了呢?
我尝试修复它的方法:
我的site-api
服务也遇到了同样的问题,它是基于 Node.js 的无头 CMS(Directus),我通过在其配置中将其公共 URL 设置为 http://localhost/api 来修复它。如果我转到 http://localhost/api/,此服务可以正常工作。因此,我在 Mautic 的配置中尝试了相同的操作,并将其公共 URL 从 http://localhost:8081 设置为 http://localhost/mautic。现在,如果我转到 http://localhost/mautic/,浏览器的 URL 会正确设置为 http://localhost/mautic/s/dashboard,但我仍然得到相同的结果,如下图所示。
这是我与 Mautic 和 NGINX 相关的 docker-compose.yml:
reverse-proxy:
container_name: nginx
build: ./tools/nginx
depends_on:
- site-api
- site-client
- mautic
networks:
- site-api-network
ports:
- 80:80
restart: always
mautic:
image: mautic/mautic:v4
build: ./tools/mautic
container_name: mautic
links:
- mauticdb:mysql
depends_on:
- mauticdb
ports:
- 8081:8081
volumes:
- mautic_data:/var/www/html
environment:
- MAUTIC_DB_HOST=mauticdb
- MYSQL_PORT_3306_TCP=3306
- MAUTIC_DB_USER=root
- MAUTIC_DB_PASSWORD=${MAUTIC_DB_PASSWORD}
- MAUTIC_DB_NAME=${MAUTIC_DB_NAME}
- MAUTIC_RUN_CRON_JOBS=true
- MAUTIC_INSTALL_FORCE=true
- MAUTIC_ADMIN_EMAIL=${MAUTIC_ADMIN_EMAIL}
- MAUTIC_ADMIN_PASSWORD=${MAUTIC_ADMIN_PASSWORD}
- MAUTIC_ADMIN_USERNAME=${MAUTIC_ADMIN_USERNAME}
- MAUTIC_ADMIN_FIRSTNAME=${MAUTIC_ADMIN_FIRSTNAME}
- MAUTIC_ADMIN_LASTNAME=${MAUTIC_ADMIN_LASTNAME}
- MAUTIC_TRUSTED_PROXIES=["0.0.0.0/0"]
networks:
- site-api-network
networks:
site-api-network:
driver: bridge
volumes:
mautic_db_data:
driver: local
mautic_data:
driver: local
这是reverse-proxy
Dockerfile:
FROM nginx:alpine
RUN rm /etc/nginx/conf.d/*
COPY ./default.conf /etc/nginx/conf.d/
EXPOSE 80
CMD [ "nginx", "-g", "daemon off;" ]
这是mautic
Dockerfile:
FROM mautic/mautic:v4
RUN rm /etc/apache2/ports.conf
RUN rm /etc/apache2/sites-available/000-default.conf
COPY ./ports.conf /etc/apache2/
COPY ./000-default.conf /etc/apache2/sites-available
EXPOSE 8081
Mautic 图像ports.conf
文件
Listen 8081
<IfModule ssl_module>
Listen 443
</IfModule>
<IfModule mod_gnutls.c>
Listen 443
</IfModule>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
Mautic 图像000-default.conf
文件
<VirtualHost *:8081>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
# vim: syntax=apache ts=4 sw=4 sts=4 sr noet
答案1
我相信这是我的后端服务 Mautic 的问题,而不是 NGINX。可以从这里了解发生了什么以及一些解决方案:https://serverfault.com/a/797006
我采用了一个解决方案,将子域指向我的服务,而不是将其作为域的子路径。
因此,不要尝试通过以下方式访问它example.com/mautic/
:
location /mautic/ {
proxy_pass http://mautic:8081/;
}
我创建了一个单独的服务器块,并将其server_name
设置为mautic.example.com
,其中的位置块为:
location / {
proxy_pass http://mautic:8081/;
}