我正在尝试将 nginx 设置为反向代理来提供所有静态资产,同时将所有动态请求转发给 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 文件。
答案1
你试过这个吗?将此行移出块location
,移至server
上下文:
try_files $uri @proxy;
听起来你已经确认了你正在测试的静态资产确实存在于你认为的地方,如 /var/www/www.example.com/httpdocs/$uri
;
值得仔细检查这个“根”是否与您为 Apache 设置的相匹配,以及 Nginx 正在运行的用户是否有权访问和读取这些文件。
答案2
好吧,事实证明我的问题是由于 81 上的 nginx 和 80 上的 apache 造成的,而 apache 中的 PHP 使用静态资产链接提供 HTML,这些链接的绝对 URL 没有维护任何端口,因此这些链接默认为端口 80。将 nginx 切换到 80 并将 apache 切换到 81 解决了这个问题。