昨天,我建立了一个 WordPress“集群”。
现在我遇到一个问题:WordPress 和 stat-plugins 仅将用户显示为内部 IP 地址,如 10.0.0.2。
我的 nginx 配置是:
upstream backend {
#ip_hash;
server 10.0.0.3:80;
server 10.0.0.2:8080;
}
server {
listen 80;
server_name bloggingsite.org;
location / {
proxy_pass http://backend;
proxy_redirect off;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# client_max_body_size 10m;
# client_body_buffer_size 128k;
# proxy_connect_timeout 90;
# proxy_send_timeout 90;
# proxy_read_timeout 90;
# proxy_buffer_size 4k;
# proxy_buffers 4 32k;
# proxy_busy_buffers_size 64k;
# proxy_temp_file_write_size 64k;
}
}
第二个服务器块:
server {
listen 8080;
server_name bloggingsite.org;
root /var/www/;
real_ip_header X-Real-IP;
include /etc/nginx/fastcgi_php;
location / {
index index.php;
if (!-e $request_filename) {
#rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;
#rewrite ^.*/files/(.*)$ /wp-content/blogs.php?file=$1 last;
#rewrite .*/files/(.*) /wp-includes/ms-files.php?file=$1;
# rewrite ^.+?(/wp-.*) $1 last;
# rewrite ^.+?(/.*\.php)$ $1 last;
rewrite ^ /index.php last;
}
}
}
答案1
在我看来,您使用单个 nginx vhost 然后反向代理到多个运行 nginx/php-fpm 的服务器,对吗?
看起来你也试图使用 nginx 的 x-Real-IP -http://wiki.nginx.org/HttpRealIpModule
但是你的第二个 nginx vhost 中缺少一个重要的标头:
set_real_ip_from 10.0.0.0/24;
这将允许它验证真实的 IP 标头,以便成功设置它,如果没有它,它实际上不会更改您的访问日志和应用程序(在本例中为 wordpress)中的真实 IP,因此您的第二个 vhost 块应该更像这样:
server {
listen 8080;
server_name bloggingsite.org;
root /var/www/;
set_real_ip_from 10.0.0.0/24;
real_ip_header X-Real-IP;
include /etc/nginx/fastcgi_php;
location / {
index index.php;
if (!-e $request_filename) {
#rewrite ^.*/files/(.*)$ /wp-includes/ms-files.php?file=$1 last;
#rewrite ^.*/files/(.*)$ /wp-content/blogs.php?file=$1 last;
#rewrite .*/files/(.*) /wp-includes/ms-files.php?file=$1;
# rewrite ^.+?(/wp-.*) $1 last;
# rewrite ^.+?(/.*\.php)$ $1 last;
rewrite ^ /index.php last;
}
}
}
您可以在虚拟主机中设置多个 set_real_ip_from 标头,以仅允许特定主机信任真实 ip,但该配置假定您将来可能会添加更多服务器,并且更易于维护
答案2
“服务器”将在 TCP 级别看到来自 10.0.0.2 的代理的连接,并从中获取 IP - 这就是您以这种方式看到它的原因。
尝试查看 X-Forwarded-For 标头,或者在 apache 中找到类似于 mod_remoteip 的东西,它允许您用 X-Forwarded-For 标头中的值替换客户端 IP。我刚刚在 Google 上搜索了这样的功能(我知道 apache 中有 mod_remoteip),找到了这个网站:http://wiki.nginx.org/HttpRealIpModule