Nginx提供静态文件并代理到后端服务器

时间:2019-06-11 22:02:23

标签: nginx nginx-reverse-proxy nginx-config

我正在使用nginx提供静态文件,并且还代理到后端Java服务器。我在后端Java服务器中使用模板语言,最终将替换所有html文件。

我不了解nginx,所以我想寻求一些最有效的方法帮助。

文件:

/assets             // Lots more files in this folder
/index.html
/android-chrome-192x192.png
/android-chrome-512x512.png
/apple-touch-icon.png
/browserconfig.xml
/favicon.ico
/favicon-16x16.ico
/favicon-32x32.ico
/mstile-15x150.png
/safari-pinned-tab.svg
/site.webmanifest

这是我到目前为止的conf文件。我正在提供静态文件,但不提供代理服务:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /root/web;
    index index.html;
    server_name _;

    location /assets/ {
        try_files $uri =404;
        sendfile on;
        sendfile_max_chunk 512k;
    }

    location / {
        try_files $uri =404;
        sendfile on;
        sendfile_max_chunk 512k;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|webp|mp4)$ {
        expires 30d;
    }

    location ~* \.(css|js)$ {
        expires 10d;
    }

    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_types application/javascript application/json application/x-font-ttf font/opentype image/* text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";
    gunzip on;

    # error_log /root/nginx-log.txt debug;
}

我的后端服务器将使用以下模式提供网址:

/basic-url-here     // This style will serve html files built with a templating language from the server, so they need to be at the root path
/api/*

使用nginx服务所有这些文件并同时代理到后端服务器的正确/有效方法是什么?

2 个答案:

答案 0 :(得分:1)

您可以使用另一个位置块来映射您的api,并说Java后端服务器将在端口4000上运行:

location /api/ {
    proxy_pass http://localhost:4000:
     ..... <other configurations>
}

您可以阅读有关此内容以及其他配置in the documentation的更多信息。

希望有帮助!

答案 1 :(得分:0)

我找到了一个可行的解决方案,但我不知道它的效率如何。如果我删除了/asset位置块,并用它替换了/位置块,它将起作用:

location / {
    try_files $uri $uri/ @backend;
}

location @backend {
    proxy_pass http://backend:8080;
}

这是我的最终文件:

server {
    listen 80 default_server;
    listen [::]:80 default_server;
    root /root/web;
    index index.html;
    server_name _;

    access_log off;
    sendfile on;
    sendfile_max_chunk 512k;

    location / {
        try_files $uri $uri/ @backend;
    }

    location @backend {
        proxy_pass http://backend:8080;
    }

    location ~* \.(jpg|jpeg|png|gif|ico|webp|mp4)$ {
        expires 30d;
    }

    location ~* \.(css|js)$ {
        expires 10d;
    }

    gzip on;
    gzip_vary on;
    gzip_comp_level 4;
    gzip_min_length 256;
    gzip_proxied any;
    gzip_types application/javascript application/json application/x-font-ttf font/opentype image/* text/plain text/css text/xml text/javascript application/x-javascript application/xml;
    gzip_disable "MSIE [1-6]\.";
    gunzip on;

    # error_log /root/nginx-log.txt debug;
}

我不确定这是否是正确的方法。