一段时间以前,当在NGINX配置服务时,我发现服务器只有向公众打开的端口80。如果您希望服务器提供多个服务,则必须考虑如何重复使用端口。在这里,我们通过域名区分各种服务,即字段。配置如下:
http {
...
server {
listen 80;
server_name blog.cn;
root /home/www/blog;
...
}
server {
listen 80;
server_name laravel.cn;
root /home/www/laravel/public;
...
}
}
以上只是配置的简单版本,我们只需要注意这些版本即可。两个虚拟主机配置为收听同一端口。然后在本地主机文件中配置域名:
30.96.xx.xx blog.cn
39.96.xx.xx laravel.cn
39.96.xx.xx是服务器的外部网络地址。这样,您可以通过输入每个域名来跳到相应的服务。
此时,实现了端口重复使用,但是出现了一个问题:通常,服务器收听插座,即IP地址和端口号。 NGINX如何识别域名?而且,如果NGINX提供太多服务,寻找服务时会影响效率吗?让我们看一下下面的原理。
实际上,NGINX中的每个听力端口号都将分配一个结构:
typedef struct {
//socket地址家族
ngx_int_t family;
//监听端口
in_port_t port;
//监听的端口下对应着所有的ngx_http_conf_addr_t地址
ngx_array_t addrs;
} ngx_http_conf_port_t;
查看结构成员,您可以知道,除了拥有IP地址和端口号外,还可以维护一种动态数组。该动态数组的类型也是一种结构,定义如下:
typedef struct {
//监听套接字的各种属性
ngx_http_listen_opt_t opt;
//完全匹配server_name的散列表
ngx_hash_t hash;
...
//servers动态数组中的成员将指向ngx_http_core_srv_conf_t结构体
ngx_array_t servers;
} ngx_http_conf_addr_t;
中间也省略了一些成员。您会看到结构重量保持动态阵列。此数组类型是NF_T结构,该结构对应于每个虚拟主机配置。也就是说,每次我们在配置文件中定义虚拟主机{}时,Nginx都会生成NF_T结构并将其添加到与听力端口相对应的动态数组中。总体示意图如下:

回顾一下最初的问题,实际上,当开始处理HTTP请求时,将获得HTTP标头的主机值。该主机存储访问的域名。在获得域名后,即值之后,它不会穿越动态数组,因为如果{}太多{},它将影响效率。 HTTP框架使用哈希列表来存储虚拟主机,其中每个元素的密钥是字符串,值是NF_T结构的指针。这将很快响应客户的要求。
扫一扫在手机端查看
-
Tags : nginx端口复用
我们凭借多年的网站建设经验,坚持以“帮助中小企业实现网络营销化”为宗旨,累计为4000多家客户提供品质建站服务,得到了客户的一致好评。如果您有网站建设、网站改版、域名注册、主机空间、手机网站建设、网站备案等方面的需求,请立即点击咨询我们或拨打咨询热线: 13761152229,我们会详细为你一一解答你心中的疑难。


客服1