Generic placeholder image
闲敲代码、落灯花
What's past is prologue

联系邮箱:email@hezehua.net


联系QQ:1907330840

座右铭

保持热情,持续学习,每日精进

nginx之虚拟主机与请求的分发

nginx之虚拟主机与请求的分发

本文与作者在csdn上的博文【nginx之虚拟主机与请求的分发】保持同步



由于IP地址有限,因此经常存在多个主机域名对应同一个IP地址的情况,这时nginx.conf中就可以按照server_name(对应用户请求中的主机域名)并通过server块来定义虚拟主机,每个server块就是一个虚拟主机,它只处理与之相对应的主机域名请求。这样,一台服务器上的nginx就能以不同的方式处理访问不同主机域名的http请求了。


相关配置项

(1). 监听端口

语法:listen address:port [default | default_server | ...]
默认:listen 80
配置块:server

listen参数决定Nginx服务如何监听端口。在listen后可以只加IP地址、端口或主机名,例如:

listen 127.0.0.1:8000;
listen 127.0.0.1;#默认监听80端口
listen 8000;#默认是127.0.0.1
listen *:8000;
listen localhost:8000

参数:
default:将所在的server作为整个Web服务的默认server块。如果没有设置这个参数,那么将会以在nginx.conf中找到的第一个server块作为默认server块。为什么需要默认虚拟主机呢?当一个请求无法匹配配置文件中的所有主机域名时,就会选用默认的虚拟主机。
default_server:同上。
其它参数暂时不列举。

(2)主机名称

语法:server_name name [...]
默认:server_name "";
配置块:server

server_name后可以跟多个主机名称,如server_name www.testweb.com、download.testweb.com;

在开始处理一个http请求时,Nginx会取出header头中的Host,与每个server中的server_name进行匹配,以决定到底由哪一个server块来处理这个请求。有可能一个host与多个server块中的 server_name 都匹配,这时就会根据匹配优先级来选择实际处理的server块。server_name与host的匹配优先级如下:
1)首先选择所有字符串都匹配的server_name,如www.testweb.com
2)其次选择通配符在前面server_name,如*.testweb.com
3)再次选择通配符在后面的server_name,如www.textweb.*
4)最后选择使用正则表达式才匹配的server_name,如~^.testweb.com$
如果Host与所有的server_name都不匹配,这时将会按下列顺序选择处理的server块:
1)优先选择在listen配置项后加入[default | default_server]的server块
2)找到匹配listen端口的第一个server块
如果server_name后跟着空字符串(如server_name ”“;),那么表示匹配没有Host这个http头部的请求。
(3)server_names_hash_bucket_size
语法:server_names_hash_bucket_size size;
配置块:http、server、location
为了提高快速找到相应server_name的能力,Nginx使用散列表来存储server_name。server_name_hash_bucket_size设置了每个散列桶占用的内存大小。
(4)server_names_hash_max_size

    语法:server_names_hash_max_size size;
    默认:server_names_hash_max_size 512
    配置块:http、server、location

server_names_hash_max_size会影响散列表的冲突率 。server_names_hash_max_size越大,消耗的内存就越多,但散列key的冲突率则会降低,检索速度也更快。server_names_hash_max_size越小,小号的内存就越少,但散列key嘚瑟冲突率就啃增高。
(5)重定向主机名称的处理
语法:server_name_in_rediect on | off;
默认:server_name_in_redirect on;
配置块:http、server或者location
该配置需要配合server_name使用,在使用on打开时,表示在重定向请求时会使用server_name里配置的第一个主机名代替原先请求的Host头部,而使用off关闭时,表示在重定向请求时使用请求本身的Host头部。
(6)location
语法:location [=|~|~*|@] /uri/ {…}
配置块:server
location会尝试根据用户请求后中的uri来匹配上面的/uri表达式,如果可以匹配,就选择location {}块中的配置来处理用户请求。当然,匹配方式是多样的,下面介绍location匹配规则。
1)= 表示把URI作为字符串,以便与参数中的uri完全匹配。例如:

    location = / {
        #只有当用户请求是 / 时,才会使用location下的配置
    }

2)~表示匹配URI时事字母大小写敏感的。
3)~*表示匹配URI时忽略字母大小写问题。
4)^~表示匹配URI时只需要其前半部分与uri参数匹配即可。例如:

   location ^~ /images/ {
        #以/images/开始的请求都会匹配上
        ...
    }

5)@表示仅用于Nginx服务内部请求之间的重定向,带有@的location不直接处理用户请求。
当然,在uri参数里是可以用正则表达式的,例如:

location ~* \.(gif|jpeg|jpg)$ {
    #匹配以.gif .jpeg .jpg 结尾的请求
    ...
}

注意,location是有顺序的,当一个请求有可能匹配多个location时,实际上这个请求会被第一个匹配上的location处理。

猜你喜欢
网站配置CDN的艰辛历程
阅读 202

以前就想着配置cdn了,但是一直配置不得法,添加完配置也没有生效,这两天认真研究了一下,终于解决了。 首先是在阿里云上的cdn配置: 加速域名:image.aaa.com,就是让网站访问图片的域名 回源域名:bbb.com,就是能真实访问到图片资源的域名,不过由于我的图片路径是IP访问的,我配置...

Nginx架构设计
阅读 179

1、Nginx是高度模块化设计的 2、Nginx模块化设计的特点 (1)高度抽象的模块接口 (2)模块接口非常简单,具有很高的灵活性 (3)配置模块的设计 (4)核心模块接口的简单化 (5)多层次、多类别的模块设计 3、所有模块都遵循同样的ngx_module_t接口设计规范 4、...

nginx配置静态资源允许跨域访问
阅读 206

在server模块中添加配置: add_header 'Access-Control-Allow-Origin' '*'; 例: server { listen 80; add_header 'Access-Control-Allow-...

配置虚拟主机
阅读 169

server { listen 8080; server_name localhost; location / { root /xxx/xxx/wordpress; index inde...

nginx之worker进程个数
阅读 225

nginx.conf配置文件中有一个worker_processes配置项,默认配置为: worker_processes 1 worker进程的数量会直接影响性能。 每一个worker进程都是单线程进程,它们调用各个模块以实现多种多样的功能,如果这些模块确认不会出现阻塞式...

nginx之反向代理服务器
阅读 149

本文摘抄自: 《深入理解Nginx 模块开发与架构解析》 反向代理(reverse proxy)方式是指用代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络中的上游服务器,并将从上游服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外的表现...

Nginx进程间通信机制
阅读 187

3种消息传递方式 1、共享内存 当多个进程共享同一块内存时,在任何一个进程修改了共享内存中的内容后,其它进程通过访问这段共享内存都能够得到修改后的内容。 Nginx通过进程间共享数据的主要方式就是共享内存。 2、套接字 频道是Nginx m...