nginx多站点配置

发布于 2016-04-24  10038 次阅读


因为想搭建web邮件服务,所以需要使用到nginx的多站点。在实际生活中一台vps只用来做web服务器,有点浪费的说,所以记录一下nginx的多站点的配置方法。

博主的nginx是按照这篇整理来搭建的:Centos6.5编译安装Tengine和PHP7

Nginx配置文件结构

首先看一下nginx.conf的大致结构

....
http{
        ....
     server {
            ....
        location / {
               ....
        }
            ....
        location ~ \.php$ {
               ....
       }
           ....
    }

}
....

可以看到http包含了一个server,server中定义了一个站点的基本信息。所以nginx得多站点配置方法即为将server部分写进一个独立的文件中。然后在nginx.conf中的http大括号内引入这个的独立的server部分的配置文件。

a.com

以建立a.com和b.com两个域名为例。

在nginx的配置文件目录下新建一个vhosts文件夹专门用来存放各站点的配置信息(即server部分)

# mkdir /usr/share/nginx/conf/vhosts

新建a.com.conf文件,作为a.com站点的配置文件。将原nginx.conf中的server部分复制到这个文件里。并做适当的修改。例如

# vim /usr/share/nginx/conf/vhosts/a.com.conf
server {
        listen 80;
        server_name a.com;
        #access_log /usr/share/nginx/logs/access_ 51mail.log main;
        location / {
                root /usr/share/nginx/html/51mail;
                index index.php index.html index.htm;
        }
        #error_page 500 502 503 504 /50x.html;
        location = /50x.html {
                root /usr/share/nginx/html;
        }
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
                fastcgi_pass 127.0.0.1:9000;
                fastcgi_index index.php;
                fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/51mail/$fastcgi_script_name;
                include fastcgi_params;
        }
        location ~ /\.ht {
                deny all;
        }
}

注意修改server_name,如果是一级域名的话,注意不要带有www。如果带有的话,使用a.com访问的是默认的站点而不是www.a.com。

注意修改root的路径,指定一个新的路径作为网站的根目录。然后就是php的fastcgi中的路径。

b.com

b.com的配置文件和上面类似。

nginx中引入多站点的配置文件

最后只要在nginx的http的大括号内引入配置好的各站点文件。注意引入的位置,比如:

....
http{
        ....
     server {
            ....
        location / {
               ....
        }
            ....
        location ~ \.php$ {
               ....
       }
    }
    # 包含所有的虚拟主机的配置文件 
    include /usr/share/nginx/conf/vhosts/*;
         ....
}
....

如上,则原来的nginx的http里面的那个server就会作为默认站点继续运行。

最后重启nginx服务,即可生效!

报错

记录一个重启nginx服务时遇到的错误:

# service nginx restart
Stopping nginx:                                            [FAILED]
Starting nginx: nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32

解决方法如下:

在nginx.conf的http{}里面添加这句:

server_names_hash_bucket_size 64;

如果64还不够,那么就按32的倍数往上加。

下面是在中文wiki上摘抄的一段说明:

保存服务器名字的hash表是由指令 server_names_hash_max_size 和 server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果 hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键值。因此,如果Nginx给出需要增大 hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的


风雨兼程路,雨雪初霁时