我有一个express. jsAngularJs应用程序,它使用gulp构建和服务于不同的环境(即开发/登台/测试/生产),并使用NginX作为反向代理。
NodeJS应用
该应用程序是根据John Papa的AngularJS风格指南编写的,吞咽配置在很大程度上受到了this sample application of his的启发。
本申请的基本部分的结构如下:
/build (created on the fly, optimizes code)
/src (no optimiztion)
/client
/app
/content
/test
index.html
/server
/data
/routes
gulpfile.js
Express中间件摘录
// /src/server/app.js
switch (environment){
case 'stage':
case 'build':
console.log('** BUILD **');
console.log('serving from ' + './build/');
app.use('/', express.static('./build/'));
break;
default:
console.log('** DEV **');
console.log('serving from ' + './src/client/ and ./');
app.use('/', express.static('./src/client/'));
app.use('/', express.static('./'));
break;
}
app.listen(port, function() {
console.log('Express server listening on port ' + port);
console.log('env = ' + app.get('env') +
'\n__dirname = ' + __dirname +
'\nprocess.cwd = ' + process.cwd());
});
反向代理服务器
我使用NginX作为Express服务器的反向代理,可以使用下面的配置在 my_domain_name 访问它。
upstream my_nodejs_upstream {
server 127.0.0.1:7203;
keepalive 64;
}
server {
listen 80;
server_name my_domain_name;
return 301 https://$server_name$request_uri;
}
server {
# SSL configuration
listen 443 ssl http2 default_server;
listen [::]:443 ssl http2 default_server;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_pass http://my_nodejs_upstream/;
proxy_redirect off;
proxy_read_timeout 240s;
}
这是可行的,但我最终希望能够访问位于 my_domain_name/app 的应用程序,因此我认为只需更改位置URI即可。
location /app/ {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_max_temp_file_size 0;
proxy_pass http://my_nodejs_upstream/;
proxy_redirect off;
proxy_read_timeout 240s;
}
这不起作用。我可以通过express服务器访问应用程序,即my_domain_name:7203,但尝试访问my_domain_name/app时,我收到了关于所有静态内容的404错误。似乎“/app/”部分没有被传递。例如,请求缩小的CSS仍在 * https://my_domain_name/content/all.min-06c3b402.css * 完成,而此时文件位于 * https://my_domain_name/app/content/all.min-06c3b402.css *。
我真的不知道该怎么继续下去。
编辑1(2018年3月1日)
省略/
,即如果我放入location /
块,proxy_pass http://my_nodejs_upstream;
仍然可以工作,但不能放入location /app
。但这次我遇到了不同的错误,因为我根本无法访问它:Cannot GET /app
。我还用一些附加信息更新了OP(即Express Middleware摘录部分)。
2条答案
按热度按时间gcmastyq1#
您写道:
我很确定你应该写:
没有结尾的
/
。结尾的/
是一个url,并且proxy_pass指令的行为方式与是否为它提供url不同(添加的粗体):如果使用URI指定proxy_pass指令,则在将请求传递到服务器时,标准化请求URI中与位置匹配的部分将替换为指令中指定的URI(...)
对比
如果指定proxy_pass时没有指定URI,则请求URI将以与处理原始请求时客户端发送的格式相同的格式传递到服务器,或者在处理更改的URI(...)时传递完整的规范化请求URI
其他解决方案可能暗示使用位置捕获并在proxy_pass指令上重用它,或者在此proxy_pass重写中添加
$request_uri
,但我认为这里不需要它。s71maibg2#
我也遇到了这个问题,我通过改变express上的路径来解决它,而不是响应
app.get("/")
,我传递了nginx上的位置名称,在您的情况下应该是app.get("/app")
。