简而言之,Nginx和Node JS都运行在同一台服务器10.0.0.120上。我可以通过http://10.0.0.120:3000访问节点应用,所有样式表都已正确加载。
我想通过10.0.0.120/abc/访问Node应用程序,所以我在/etc/nginx/sites-available/default
location /abc/ {
proxy_pass http://localhost:3000/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
现在10.0.0.120/abc/可以访问Node应用程序但返回没有加载样式表,因为相对路径映射到10.0.0.120/stylesheets,显然不存在。
在NodeJS方面,我只使用了Express模板,其中public
文件夹用于提供静态文件。
app.use(express.static(path.join(__dirname, 'public')));
Node目录树如下所示
Node App
|
|── public
| ├── images
| ├── javascripts
│ │ ├── bootstrap.js
│ │ ├── bootstrap.min.js
│ │ └── jquery.min.js
│ └── stylesheets
│ ├── animate.css
│ ├── bootstrap.css
│ └── style.css
├── routes
│ ├── index.js
│ └── users.js
如何更改Nginx设置以解决问题?
答案 0 :(得分:0)
app.use(express.static(path.join(__dirname, 'public')));
。配置下面的nginx代理(conf/nginx.conf
文件)。
http {
...
server {
listen 2000;
server_name localhost;
root YOUR-APP-PATH/public;
location / {
try_files $uri @backend;
}
location @backend {
proxy_pass http://localhost:3000;
}
...
在2000
端口上运行应用程序。使用静态文件的应用程序将在3000
上启用。
P.S。我不是nginx专家,但它为我工作。
答案 1 :(得分:0)
尝试使用 app.use(express.static('public'))。 Express应该在没有path.join的情况下识别。我希望这有帮助
答案 2 :(得分:0)
最好通过nginx直接提供静态文件,效率更高,你可以轻松管理那里的缓存
server {
listen YOUR_APP_PORT;
server_name YOUR_SERVER_NAME;
location /abc/ {
YOUR_STANDARD_ROUTING_CONFIGURATION
}
location ~^\/(images|stylesheets|fonts|javascripts) {
expires 1M;
access_log off;
add_header Cache-Control "public";
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET;
add_header Access-Control-Allow-Headers X-Requested-With,content-type;
add_header Access-Control-Allow-Credentials true;
root YOUR_APPLICATION_PATH/public;
}
}