我试图设置nginx作为反向代理服务所有静态资产,同时转发所有dynamic请求到Apache。
我跟随了一大堆不同的教程,其中没有一个给我想要的效果。
我的/etc/nginx/sites-available/default
外观如下:
server { listen 81 default; server_name localhost; access_log /var/log/nginx/localhost.access.log; root /var/www/www.example.com/httpdocs; location / { try_files $uri @proxy; } location @proxy { proxy_set_header Host $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_buffers 32 4k; proxy_pass http://www.example.com:80; } location ~ \.php$ { proxy_pass http://www.example.com:80; } location ~ /\.ht { deny all; } }
我正在使用端口81,以免中断正在运行的服务。
看着nginx和apache的访问日志,我可以看到所有的请求仍然同时触及nginx和apache,也就是所有的图像,CSS和JS请求。
如果我将@proxy中的所有内容注释掉,那么静态资产就不会出现问题。
作为一个额外的问题,我想,我的location ~ \.php$
规则仍然服务于未分析的PHP文件。
你尝试过吗? 将此行移出location
块,到server
上下文:
try_files $uri @proxy;
这听起来像你已经证实,你正在testing的静态资产实际上存在于你认为的地方,如/var/www/www.example.com/httpdocs/$uri
;
可能值得仔细检查一下,这个“root”是否与你为Apache设置的内容相匹配,Nginx运行的用户是否有权访问和读取这些文件。
好吧,事实上,我的问题是由于81上的nginx和80上的apache,而来自apache的PHP提供的静态资产链接与绝对URL不保留任何端口的HTML,因此这些链接默认为端口80.切换nginx 80和Apache到81解决了这个问题。