我的情况如下。
Nginx被用作侦听端口8080的apache服务器的反向代理.nginx在端口80上运行。有一个由apache服务器运行的wsgi应用程序。
现在,我已经在nginx配置中添加了一个proxy_pass,这样无论什么请求到localhost /(nginx端口是默认端口80),它们都会被重定向到localhost:8080。
以下是nginx conf文件的摘录:
server {
listen 80;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
location <app_name> {
proxy_pass http://localhost:8080/
proxy_redirect http://localhost/ http://localhost:8080/
}
}
我添加了代理重定向来处理来自apache服务器的任何重定向,以便映射到http://localhost/<something>
的任何请求都被重定向到http://localhost:8080/<something>
,因为应用程序的资源将在端口8080下可用。
现在,问题在于wsgi应用程序生成一个html,其中图像和javascript位置路径是绝对路径,如/img/image.png和/js/javascript.js。现在,它们是HTML的一部分,并且不会发送带有完整http://前缀的任何重定向,因此服务器会尝试在localhost / img目录中找到图像而不是localhost:8080 / img目录
同样的脏解决方法可能是将/ img和/ js目录定义为服务器配置中的单独“位置”,并为其指定proxy_pass。但是这些目录的数量可能更多,维持相同可能会成为一个令人头痛的问题。
有更清洁的方法吗?
这是为了解决石墨Apache cannot serve graphite-web from URLs other than /
中的问题答案 0 :(得分:0)
如果代理应用程序(在这种情况下为Graphite应用程序)无法配置为&#34; slave&#34;应用程序,最好将整个子域备用到应用程序中。
或者您可以尝试ngx_http_sub_module:
...通过将一个指定的字符串替换为另一个来修改响应。
作为示例,此代码将更改所有&#39;:/ localhost:8080 /&#39;到&#39;:/ localhost / app_name /&#39;:
location <app_name> {
# ...
sub_filter ':/localhost:8080/' ':/localhost/app_name/';
}
请注意:
默认情况下不构建此模块,应使用--with-http_sub_module配置参数启用它。
但在大多数软件包系统中,nginx已经使用它的所有可选模块构建。只需检查您的版本是否内置了 sub_module :
nginx -V | grep sub_module
在我的自制软件中,它给出了output like this。