/etc/nginx/proxy_params

/etc/nginx/proxy_params

警告:到目前为止,我只学会了如何使用 nginx 为具有自己的域和服务器块的应用程序提供服务。但我认为是时候深入研究一下了。

为了减少对多个 SSL 证书或昂贵的通配符证书的需求,我想从一个 nginx server_name 提供多个应用程序(例如 rails 应用程序、php 应用程序、node.js 应用程序)。例如 rooturl/railsapp rooturl/nodejsapp rooturl/phpshop rooturl/phpblog

我不确定理想的策略。我见过或想到的一些例子:

  1. 多个位置规则,这似乎会导致各个应用程序配置要求之间发生冲突,例如不同的重写和访问要求

  2. 通过后端内部端口隔离应用程序,这可能吗?每个端口路由到自己的配置?因此配置是隔离的,可以根据应用程序要求定制。

  3. 反向代理,我不太清楚它是如何工作的,这是我需要研究的吗?这实际上是上面的 2 吗?在线帮助似乎总是代理到另一台服务器,例如 apache

通过子 uri 隔离从单个域提供服务的应用程序的配置要求的有效方法是什么?

答案1

Nginx 可以做很多事情,包括反向代理、缓存和提供内容,但在大型环境中,各个功能会被拆分,以使它们更易于维护或使用更适合的替代方案进行专门化(例如适用于大容量 https:// 的 stud)。

反向代理只是表示位于客户端和实际应用程序之间的某种东西;它实际上是一个误称,应该被称为“服务器代理”。

要在一个域上通过一个证书提供所有内容,请从以下命令开始:

(在 Ubuntu LTS 12.04 上测试)

/etc/nginx/proxy_params

#proxy_set_header Host            $proxy_host; # instead of standard $host
proxy_set_header  X-Real-IP       $remote_addr;
proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;

/etc/nginx/sites-enabled/global_redirects

# note: must disable the built-in 
#       /etc/nginx/sites-enabled/default by removing it (it's a symlink) 
server {

    # redirects all http:// requests to https://
    # critically, passes the original host the client was trying to connect to.
    rewrite ^ https://$host$request_uri? permanent;

    # combined redirect access and error logs for easier correlation
    error_log  '/var/log/nginx/global_redirects';
    access_log '/var/log/nginx/global_redirects';

}

/etc/nginx/sites-enabled/global_ssl

# This serves all enabled-locations over ssl only.
# If there's no match, it shows the default site.

include /etc/nginx/upstreams-enabled/*; # include enabled upstream proxies

server {

    listen 443 ssl;

    ssl_certificate      /etc/nginx/server.crt;
    ssl_certificate_key  /etc/nginx/server.key;

    keepalive_timeout    70;

    root /usr/share/nginx/www;
    index index.html index.htm;

    access_log '/var/log/nginx/global_ssl';
    error_log  '/var/log/nginx/global_ssl';

    include /etc/nginx/locations-enabled/*;

}

/etc/nginx/locations-enabled/bar

# points to hackernews but
# it could be http://10.2.4.5:401/app495 instead
location ~ ^/bar(/.*)?$ {

    include proxy_params;
    include apps/node;

    proxy_pass       http://news.ycombinator.com/$1;

    access_log '/var/log/nginx/bar';
    error_log  '/var/log/nginx/bar';

}

/etc/nginx/locations-enabled/foo

location ~ ^/foo(/.*)?$ {

    include proxy_params;
    include apps/ruby;

    proxy_pass       http://www.linode.com/$1;

    access_log '/var/log/nginx/foo';
    error_log  '/var/log/nginx/foo';

}

/etc/nginx/upstreams-enabled/news.ycombinator.com

upstream news.ycombinator.com {
  server news.ycombinator.com;
}

/etc/nginx/upstreams-enabled/www.linode.com

upstream www.linode.com {
  server www.linode.com;
}

/etc/nginx/apps/ruby

# Place ruby specific directives here

/etc/nginx/apps/节点

# Place node specific directives here

请记住,这不会重写页面中的 URL,因为这些 URL 是由每个应用程序生成的。相反,每个应用程序都应该知道其外部方案、主机、端口和 URL 基础,并适当地生成链接(大多数实际应用程序都支持此功能)。

参考:

  1. http://wiki.nginx.org/HttpProxyModule
  2. http://wiki.nginx.org/HttpSslModule

相关内容