server 配置块介绍

前面章节介绍了 nginx.conf 配置文件中的 http 配置块,本章节将介绍 http 配置块下面的 server 配置块。

在 nginx 中,一个 server 配置块代表了一个虚拟机主机。

什么是虚拟主机?

虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成多台 “虚拟” 的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的 Internet 服务器功能(WWW、FTP、Email 等等),同一台主机上的虚拟主机之间是完全独立的。

从网站访问者来看,每一台虚拟主机和一台独立主机完全一样。

利用虚拟主机,不用为每个要运行的网站提供一台单独的 Nginx 服务器或单独运行一组 Nginx 进程。虚拟主机提供了在同一台服务器、同一组 Nginx 进程上运行多个网站的功能。

Nginx 配置虚拟主机

在 Nginx 配置文件(nginx.conf)中,一个最简化的虚拟主机配置如下:

#user  nobody;
worker_processes  3;

events {
    #...
}

http {
    #...
    server {
        listen       8080;
        server_name  localhost;
        access_log  logs/host.access.log  main;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
    #...
}

上面配置中,server 配置块配置了一个监听 8080 端口的虚拟主机。其中其他参数如下:

listen

Nginx 通过 listen 指令指定的值监听网络请求,可以是 IP 协议的形式,也可以是 UNIX 域套接字。如果不设置 listen 指令,Nginx 在以超级用户运行时则监听 80 端口,以非超级用户运行时则监听 8000 端口。

listen 指令的指令值还针对监听方式提供了丰富的参数,如下所示:

  • address:若为 IP 协议,该参数值为指定绑定监听端口的 IP 或主机名;若为 UNIX 域套接字,则该参数值为 sock 文件路径,默认值 --

  • port:IP协议监听的端口,默认值 80

  • bind:指定 IP 及端口,默认值 address:port

  • ipv6only:只接收 IPv6 连接或接收 IPv6 和 IPv4 连接,默认值 on

  • default_server:当 http 指令域中包含多个虚拟主机时,该参数用于指定哪个虚拟主机是默认服务,默认将第一个顺序的 server 设为默认服务。默认服务可以用来处理没有 server_name 匹配成功的请求,默认值 --

  • http2:HTTP/2 协议支持,默认值 --

  • spdy:SDPY 协议支持,与 HTTP/2 协议不能同时存在,默认值 --

  • ssl:SSL 支持,默认值 --

  • proxy_protocol:在指定监听端口上启用 proxy_protocol 协议支持,默认值 --

  • fastopen:HTTP 处于保持连接(keepalive)状态时,允许不经过三次握手的 TCP 连接的队列的最大数,默认值 number

  • deferred:添加该参数后,在 TCP 三次握手的过程中,检测到客户端有数据时才将 TCP 状态置为 ESTABLISHED 状态,没有数据则直接丢弃,默认值 --

  • reuseport:默认情况下,所有的工作进程会共享一个 socket 去监听同一 IP 和端口的组合。该参数启用后,允许每个工作进程有独立的 socket 去监听同一 IP 和端口的组合,内核会对传人的连接进行负载均衡。适用于 Linux 3.9+,DragonFly BSD 和 FreeBSD 12+,默认值 --

  • so_keepalive:配置是否在监听的端口启用“TCP keepalive”机制。当设置为 on 时,默认等同于 so_keepalive=30m::10,表示 30 分钟无数据传输时发送探测包,发送 10 次,发送间隔使用系统内核参数 tcp_keepalive_intvl 的设定值,默认值 off

  • backlog:当阻塞时,设置挂起连接队列的最大长度,在 FreeBSD,DragonFly BSD 和 MacOS 操作系统上,默认值为 -1,其他平台上值为 511,默认值 -1/511

  • rcvbuf:socket 接收缓冲的大小,默认为 8k 字节,在接收数据比较大的场景中可以适当调整,默认值 --

  • sndbuf:socket 发送缓冲的大小,默认为 8k 字节,在发送数据较大的场景中可以适当调整,默认值 --

  • setfib:为监听套接字设置关联路由表,仅在 FreeBSD 系统上有效,默认值 number

  • accept_filter:为监听套接字设置过滤器,仅支持 FreeBSD 和 NetBSD 5.0+ 系统,默认值 filter

用法示例:

http {
    server {
        listen 127.0.0.1:8000;           # 监听127.0.0.1的8000端口
        listen 127.0.0.1;                # 监听127.0.0.1的默认80端口(root权限)
        listen 8000;                     # 监听本机所有IP的8000端口
        listen *:8000;                   # 监听本机所有IP的8000端口
        listen localhost:8000;           # 监听locahost的8000端口
        listen [::]:8000;                # 监听IPv6的8000端口
        listen [::1];                    # 监听IPv6的回环IP的默认80端口(root权限)
        listen unix:/var/run/nginx.sock; # 监听域套接字文件
        listen *:8000                   # 监听本机的8000端口
                default_server          # 当前服务是http指令域的主服务
                fastopen=30             # 开启fastopen功能并限定最大队列数为30
                deferred                # 拒绝空数据连接
                reuseport               # 工作进程共享socket这个监听端口
                backlog=1024            # 请求阻塞时挂起队列数是1024个
                so_keepalive=on;         # 当socket为保持连接时,开启状态检测功能
    }
}

server_name

server_name 指令主要用于配置基于名称的虚拟主机,server_name 指令在接到客户请求后的匹配顺序分别为:

(1)准确的 server_name 匹配,例如:

server {
     listen       80;
     server_name  domain.com  www.domain.com;
     ...
}

(2)以 * 通配符开始的字符串:

server {
     listen       80;
     server_name  *.domain.com;
     ...
}

(3)以 * 通配符结束的字符串:

server {
     listen       80;
     server_name  www.*;
     ...
}

(4)匹配正则表达式:

server {
     listen       80;
     server_name  ~^(?.+).domain.com$;
     ...
}

Nginx 将按照上面1、2、3、4顺序对 server_name 进行匹配,只要有一项匹配 server_name 后就会停止继续匹配。

access_log

该指令用来指定日志文件的存放路径、格式(把定义的 log_format 跟在后面)和缓存大小;如果不想启用日志则access_log off ;

location

location 指令的作用是根据用户请求的 URI 来执行不同的操作,也就是根据用户请求的网站 URL 匹配 location 配置块,匹配成功就执行 location 配置块中定义的相关操作。示例用法:

#user  nobody;
worker_processes  1;

http {
    #...
    server {
        listen       8080;
        server_name  localhost;

        #charset koi8-r;
        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        location ~ .php$ {
            proxy_pass   http://127.0.0.1;
        }

        location ~ .php$ {
            root           html;
            fastcgi_pass   127.0.0.1:9000;
            fastcgi_index  index.php;
            fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
            include        fastcgi_params;
        }
    }
    #...
}

关于更多 server 配置块的介绍将在后续章节娓娓道来。

对了,跟 Aapche 一样,Nginx 也可以配置多种类型的虚拟主机:

(1)基于IP的虚拟主机

(2)基于域名的虚拟主机

(3)基于端口的虚拟主机

关于怎样配置基于IP、域名和端口的虚拟主机后续章节将进行介绍。

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
公众号