如何在Nginx上正确设置虚拟主机?

时间:2014-05-02 13:46:49

标签: python nginx flask cherrypy uwsgi

尝试设置Nginx处理2个域我遇到了一些问题。虽然我的两个域的设置与静态html处理正常工作,但试图推进并启动Nginx背后的两个python应用程序。我尝试了一些不同的wsgi容器和不同的微框架,但问题是Nginx无法处理虚拟主机,而是它只在两个域地址处提供一个应用程序。

这是Nginx conf:

user www-data;
worker_processes 8;
pid /var/run/nginx.pid;

events {
    worker_connections 768;
}

http {
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 65;
    types_hash_max_size 2048;

    server_names_hash_bucket_size 64;
    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;
    gzip on;
    gzip_disable "msie6";

    server {
      listen 80;
      server_name www.domainA.com;
      root /var/www/domainA.com;

      location / {
         proxy_set_header    Host                $host;
         proxy_set_header    X-Real-IP           $remote_addr;
         proxy_set_header    X-Forwarded-For     $remote_addr;
         proxy_set_header    X-Originating-IP    $remote_addr;
         proxy_set_header    HTTP_REMOTE_ADDR    $remote_addr;
         proxy_set_header    REMOTE_ADDR         $remote_addr;
         proxy_set_header    CLIENT_IP           $remote_addr;
         proxy_pass http://127.0.0.2:7000;
      }
    }
    server {
      listen 80;
      server_name www.domainB.com;
      root /var/www/domainB.com;

      location / {
... ... blah blah...same story...except this proxy pass.....
         proxy_pass http://127.0.0.1:5000;
      }
    }
}

任何帮助?

修改

尝试将空服务器块添加为第一个块,然后返回404。

4 个答案:

答案 0 :(得分:0)

这些是面向外部的网站吗?

如果你把完整的ip放在你的listen子句中,你应该开始正常工作。

listen 512.548.595.485:80;

现在你有两个网站的服务器ip导致冲突。

希望这有帮助。

答案 1 :(得分:0)

在虚拟主机共享ip和端口的senario中,nginx通过将客户端发送的Host头与每个服务器的server_name条目进行比较来选择正确的虚拟主机。如果您curl使用以下内容来查看您为主机标头发送的确切内容:

curl -s --trace-ascii - http://www.domainA.com | grep 'Host:'

要使您的server_name更灵活,请使用.example.com表示法。这是example.com和* .example.com的简写。或者只需添加任意数量的server_name条目。

接下来确认您的应用正在侦听正确的ips和端口。 Shell进入您的服务器并尝试:

curl -I 'http://127.0.0.1:5000'
curl -I 'http://127.0.0.2:7000'

答案 2 :(得分:0)

最后我结束了这样的问题。在测试条件下,我没有添加任何会使Nginx满意的口味。然后我找到了THIS LINK

如果“Host”标头字段与服务器名称不匹配,NGINX会将请求路由到此端口的默认服务器。默认服务器是nginx.conf文件中列出的第一个服务器。如果在服务器上下文中的listen指令中设置了default_server参数,则将覆盖此值。下面给出一个例子。

Nginx文档和教程分散在少数网站上,因此找到少数并不意味着您得到了所需的所有答案。

答案 3 :(得分:0)

我认为,这是你的解决方案。创建一个名称应为virtualhost.sh的BASH文件。复制并粘贴以下代码:

#!/bin/bash

domain=$1
root="/data/$domain"
block="/etc/nginx/sites-available/$domain"

# Create the Document Root directory
mkdir -p $root

# Assign ownership to your regular user account
chown -R $USER:$USER $root

# Create the Nginx server block file:
tee $block > /dev/null <<EOF 
server {
    listen 80;
    listen [::]:80;

    root /data/$domain;
    index index.php index.html index.htm;

    server_name $domain www.$domain;

    location / {
        try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_buffer_size 128k;
        fastcgi_buffers 4 256k;
        fastcgi_busy_buffers_size 256k;
        include fastcgi_params;
    }

    location ~ /\.ht {
        access_log off;
        log_not_found off;
        deny all;
    }

    location ~* \.(jpg|jpeg|gif|png|css|js|ico|xml)$ {
        access_log        off;
        log_not_found     off;
        expires           30d;
    }

    location = /favicon.ico {
        log_not_found off;
        access_log off;
    }

    location = /robots.txt {
        allow all;
        log_not_found off;
        access_log off;
    }

}

EOF

# Link to make it available
ln -s $block /etc/nginx/sites-enabled/

# Test configuration and reload if successful
nginx -t && service nginx reload

您需要调用此BASH文件:

virtualhost.sh www.yourdomain.com