4

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).

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;
    }

    }

}

EDIT:

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)

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

does this look like the part with the error?

4

1 に答える 1

7

あなたがやろうとしていることについてのあなたの説明に基づいて、私はあなたのnginx.confが次のようになるべきだと思います:

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)で実行しているサービスにプロキシします。

2番目のサーバーブロックでは、nginxは「wiki.example.com」に一致するリクエストをポート80でリッスンし、ポート9000でリッスンするphp(またはおそらくphp-fpm)を使用してそれらを処理します。

最後のサーバーブロックがデフォルトです。また、ポート80でリッスンしており、キャッチオールとして機能します。「site.example.com」または「wiki.example.com」に一致しないものはすべてここに表示され、例では「site.example」にリダイレクトされます。 com。」

追加情報

バックエンドサービスへのプロキシの上のロケーションブロックには、nginx confディレクトリ(/ usr / local / nginx / conf)に「proxy.conf」をロードするincludeステートメントが含まれています。プロキシパラメータを指定するために使用する構成の「proxy.conf」セットの例を次に示します。個別の構成ファイルを使用しない場合は、これらをインラインで指定できます。

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」のサーバーブロックコード例を更新しました。明確にするために、ルートディレクトリを絶対パスとして指定して、ファイルシステム上のどこにあるかを正確に把握できるようにすることをお勧めします。また、更新されたコードでは、@ backendブロックは、nginxが一致するものを見つけることができないすべてのリクエストをリダイレクトして、処理するメディアwikiindex.phpファイルに渡します。これにより、「wiki.example.com/Main_Page」のようなクリーンなURLを使用することもできます(これは「wiki.example.com/index.php?title=Main_Page」として書き直されます)。

于 2012-12-17T06:48:10.817 に答える