我的情况如下。
[Nginx被用作监听8080端口的apache服务器的反向代理。nginx在80端口运行。该apgi服务器正在运行一个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服务器的所有重定向,因此,由于应用程序的资源将在端口8080下可用,因此映射到http://localhost/<something>
的任何请求都将重定向到http://localhost:8080/<something>
。
现在,这里的问题是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 /中的问题
如果不能将代理的应用程序(在本例中为Graphite应用程序)配置为“从属”应用程序,则最好为应用程序保留整个子域。
或者您可以尝试ngx_http_sub_module其中:
…通过将一个指定的字符串替换为另一个指定的字符串来修改响应。
作为示例,此代码会将所有':/ localhost:8080 /'更改为':/ localhost / app_name /':
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。
page帮助我解决了类似的问题。大声笑刚意识到这是5岁。
我用这个来确保我的文件不会是494。
location / {
try_files $uri $uri/ @backend;
}
location @backend {
proxy_pass http://host:port;
}
location /myapp {
}