使用 Nginx 作为 Web 服务器和反向代理

使用 Nginx 作为 Web 服务器和反向代理

我正在尝试将 Nginx 设置为反向代理和 Web 服务器。但是在尝试了解如何执行此操作时遇到了问题。

假设我使用默认的 Symfony2 nginx 配置(http://symfony.com/doc/current/cookbook/configuration/web_server_configuration.html):

server {
    server_name example.com www.example.com;
    root /var/www/project/web;

    location / {
        # try to serve file directly, fallback to app.php
        try_files $uri /app.php$is_args$args;
    }
    # DEV
    # This rule should only be placed on your development environment
    # In production, don't include this and don't deploy app_dev.php or config.php
    location ~ ^/(app_dev|config)\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
    }
    # PROD
    location ~ ^/app\.php(/|$) {
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_split_path_info ^(.+\.php)(/.*)$;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param HTTPS off;
        # Prevents URIs that include the front controller. This will 404:
        # http://domain.tld/app.php/some-path
        # Remove the internal directive to allow URIs like this
        internal;
    }

    error_log /var/log/nginx/project_error.log;
    access_log /var/log/nginx/project_access.log;
}

我想添加一个配置,以便 Nginx 也可以充当反向代理,而不仅仅是一个网络服务器。

  1. 我是否需要将、等配置添加到同一个配置文件proxy_passproxy_cache

  2. 我是否需要为特定路线设置配置?或者禁用它们?

  3. 例如,如果我不想/app_dev.php/abc缓存路线,我该怎么办?

答案1

基本上,nginx 是代理服务器。其功能包括代理 HTTP、HTTPS、IMAP、POP3、SMTP 和其他协议。对于 HTTP(S) 代理,后端可以是 FastCGI 服务器(如 PHP-FPM)或其他 Web 服务器。

对于您需要的 FastCGI 后端fastcgi 模块。例如,您需要使用 定义后端fastcgi_pass。要代理另一个网站,您需要HTTP 代理模块. 您需要使用诸如 这样的方向proxy_passproxy_cache控制此模块的行为。

  1. 我是否需要将 proxy_pass、proxy_cache 等配置添加到同一个配置文件中?

是的

  1. 我是否需要为特定路线设置配置?或者禁用它们?

例如你需要代理特定的URL www.example.com/myawesomeapp,然后使用location来匹配URL

location /myawesomeapp {
    proxy_pass http://<upstream_block_name>;
    ... other parameter ...;
}
  1. 例如,如果我不想缓存路由 /app_dev.php/abc?我需要做什么?

使用proxy_cache_bypass。您可以通过if以下指令进行设置本教程

相关内容