我在单独的 LXC 容器中使用 Nginx 作为我所有虚拟机和 LXC 容器的反向代理。当我尝试向我的网站(例如 phpmyadmin 或 Yunohost,它们位于单独的虚拟机中)验证自己的身份时,如果 POST 来自域,Nginx 会返回来自本地 IP 的响应!
这里我尝试对 phpmyadmin 进行身份验证。验证通过后,我必须刷新页面才能成功连接。
这是我的 nginx 配置:
server {
listen 80;
server_name mysql.mydomain.com;
location / {
proxy_pass http://10.0.2.103;
}
}
我的默认文件是:
server {
listen 80 default_server;
listen [::]:80 default_server;
location / {
try_files $uri $uri/ =404;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
# proxy_set_header X-Forwarded-Ssl on;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
fastcgi_param REMOTE_ADDR $http_x_real_ip;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
}
# Pour let's encrypt
location '/.well-known/acme-challenge' {
default_type "text/plain";
root /root/certbot-auto/;
}
# On interdit tout autre appel
location ~ /\. {
deny all; access_log off; log_not_found off;
}
}
每个 VM 上的每项服务都使用 Apache。
编辑:我之前使用 CloudFlare 进行 SSL 认证。现在我将 Let's Encrypt 与 Nginx 结合使用,但仍然遇到同样的问题。
EDIT2:我通过在 phpmyadmin 的配置文件中强制其使用绝对 URL 解决了 phpmyadmin 的问题:
$cfg['PmaAbsoluteUri'] = 'https://mysql.example.com/';
但在我的其他 LXC 容器和虚拟机中,其他服务也存在同样的问题。
当我第一次尝试在 QEMU 中连接到指向 Yunohost 的 URL agora.mydomain.com 时,发生了以下情况:
我的 nginx VirtualHost 非常简单:
server {
listen 80;
server_name agora.mydomain.com;
location / {
proxy_pass http://10.0.2.106;
# return 301 https://agora.mydomain.com$request_uri;
}
}
在 Yunohost VM 本地使用时lynx localhost
,它可以工作,所以我认为这是一个 Nginx 问题。
我的网站论坛也出现了同样的问题,在另一台 VM 上再次使用 screambox,但只有当我尝试在登录页面进行身份验证时才会出现这种情况。
答案1
我认为问题出在 proxy_pass 指令中的地址上。使用正确的主机名而不是 IP 地址或添加主机标头
具有定义的上游
upstream agora.mydomain.com {
server 10.0.2.106;
}
server {
listen 80;
server_name agora.mydomain.com;
location / {
proxy_pass http://agora.mydomain.com;
}
}
或者仅使用主机头
server {
listen 80;
server_name agora.mydomain.com;
location / {
proxy_set_header Host $host;
proxy_pass http://10.0.2.106;
}
}