Я пытался решить проблему, когда я пытаюсь войти в pgAdmin (в контейнере докеров) за прокси-сервером Nginx, я получаю сообщение об ошибке, что токены CSRF не совпадают.
Честно говоря, проблема связана с nginx или нет, я не уверен, но файлы конфигурации, как показано ниже:
Служба Docker Swarm:
pgAdmin:
image: dpage/pgadmin4
networks:
- my-network
ports:
- 9102:80
environment:
- PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}
- PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}
- PGADMIN_CONFIG_SERVER_MODE=True
volumes:
- /home/docker-container/pgadmin/persist-data:/var/lib/pgadmin
- /home/docker-container/pgadmin/persist-data/servers.json:/pgadmin4/servers.json
deploy:
placement:
constraints: [node.hostname == my-host-name]
Конфигурация Nginx:
server {
listen 443 ssl;
server_name my-server-name;
location / {
proxy_pass http://pgAdmin/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-CSRF-Token $http_x_pga_csrftoken;
}
ssl_certificate /home/nginx/ssl/certificate.crt;
ssl_certificate_key /home/nginx/ssl/private.key;
ssl_session_cache builtin:1000 shared:SSL:10m;
ssl_prefer_server_ciphers on;
server {
listen 80;
server_name my-server-name;
return 301 https://my-server-name $request_uri;
}
Я могу получить доступ к pgAdmin двумя способами:
- Первый способ — прямой IP-адрес хоста, например 172.23.53.2:9102.
- Второй способ — через прокси Nginx.
Когда я пытаюсь получить доступ к pgAdmin через прямой IP-адрес хоста, ошибки нет, но когда я пытаюсь получить доступ через DNS (например, my-server.pgadmin.com), я получаю сообщение об ошибке при входе в панель управления pgAdmin.
Ошибка:
Неверный запрос
Токены CSRF не совпадают.
Мое первое мнение об этой ошибке: nginx не передает заголовок токена CSRF в pgAdmin. По этой причине я много раз менял файл конфигурации nginx, но все равно получаю эту ошибку.
Что может быть источником этой ошибки и как я могу решить эту проблему?