NGINX具有反向代理的多个服务器块 [英] NGINX multiple server blocks with reverse proxy

查看:76
本文介绍了NGINX具有反向代理的多个服务器块的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在Windows上运行nginx + PHP + MySQL和tomcat + postresql(我知道对资源的使用不是很好,对于某些项目,我只需要它们).

I am running nginx+PHP+MySQL, and tomcat+postresql on windows (i know its not a very good use of resources, i just need them all for certain projects).

,我需要有关nginx配置的一些帮助. 我最终计划在wiki.example.com和site.example.com是相同IP的端口80上运行nginx. 但是我想将对site.example.com的请求转发到localhost:8080的tomcat,并且对wiki.example.com的请求将由nginx提供.

and i need a little help with the nginx config. i eventually plan on running nginx on port 80 where wiki.example.com and site.example.com are the same IP. but i would like to forward requests for site.example.com to tomcat at localhost:8080, and requests for wiki.example.com will be served by nginx.

我知道我的问题出在哪里,只是因为我可以在控制台中看到错误;我无法设置两个位置/"设置,即使它们位于不同的服务器块中也是如此.这是我的配置,有人知道如何解决吗?

i know where my problem lies in the config, only because i can see the error in the console; i cant set two "location /" settings even if they are in different server blocks. here is my config, does anyone know how to fix it?

http {
include       mime.types;
default_type  application/octet-stream;

server {
listen 8080 default_server;
server_name _;
server_name_in_redirect off;
root  www/html;
}

server {
    listen       wiki.example.com:8080;
    server_name  wiki.example.com;

    location / {
        #proxy_pass http://localhost:80/;
        #proxy_set_header  Host $http_host;
        root   www/wiki;
        index  index.html index.htm index.php;
    }

    location ~ .php$ {
        root           www/wiki;
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include        fastcgi_params;
        index index.php;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   html;
    }

server {
    listen site.example.com:8080;
    server_name site.example.com;
    root www/html;

    location / {
        proxy_pass http://localhost:80/;
        proxy_set_header  Host $http_host;
        root   www/html;
        index  index.html index.htm index.php;
    }

    }

}

非常感谢您的帮助.我已经按照您的说明编辑了配置,并且大多数情况下都有效!! :) 导航到site.example.com将加载该网站(由nginx代理并通过tomcat进行投放)

thank you very much for your help. i have edited the config per your instruction and it mostly works!! :) navigating to site.example.com will load the site (proxied by nginx and served via tomcat)

导航到wiki.example.com将产生nginx 404消息,但是导航到wiki.example.com/index.php?title=Main_Page将正常加载mediawiki. 因此,似乎Wiki服务器块的默认设置混乱了.

BUT navigating to wiki.example.com will produce an nginx 404 message, but navigating to wiki.example.com/index.php?title=Main_Page will load mediawiki as normal. so it seems that the defaults are messed up for the wiki server block.

http://pastebin.com/znT8q6WQ

http://pastebin.com/znT8q6WQ

这看起来像是有错误的部分吗?

does this look like the part with the error?

推荐答案

根据您对要执行的操作的描述,我认为您的nginx.conf应该看起来像这样:

Based on your description on what you're trying to do, I think your nginx.conf should look something like this:

http {
    include       mime.types;
    default_type  application/octet-stream;

    server {
        listen 80;
        server_name site.example.com;

        # pass all requests to service listening on port 8080

        location / {
            include /usr/local/nginx/conf/proxy.conf;
            proxy_pass http://localhost:8080;
            proxy_redirect http://localhost:8080/ http://$host;
        }
    }

    server {
        listen 80;
        server_name wiki.example.com;
        root /path/to/your/www/wiki;
        index index.html index.htm index.php;

        location / {
            try_files $uri @backend;
        }

        location @backend {
            rewrite ^ /index.php?title=$request_uri last;
        }

        # proxy to php-fpm listening on port 9000

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass 127.0.0.1:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }

        # your other rules here...

        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root html;
        }

    }

    server {
        listen 80 default_server;
        server_name _;
        access_log off;
        return 301 $scheme://site.example.com$request_uri;
    }
}

在第一个服务器块中,nginx将在端口80上侦听与"site.example.com"匹配的请求,并代理您在8080(tomcat)上运行的任何服务.

In the first server block, nginx will listen on port 80 for requests matching "site.example.com" and proxy to whatever service you're running on 8080 (tomcat).

在第二个服务器块中,nginx将在端口80上侦听与"wiki.example.com"匹配的请求,并使用php(或大概是php-fpm)在端口9000上进行侦听.

In the second server block, nginx will listen on port 80 for requests matching "wiki.example.com" and use php (or presumably php-fpm) listening on port 9000 to process them.

最后一个服务器块是您的默认服务器.它还在端口80上侦听并充当一个包包-与"site.example.com"或"wiki.example.com"不匹配的内容都将在此处结束,在示例中,它仅重定向到"site.example". com."

The final server block is your default. It's also listening on port 80 and serves as a catchall -- whatever doesn't match "site.example.com" or "wiki.example.com" will end up here and in the example it just redirects to "site.example.com."

其他信息

代理后端服务的上方位置块包含一个include语句,该语句在nginx conf目录(/usr/local/nginx/conf)中加载"proxy.conf".这是我用来指定代理参数的示例"proxy.conf"配置集的示例-如果不使用单独的配置文件,则可以内联指定以下内容:

The location block above that proxies to a backend service contains an include statement that loads a "proxy.conf" in the nginx conf directory (/usr/local/nginx/conf). Here is an example "proxy.conf" set of configurations I use to specify the proxy parameters -- you can specify these inline if you do not use a separate configuration file:

proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 32m;
client_body_buffer_size 128k;
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
proxy_buffers 32 4k; 

"wiki.example.com"的更新的服务器阻止代码示例.为了清楚起见,我建议您将 root 目录指定为绝对路径,以便您和nginx确切知道在文件系统上的哪里可以找到它.另外,在更新的代码中, @backend 块将重定向Nginx找不到匹配项的所有请求,并将其传递给要处理的媒体Wiki index.php文件.这也使您可以使用干净的URL,例如"wiki.example.com/Main_Page"(它将被重写为"wiki.example.com/index.php?title=Main_Page").

Updated server block code example for "wiki.example.com." I would recommend for clarity that you specify your root directory as an absolute path so you and nginx know exactly where to find it on the file system. Also, in the updated code, the @backend block will redirect and pass all requests that nginx cannot find a match for to the media wiki index.php file to process. This also allows you to use clean URLs like "wiki.example.com/Main_Page" (and that will get rewritten as "wiki.example.com/index.php?title=Main_Page").

这篇关于NGINX具有反向代理的多个服务器块的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆