我在使用 docker swarm 和 nginx 作为反向代理的生产环境中使用 Symfony 7 应用程序时遇到问题。
使用 1 个副本一切正常,但是 使用 2 个或更多副本我的应用程序启动但我无法登录它。该应用程序使用带有登录表单的标准 Symfony 方法 (https://symfony.com/doc/current/security.html#form-login)。 应用程序映像是从 php:8.2-apache 构建的,Apache 当然是应用程序容器内运行的 Web 服务器。
这是我的配置(我省略了不相关的内容):
swarm_stack.yml
services:
nginx:
image: ghcr.io/mygh/nginx:docker
deploy:
replicas: 1
ports:
- "80:80"
- "443:443"
backend_app:
image: ghcr.io/mygh/backend:docker
deploy:
replicas: 2
ports:
- "8000:80"
nginx.conf
server {
listen 80;
listen 443 ssl;
server_name backendapp.com;
location / {
proxy_pass http://backend_app:80/;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
}
}
我在想,由于登录失败,副本/工作节点之间共享会话可能存在问题?或者问题可能出在方法本身?这是我第一次尝试以这种方式配置堆栈。
好吧,这是一个会话共享问题。由于 Nginx Plus(及其粘性会话)对于我的应用程序来说“有点”太贵了,所以我选择配置 Symfony 将会话存储在 Redis 中。就像魅力一样。
再次感谢@NicoHaase 指出了这一点。