zoukankan      html  css  js  c++  java
  • Nginx 虚拟主机与请求分发

    前言:

    Nginx的静态web服务器主要是有ngx_http_core_module模块实现,Nginx静态web服务器这几篇文章记录如何配置一个包含基本功能的web静态服务器,主要是以下几个方面:

    1.虚拟主机与请求分发

    2.文件路径的定义

    3.内存与磁盘资源的分配

    4.网络连接的设置

    5.MIME类型的设置

    6.对客户端请求的限制

    7.文件操作的优化

    8.对客户端请求的特殊处理

    这篇文章主要记录如何配置虚拟主机与请求分发,后面几点会后面的文章中一一记录。

    由于IP地址的数量有限(这个应该都听过了,IP4已经无法满足要求了),因此经常会存在多个域名对应一个IP地址的情况,这时就可以在Nginx配置文件中按照server_name(对应请求中的域名)来定义虚拟主机,每一个server都是一个虚拟主机,它处理与主机域名相对应的请求,因此一台服务器上的Nginx可以处理不同主机域名的HTTP请求。

    1)监听端口

    语法:listen address:port[default(deprecated in 0.8.21)|default_server|

    [backlog=num|rcvbuf=size|sndbuf=size|accept_filter=filter|deferred|bind|ipv6only=[on|off]|ssl]];

    默认:listen 80;

    listen参数决定了Nginx服务如何监听端口,其中可以配置IP地址、端口、主机名,十分灵活,如下

    listen 127.0.0.1:8000; 
    listen 127.0.0.1; #默认监听80端口
    listen 8000;
    listen *:8000;
    listen localhost:8000;
    listen [fe80::1];        #IPV6配置
    listen [:::a8c9:1234]:80;#IPV6配置
    listen 443 default_server ssl;
    listen 127.0.0.1 default_server accept_filter=dataready backlog=1024;
    
     
    
    

    接下来介绍一下listen参数的意义:

    1.default:将所在的server块作为整个web服务的默认server块,默认nginx.conf中第一个server块为默认server。无法匹配任意一个主机域名的请求都会交给默认server处理。

    2.default_server:与default一致。

    3.backlog=num:表示tcp中backlog队列的大小,-1表示不做设置。在TCP三次握手的过程中,进程还没有开始处理监听句柄时,这些连接就会放在backlog队列中等待处理,如果backlog队列满了,新的TCP请求将不会建立连接。

    4.rcvbuf=size:设置监听句柄的SO_RCVBUF参数。

    5.sndbuf=size:设置监听句柄的SO_SNDBUF参数。

    6.accept_filter:设置accept过滤器,只对FreeBSD操作系统有用。

    7.deferred:设置该参数之后,worker不会被调度去处理仅仅完成TCP三次握手的连接,只要在用户真正的发送请求数据的时候(内核已经在网卡中收到请求数据包),内核才会调度worker进程去处理这个连接。该参数适合于大并发的情况,它可以有效的减轻worker进程的负担。

    8.bind:绑定当前端口/地址对,当同时对一个端口监听多个地址时生效。

    9.ssl:当前监听端口必须基于ssl协议。

    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来处理这个请求,也可能一个请求与多个server匹配,这将涉及到server_name匹配的优先级:

    1.选择所有字符串完全匹配的server_name

    2.选择通配符在前面的server_name

    3.选择通配符在后面的server_name

    4.选择使用正则表达式匹配的server_name

    5.选择默认的server_name块

    6.选择第一个listen端口匹配的server块

    3)散列表内存占用

    语法:server_names_hadh_bucket_size size;

    默认:server_names_hash_bucket_size 32|64|128;

    配置块:http、server、location

    为了提高快速寻找到server_name的能力,Nginx使用散列表来保存server_name。该参数设置了每一个散列表占用内存大小。

    4)server_names_hash_max_size

    语法:server_names_hash_max_size size;

    默认:server_names_hash_max_size 512;

    配置块:http、server、location

    该参数会影响散列表的冲突率,该参数越大,消耗内存越多,但是散列key的冲突就越低,检索速度越快,反之亦然。

    5)重定向主机名称处理

    语法:server_name_in_redirect on|off;

    默认:server_name_in_redirect on;

    配置块:http、server或者location

    该配置需要和server_name一起,在打开时,表示在重定向请求时会使用server_name中配置的第一个主机名替代原先请求中的host头。关闭的话在重定向时还是使用请求本身的host头。

    6)location

    语法:location [=|~|~*|^~|] ...

    配置块:server

    location会尝试使用用户请求中的url来进行匹配,如果匹配成功,就选择location块中的 配置来处理用户的请求。location的匹配规则有多种,下面简单介绍一下;

    1.=表示将url进行完全匹配,如:

    
    
    location = /api/instance/ {
    #location配置
    }不
    
    

    2.~表示匹配时大小写敏感

    3.~*表示匹配时大小写不敏感

    4.^~表示匹配时只需要前半部分匹配即可

    5.@表示只处理Nginx服务内部的重定向,不直接处理用户请求

    6./表示匹配所有请求

    注:一个请求可能会匹配多个location,但是每一个请求都会被第一个匹配的location处理

  • 相关阅读:
    zoj3299 Fall the Brick
    hdu4533 威威猫系列故事——晒被子
    FZU 1650 1752 a^b mod c
    Codeforces Round #136 (Div. 1) B. Little Elephant and Array
    Codeforces Round #292 (Div. 1) C. Drazil and Park
    Uva 12436 Rip Van Winkle's Code
    Codeforces Beta Round #19 D. Points
    hdu1513 Palindrome
    poj1160 Post Office
    zjnu1181 石子合并【基础算法・动态规划】——高级
  • 原文地址:https://www.cnblogs.com/52why/p/13269104.html
Copyright © 2011-2022 走看看