F's Blog

博客 收藏夹
Nginx

22 Feb 2017

一个 Nginx 总的配置文件架构:

http {
    server {
        root /www/data;

        location / {
        }

        location /images/ {
        }

        location ~ \.(mp3|mp4) {
            root /www/media;
        }
    }
}

一般配置

静态内容

root

指定 http, server 或 location 要寻找文件的根目录。

try_files

没有找到的话返回最后的默认内容或地址,而不是 404

server {
    root /www/data;

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

    location @backend {
        proxy_pass http://backend.example.com;
    }

    location /images/ {
        try_files $uri /images/default.gif;
    }
}

可以看出 @backend 是定义了一个引用。

下面是一个 Rails Nginx 常用的案例,后面 @puma_app.com_production 是一个 puma app server location,通过反向代理返回数据。

try_files $uri/index.html $uri @puma_myapp.com_production;

反向代理

通过 proxy_pass 设置。

一个简单的例子:

location /some/path/ {
    proxy_pass http://www.example.com/link/;
}

/some/path/page.html URI 回跳到 http://www.example.com/link/page.html

如果需要将请求转给不是 HTTP 服务器的 server,那么这个 server 需要支持下面协议中的一个:

Rails 里 Puma 反向代理设置:

upstream puma_myapp.com_production {
  server unix:/home/deploy/apps/myapp.com/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  # ...

  location @puma_myapp.com_production {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto https;
    proxy_set_header Host $http_host;
    proxy_redirect off;

    # 定义过的 upstream
    proxy_pass http://puma_myapp.com_production;
    # limit_req zone=one;
    access_log /home/deploy/apps/myapp.com/shared/log/nginx.access.log;
    error_log /home/deploy/apps/myapp.com/shared/log/nginx.error.log;
  }
}

参考

本文由 付豪 创作,采用署名 4.0 国际(CC BY 4.0)创作共享协议进行许可,详细声明