Nginx系列--03HTTP段基本配置及虚拟主机

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx系列--03HTTP段基本配置及虚拟主机相关的知识,希望对你有一定的参考价值。

HTTP协议配置格式

http {
    ...
    ...:各server的公共配置
    server {
        ...
    }:每个server用于定义一个虚拟主机;
    server {
        ...
        server_name 
        root
        alias
        location [OPERATOR] URL {
            ...
            if CONDITION {
                ...
            }
        }
    }
}

不同于HTTPD有一个默认的主机,nginx必须使用server指令定义一个虚拟主机。

HTTP协议配置

所有的配置如果不加说明的话,都是配置在/etc/nginx/nginx.conf中

1.套接字相关配置

(1)server { ... }

  • 作用:配置一个虚拟主机
  • 示例:
    server {
    listen address[:port] | port;
        server_name SERVER_NAME;
        root /PATH/TO/DOCUMENT_ROOT;
    }

(2)listen

语法
listen PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE
listen address[:port] [default_server] [ssl] [http2 | spdy] [backlog=number] [rcvbuf=size] [sndbuf=size]
上下文
只能放在server配置段中
解释

  • PORT|address[:port]|unix:/PATH/TO/SOCKET_FILE:指明监听的地址和端口的方式,如果ip不指明则默认为本机所有ip,如果端口不指明则为80端口。若两则都省略则监听在本机所有ip的80端口上。
    unix:/PATH/TO/SOCKET_FILE:表明通过socket文件进行通行,那就只能用于本机通信。
  • default_server:指明默认处理请求的虚拟主机,在多个虚拟主机监听了同样的ip和port时,指明默认处理请求的虚拟主机。
  • [ssl] [http2 | spdy] :指明客户端请求资源时使用的协议。
  • [backlog=number]:监听套接字在处理请求时,如果处理不来,则将来不及处理的请求放入后援队列。backlog指明后援队列的大小。
  • [rcvbuf=size]:监听套接字接受缓冲区大小。
  • [sndbuf=size]:监听套接字发送缓冲区大小。
    配置示例
    listen 80 default_server
    listen 127.0.0.1:80 ssl backlog=512

(3)root

语法
root PATH
上下文
http、 server、 location、if in location
放置在不同的上下文中意味着生效范围的不同。
解释
指明用户访问资源时对应于主机根目录。
示例
root /var/www/vhost;
如果用户访问的URL为http://192.168.239.131/index.html ,将会获取主机上/var/www/vhost/index.html资源。也就是说URL中/index.html的/代表主机上的/var/www/vhost路径。root指明的路径如果不存在,语法检测时并不报错。如果多个上下文中有root配置,范围小的生效。

(4)server_name

指明虚拟主机的主机名称;可以指明多个,用空白字符分割
支持通配任意长度的任意字符;server_name .baidu.com www.baidu. 。基于
支持~起始的字符做正则表达式模式匹配;server_name ~^www\d+.baidu.com$
匹配机制:首先是精确匹配,再是左侧
匹配,再是右侧*匹配,最后是正则表达式。

虚拟主机配置示例

  • 基于IP的虚拟主机
    node1节点有两个IP,192.168.239.131和192.168.239.132。不同的IP监听在相同的端口上,构成基于IP的虚拟主机
    配置文件为:

    http {
    server {
        listen 192.168.239.131:80 ;
        server_name node1;
        root /var/www/vhost/131;
    }
    server {
        listen 192.168.239.132:80 ;
        server_name node1;
        root /var/www/vhost/132;
    }
    }

    ~]# mkdir /var/www/vhost/{131,132} -pv
    ~]# echo "131 virtual host" > /var/www/vhost/131/index.html
    ~]# echo "132 virtual host" > /var/www/vhost/132/index.html
    ~]# nginx -t
    ~]# nginx -r reload
    技术分享图片

  • 基于端口的虚拟主机
    不同的虚拟主机监听在相同IP地址不同端口上
    配置文件/etc/nginx/nginx.conf中http端配置
    http {
    server {
        listen 192.168.239.131:80;
        server_name node1;
        root /var/www/vhost/80;
    }
    server {
        listen 192.168.239.131:808;
        server_name node1;
        root /var/www/vhost/808;
    }
    }

    技术分享图片

  • 基于IP和PORT的混合虚拟主机
    虚拟主机监听在不同IP和不同端口上
    配置文件/etc/nginx/nginx.conf中http端配置
    http {
    server {
        listen 192.168.239.131:80;
        server_name node1;
        root /var/www/vhost/131_80;
    }
    server {
        listen 192.168.239.132:808;
        server_name node1;
        root /var/www/vhost/132_808;
    }
    }

    技术分享图片

  • 基于FQDN的虚拟主机
    虚拟主机监听在相同的IP和端口上,不同的是用于访问虚拟主机时域名的不同。Nginx会通过请求头部中的Host的值确定交由那个虚拟主机处理请求。
    配置文件配置/etc/nginx/nginx.conf
    http {
    server {
        listen 192.168.239.131:80;
        server_name vhost1;
        root /var/www/vhost/vhost1;
    }
    server {
        listen 192.168.239.131:80;
        server_name vhost2;
        root /var/www/vhost/vhost2;
    }
    }

    技术分享图片
    访问结果
    技术分享图片

2.与路径映射相关

(1)location

语法
location [ = | ~ | ~* | ^~ ] uri { ... }
解释
用于实现从uri到文件系统的路径映射;ngnix会根据用户请求的URI来检查定义的所有location,并找出一个最佳匹配,而后应用其配置;。在一个server中location可以有多个,并且location可以嵌套。但需要注意的是“=”进行精确匹配时嵌套,nginx -t进行语法检测时会报错。匹配URI的方式有如下几种:

=:对URI进行精确匹配;精确匹配一旦匹配到,URI匹配机制就会关闭,起到了加速匹配的作用
location = / {
...此种配置只有http://192.168.239.131/ 能够匹配到,而http://192.168.239.131/index.html 不能匹配到,不然怎么称之为精确匹配呢。
}
^~:对URI左半部分做匹配检测,不区分大小写。此匹配一旦匹配到就会终止匹配,不会进行正则表达式匹配。
~:正则表达式匹配,区分大小写。
~*:正则表达式匹配,不区分大小写。
不带符号:匹配起始于此uri的所有URI。

既然有多种匹配方式,那就一定有优先级的问题。匹配优先级为:=,^~,~/~*,不带符号;
优先级示例

location = / {
    [ configuration A ]
}

location / {
    [ configuration B ]
}

location /documents/ {
    [ configuration C ]
}

location ^~ /images/ {
    [ configuration D ]
}

location ~* \.(gif|jpg|jpeg)$ {
    [ configuration E ]
}

若我们的访问URI为“/”,将会匹配到配置A;若访问URI为“/index.html”,将会匹配到配置B;若我们访问的URI为“/document/index.html”,将匹配到配置C;若我们访问的URI为“/images/1.jpg”,将会匹配到配置D;如果访问URI为“/document/1.jpg”,将会匹配到配置E。
root和location同时配置示例
配置文件配置/etc/nginx/nginx.conf

server {
    listen 80;
        server_name node1;
    location /admin/ {
            root /var/www/vhost;
        }
}

那么请问,http://192.168.239.131/admin/ 会获取主机/var/www/vhost/index.html文件,还是/var/www/vhost/admin/index.html?
技术分享图片
从上图结果可以看出,root指明的路径等同于“/admin/”中左“/”,所以获取主机资源路径为“/var/www/vhost/admin/index.html”。root指明的路径中右斜线可有可无,即/var/www/vhost和/var/www/vhost/都可。但需要注意的是location中/admin/和/admin是不同的。我们可以看如下示例:

http {
    server {
            listen 80;
          server_name node1;
          location /admin {
              root /var/www/vhost/;
          } 
    }
}

技术分享图片
从上图我们可以看到,用户访问URI为/admin,服务器返回一个301临时重定向,重定向的URI为/admin/,然后浏览器会再次发起请求,请求的URI为/admin/。在反向代理情景中我们可能不需要此功能,那么我们可以使用精确匹配

http {
    server {
            listen 80;
          server_name node1;
          location = /admin {
              root /var/www/vhost/;
          } 
    }
}

(2)alias

语法
alias path;
解释
定义路径别名,将制定的location替换成alias制定的路径。只能放在location中,不能与root指令同用。
示例

http {
    server {
        listen 80;
          server_name node1;
        location /admin/ {
              alias /alias/;
        }
    }
}

技术分享图片
可以看到alias指明的路径是相对于根文件系统的。
还需注意的是location中的路径和alias的路径右斜线要同时存在或不存在,否者资源会访问不到。例如:

location /admin {
    alias /alias/;
}
或
location /admin/ {
    alias /alias;
}
都是错误的,不可取

(3)index

用法
index file ...;
解释
用于指定默认访问资源,可用在http,server,location中。当用于访问的资源对应的路径是目录时,默认访问此目录的文件
示例

http {
    server {
                    listen 80;
                    server_name node1;
                    location / {
                            root /var/www/vhost/;
                            index a.html;
                    }
    }
}

技术分享图片

(4)error_page

语法
error_page code ... [=[response]] uri;
解释
对于特定的错误返回一个指定的uri。code对应特定的错误。=response,指明返回给用户时的状态码。
示例1
我们将404错误定向百度页面

http {
    server {
        listen 80;
        server_name node1;
          location / {
              root /var/www/vhost/;
              error_page 404 http://www.baidu.com;
      }
    }
}

技术分享图片
示例2
在正常线上环境,我们都会有对应的错误页面返回,并不会上上面那样重定向到百度页面。而在线上环境我们的配置往往是这样

http {
    server {
            listen *:80;
                server_name node1;
                locastion / {
                    root /var/www/vhost/;
                        error_page 404 /404.html
                }

                location /404.html {
                    root /etc/nginx/error_pages/;
                        index 404.html;
                }
        }
}

技术分享图片
访问一个不存在的页。
技术分享图片
示例3--返回一个指定的响应码

http {
    server {
            listen *:80;
                server_name node1;
                locastion / {
                    root /var/www/vhost/;
                        error_page 404 =200 /404.html
                }

                location /404.html {
                    root /etc/nginx/error_pages/;
                        index 404.html;
                }
        }
}

技术分享图片

注意:示例1和示例2,3是不同,示例1是做了重定向,而示例2,3是nginx内部重新做了路径映射。所以示例一种使用=reponse是达不到指定响应码的效果。

参考

https://nginx.org/en/docs/http/ngx_http_core_module.html

以上是关于Nginx系列--03HTTP段基本配置及虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

Nginx +Tomcat 动静分离及Tomcat配置文件优化

Nginx中的模块分类及常见配置项说明

Nginx技术深度剖析

nginx配置系列nginx配置语法解读

nginx配置虚拟主机

Centos 7搭建Nginx网站服务器及配置虚拟主机