文章目录

  • 一、认识配置文件
  • 1、整体结构
  • 2、各"块"功能
  • 3、最详细的配置文件解释
  • 二、配置虚拟主机
  • 1、什么是虚拟主机?
  • 2、虚拟主机类型
  • 3、配置虚拟主机



  如果你还没有搭建nginx,那就从这里开始吧!

一、认识配置文件

1、整体结构

  nginx的配置文件nginx.conf位于其安装目录下的conf目录下,在具体解读nginx配置文件之前,我们先了解配置文件的整体结构,这有利于更快速准确了解配置文件哦。


nginx 识别文件还是文件夹 nginx文件解析_nginx 识别文件还是文件夹


2、各"块"功能

  从上图相信大家都可以看出来,nginx的配置文件主要分为 6个块(部分),其中:

  • main块(全局设置):配置影响nginx全局的指令。通常有:配置运行Nginx服务器的用户(组)、允许生成的worker process数、日志的存放路径、Nginx进程PID存放路径和配置文件引入等。
  • event块:配置影响nginx服务器或与用户的网络连接。通常有:是否开启网络连接序列化、是否允许同时接受多个网路连接、指定哪种事件驱动模型处理连接请求和设置每个进程的最大连接数等。
  • http块:配置代理、缓存和日志定义等绝大多数功能和第三方模块。http块中可以配置本身的全局块,也可以嵌套多个server块。其中,http的全局块中通常有:文件引入、mime-type定义、日志自定义(如:是否开启服务日志、自定义日志格式)、是否使用sendfile传输文件,连接超时时间,单连接请求数、是否开启gzip压缩输出等。
  • upstream块(负载均衡服务器设置):这部分在后续的nginx负载均衡中再详细解释。
  • server块(主机设置):配置虚拟主机的相关参数。与http相同,server块可以包含本身的全局块,也可以嵌套多个location块。其中,http的全局块中通常有:单连接请求上限次数、监听端口、监听地址等。
  • location块(URL匹配特定位置的设置):配置请求的路由,以及各种页面的处理情况。主要是基于nginx服务器所接收到的请求url对预先所配置的规则进行匹配,从而决定走哪个location。

3、最详细的配置文件解释

  ① main块

########### 每个指令必须有分号结束。#################
#user administrator administrators;    #配置用户和用户组(可选),默认为nobody nobody,即所有用户都可以启动Nginx进程
#worker_processes 2;    #指定启动多少进程来处理请求,默认为1,一般情况下设置成CPU的核数
#pid /nginx/pid/nginx.pid;    #指定nginx进程运行文件存放位置
error_log log/error.log debug;    #定义全局错误日志文件位置、级别。日志输出级别有:debug|info|notice|warn|error|crit|alert|emerg。

tipsⅠ全局错误日志输出级别中,debug > info > notice > warn > error > crit > alert > emerg。debug输出日志最为最详细,以此类推,crit输出日志最少。

  ② event块

########### 每个指令必须有分号结束。#################
events {
    accept_mutex on;    #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;    #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;    #事件驱动模型(nginx工作模式),select|poll|epoll|kqueue|resig|/dev/poll|eventport
    worker_connections  1024;    #每个worker进程最大连接数,默认为512
}

tipsⅠ:惊群现象简而言之,就是多进程(多线程)在同时阻塞等待同一个事件的时候(休眠状态),如果等待的这个事件发生,那么他就会唤醒等待的所有进程(或者线程),但是最终却只可能有一个进程(线程)获得这个时间的“控制权”,对该事件进行处理,而其他进程(线程)获取“控制权”失败,只能重新进入休眠状态。
  为什么要防止惊群现象的发生?
    ① 系统对用户进程/线程频繁地做无效的调度,上下文切换系统性能大打折扣。
    ② 为了确保只有一个线程得到资源,用户必须对资源操作进行加锁保护,进一步加大了系统开销。


tipsⅡ:一般来说最常用的事件驱动模型有:select、poll、epoll。
    其中,select、poll属于标准事件模型,区别在于Linux和Windows都支持select模型,poll模型仅能用于Linux平台。
    epoll、kqueue属于高效事件模型,区别在于epoll用于Linux平台,而kqueue模型用于BSD系列平台。
    对于Linux系统,首选epoll工作模式,只有当前系统不存在更有效的方法时,才会使用select和poll。


tipsⅢ:进程的最大连接数受系统限制参数的最大打开文件数限制,使用命令"ulimit -SHn 数字"(临时修改)或修改配置文件"/etc/security/limits.conf"(永久修改)即可修改系统限制参数。
    配置文件需要在文件末尾添加两行:
    * soft nofile 数字
    * hard nofile 数字

  ③ http块

########### 每个指令必须有分号结束。#################
http {
    include       mime.types;    #将mime.types文件包含到配置文件中,减少主配置文件的复杂度
    default_type  application/octet-stream;    #默认文件类型,默认为text/plain,这个类型会让浏览器认为响应是普通的文件流,,并提示用户下载文件
    access_log  logs/access.log  main;    #自定义服务日志 "路径and名称"
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';    #自定义服务日志"格式",这也是默认的combined日志格式
    sendfile on;   #开启高效文件传输模式,默认为off
    #tcp_nopush on;    #提高网络性能,仅使用sendfile功能时才被启用
    #tcp_nodelay on;    #提高网络性能,仅在将连接转变为长连接的时候才被启用
    keepalive_timeout 65;    #长连接超时时间,默认为75s
    sendfile_max_chunk 100k;    #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限
    #gzip  on;    #开启gzip实时压缩输出功能(需配置HttpGzip模块)
    }

tipⅠmime.types是一个文件扩展名与文件类型映射表,浏览器根据mime.type文件定义的对应关系可以判断如何处理文件,打开or下载。


tipⅡ:如果web程序和mime.type文件都没有设置对应文件扩展名,那么就默认使用default_type定义的类型来对文件进行处理。可以通过该选项避免浏览器自动播放文件。


tipⅢ自定义日志格式中各变量的含义:
  $remote_addr 与 $http_x_forwarded_for:用以记录客户端的ip地址;
  $remote_user:用来记录客户端用户名称;
  $time_local:用来记录访问时间与时区;
  $request:用来记录请求的url与http协议;
  $status:用来记录请求状态;成功是200;
  $body_bytes_sent:记录发送给客户端文件主体内容大小;
  $http_referer:用来记录从那个页面链接访问过来的;
  $http_user_agent:记录客户端浏览器的相关信息;


tipⅣtcp_nopushtcp_nodelay是如何提高网络性能呢?
  首先需要知道的是,两者是互相排斥的,放在一起就会把事情搞砸!
  tcp_nopush:如果包的大小满足MSS,那么可以立即发送,否则数据会被放到缓冲区,等到已经发送的包被确认了之后才能继续发送。这种数据传输方式有益于大量数据的通信性能,可以降低网络里小包的数量,从而提升网络传输效率
  tcp_nodelay:发送应立即发出的短消息。这种数据传输方式有益于交互性的客户/服务器型的应用程序,可以加快响应时间


tipⅤ:长连接超时时间设置应该因地制宜!
  在请求小文件时可以减少重建连接的开销,但如果有大文件上传,可能因为时间不够导致上传失败。
  如果设置时间过长,并且此时没有任何操作,那么长时间保持连接就会浪费系统资源。

  server、location、upstream三个块分别放在后面的配置虚拟主机、location规则与地址重写以及nginx实现负载均衡来进行学习。

二、配置虚拟主机

1、什么是虚拟主机?

  所谓的虚拟主机,在web服务器里就是一个独立的网络站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外服务供用户访问。
  虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能。利用虚拟主机,可以把一台真实主机分成许多"虚拟"主机,在外界看来,每一台虚拟主机和一台独立的主机效果完全一样,但由于多台虚拟主机共享一台真实主机的资源,大大减少了硬件资源的费用

2、虚拟主机类型

  ① 基于域名的虚拟主机:通过不同的域名区分不同的虚拟主机。企业应用最广,几乎所有对外提供服务的网站使用的都是基于域名的虚拟主机。
  ② 基于端口的虚拟主机:通过不同的端口来区分不同的虚拟主机。多用于企业内部的网站。
  ③ 基于IP的虚拟主机:通过不同的IP区分同的虚拟主机,此类虚拟主机的应用场景都会在负载均衡器上进行VIP绑定,而不是在web上绑定IP来区分不同的虚拟主机。

3、配置虚拟主机

  配置文件中server块的解释:

########### 每个指令必须有分号结束。#################
server {
        keepalive_requests 120;    #单连接请求上限次数
        #listen       192.168.140.141:80;    #监听具体IP和具体端口上的连接
        #listen       192.168.140.141;    #监听具体IP上所有端口的连接
        listen       80;    #监听具体端口上所有IP的连接
        server_name  www.a.com;    #配置基于域名的虚拟主机(支持正则表达式匹配)     
       }

① 基于域名的虚拟主机

  配置环境及要求


nginx 识别文件还是文件夹 nginx文件解析_虚拟主机_02


  配置过程

#配置防火墙
[root@nginx-server ~]# setenforce 0    #关闭selinux防火墙(临时生效)
[root@nginx-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config    #关闭selinux防火墙(永久生效,通常需要重启生效,这里与临时生效配合使用,相当于开机不自启)
[root@nginx-server ~]# firewall-cmd --permanent --add-service=http    #永久启用http服务
success
[root@nginx-server ~]# firewall-cmd --permanent --add-service=https    #永久启用https服务
success
[root@nginx-server ~]# firewall-cmd --reload    #重新加载防火墙
success
[root@nginx-server ~]# firewall-cmd --permanent --list-all    #查看是否启用成功
public
  target: default
  icmp-block-inversion: no
  interfaces:
  sources:
  services: ssh dhcpv6-client http https    #启用成功!
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

#修改主配置文件(便于理解,简化了主配置文件)
[root@nginx-server ~]# vim /etc/nginx/nginx.conf
user nginx;
pid /var/run/nginx.pid;
worker_processes 5;
error_log /var/log/nginx/error.log debug;
events {
    accept_mutex on;
    worker_connections  1024;
    use epoll;
}
http  {
    access_log off;
    client_max_body_size 128M;
    include /etc/nginx/conf.d/*.conf;    #将虚拟主机配置写在/etc/nginx/conf.d/目录下,通过include包含进来,便于管理和维护
}

#创建站点目录文件
[root@nginx-server ~]# mkdir -p /data/a/basic    #创建a站点数据文件目录
[root@nginx-server ~]# mkdir -p /data/b/basic    #创建b站点数据文件目录
[root@nginx-server ~]# chown -R nginx:nginx /data/a/basic/    #修改a站点数据文件目录属主和属组
[root@nginx-server ~]# chown -R nginx:nginx /data/b/basic/    #修改b站点数据文件目录属主和属组
[root@nginx-server ~]# mkdir -p /data/a/log    #创建a站点日志文件目录
[root@nginx-server ~]# mkdir -p /data/b/log    #创建b站点日志文件目录
[root@nginx-server ~]# chown -R nginx:nginx /data/a/log/    #修改a站点日志文件目录属主和属组
[root@nginx-server ~]# chown -R nginx:nginx /data/b/log/    #修改b站点日志文件目录属主和属组

#创建虚拟主机a配置文件
[root@nginx-server ~]# vim /etc/nginx/conf.d/a.conf
server {
    listen 192.168.140.142:80;    #监听IP为192.168.140.142的80端口
    server_name www.a.com;    #虚拟主机域名为www.a.com
    access_log /data/a/log/access.log combined;    #定义服务日志路径和格式
    location / {    #location规则,用来匹配请求url,"/"表示任何请求都会被匹配到
        root /data/a/basic;    #站点主目录
        index index.html index.htm;    #设置默认页
    }
}

#创建虚拟主机b配置文件
[root@nginx-server ~]# vim /etc/nginx/conf.d/b.conf
server {
    listen 192.168.140.142:80;    #监听IP为192.168.140.142的80端口
    server_name www.b.com;    #虚拟主机域名为www.a.com
    access_log /data/b/log/access.log combined;    #定义服务日志路径和格式
    location / {    #location规则,用来匹配请求url,"/"表示任何请求都会被匹配到
        root /data/b/basic;    #站点主目录
        index index.html index.htm;    #设置默认页
    }
}

#编辑测试网页内容
[root@nginx-server ~]# vim /data/a/basic/index.html    //编辑虚拟主机a测试页
This is a test from page AAA
[root@nginx-server ~]# vim /data/b/basic/index.html    //编辑虚拟主机b测试页
This is a test from page BBB

  这里使用windows上浏览器进行测试,所以先配置域名解析,再进行测试。
  记事本打开"C:\Windows\System32\drivers\etc\hosts"文件,在末尾添加"192.168.140.142 www.a.com www.b.com" 。

  现在可以进行测试啦!!


nginx 识别文件还是文件夹 nginx文件解析_nginx_03


② 基于端口的虚拟主机

  配置环境及要求


nginx 识别文件还是文件夹 nginx文件解析_虚拟主机_04


  配置过程

#配置防火墙
[root@nginx-server ~]# setenforce 0    #关闭selinux防火墙(临时生效)
[root@nginx-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config    #关闭selinux防火墙(永久生效,通常需要重启生效,这里与临时生效配合使用,相当于开机不自启)
[root@nginx-server ~]# firewall-cmd --zone=public --add-port=81/tcp --permanent    #永久开放81端口
success
[root@nginx-server ~]# firewall-cmd --zone=public --query-port=81/tcp --permanent    #查询81端口是否开启
yes
[root@nginx-server ~]# firewall-cmd --zone=public --add-port=82/tcp --permanent    #永久开放82端口
success
[root@nginx-server ~]# firewall-cmd --zone=public --query-port=82/tcp --permanent    #查询82端口是否开启
yes
[root@nginx-server ~]# firewall-cmd --reload    #重新加载防火墙

#修改主配置文件(便于理解,简化了主配置文件)
#略,同上哦!

#创建站点目录文件
[root@nginx-server ~]# mkdir -p /data/81/basic    #创建81站点数据文件目录
[root@nginx-server ~]# mkdir -p /data/82/basic    #创建82站点数据文件目录
[root@nginx-server ~]# chown -R nginx:nginx /data/81/basic/    #修改81站点数据文件目录属主和属组
[root@nginx-server ~]# chown -R nginx:nginx /data/82/basic/    #修改82站点数据文件目录属主和属组
[root@nginx-server ~]# mkdir -p /data/81/log    #创建81站点日志文件目录
[root@nginx-server ~]# mkdir -p /data/82/log    #创建82站点日志文件目录
[root@nginx-server ~]# chown -R nginx:nginx /data/81/log/    #修改81站点日志文件目录属主和属组
[root@nginx-server ~]# chown -R nginx:nginx /data/82/log/    #修改82站点日志文件目录属主和属组

#创建虚拟主机81配置文件
[root@nginx-server ~]# vim /etc/nginx/conf.d/81.conf
server {
    listen 192.168.140.142:81;    #监听IP为192.168.140.142的81端口
    server_name www.a.com;    #虚拟主机域名为www.a.com
    access_log /data/81/log/access.log combined;    #定义服务日志路径和格式
    location / {    #location规则,用来匹配请求url,"/"表示任何请求都会被匹配到
        root /data/81/basic;    #站点主目录
        index index.html index.htm;    #设置默认页
    }
}

#创建虚拟主机82配置文件
[root@nginx-server ~]# vim /etc/nginx/conf.d/82.conf
server {
    listen 192.168.140.142:82;    #监听IP为192.168.140.142的82端口
    server_name www.a.com;    #虚拟主机域名为www.a.com
    access_log /data/82/log/access.log combined;    #定义服务日志路径和格式
    location / {    #location规则,用来匹配请求url,"/"表示任何请求都会被匹配到
        root /data/82/basic;    #站点主目录
        index index.html index.htm;    #设置默认页
    }
}

#编辑测试网页内容
[root@nginx-server ~]# vim /data/81/basic/index.html    //编辑虚拟主机81测试页
This is a test from 81
[root@nginx-server ~]# vim /data/82/basic/index.html    //编辑虚拟主机82测试页
This is a test from 82

  同样在windows上浏览器进行测试,所以先配置域名解析,再进行测试。
  记事本打开"C:\Windows\System32\drivers\etc\hosts"文件,在末尾添加"192.168.140.142 www.a.com" 。

  现在可以进行测试啦!!


nginx 识别文件还是文件夹 nginx文件解析_nginx 识别文件还是文件夹_05


③ 基于IP的虚拟主机

  配置环境及要求


nginx 识别文件还是文件夹 nginx文件解析_配置文件_06


  配置过程

#配置防火墙
[root@nginx-server ~]# setenforce 0    #关闭selinux防火墙(临时生效)
[root@nginx-server ~]# sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config    #关闭selinux防火墙(永久生效,通常需要重启生效,这里与临时生效配合使用,相当于开机不自启)
[root@nginx-server ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent    #永久开放80端口
success
[root@nginx-server ~]# firewall-cmd --zone=public --query-port=80/tcp --permanent    #查询80端口是否开启
yes
[root@nginx-server ~]# firewall-cmd --reload    #重新加载防火墙

#网卡上添加IP
[root@nginx-server ~]# ip addr add 10.0.0.1/24 dev ens33    #在ens33网卡添加10.0.0.1/24
[root@nginx-server ~]# ip addr add 10.0.0.2/24 dev ens33    #在ens33网卡添加10.0.0.2/24
[root@nginx-server ~]# ip add | grep 10.0.0    #查看是否添加成功
    inet 10.0.0.1/24 scope global ens33
    inet 10.0.0.2/24 scope global secondary ens33

#修改主配置文件(便于理解,简化了主配置文件)
#略,同上哦!

#创建站点目录文件
[root@nginx-server ~]# mkdir -p /data/101/basic    #创建10.0.0.1站点数据文件目录
[root@nginx-server ~]# mkdir -p /data/102/basic    #创建10.0.0.2站点数据文件目录
[root@nginx-server ~]# chown -R nginx:nginx /data/101/basic/    #修改10.0.0.1站点数据文件目录属主和属组
[root@nginx-server ~]# chown -R nginx:nginx /data/102/basic/    #修改10.0.0.2站点数据文件目录属主和属组
[root@nginx-server ~]# mkdir -p /data/101/log    #创建10.0.0.1站点日志文件目录
[root@nginx-server ~]# mkdir -p /data/102/log    #创建10.0.0.2站点日志文件目录
[root@nginx-server ~]# chown -R nginx:nginx /data/101/log/    #修改10.0.0.1站点日志文件目录属主和属组
[root@nginx-server ~]# chown -R nginx:nginx /data/102/log/    #修改10.0.0.2站点日志文件目录属主和属组

#创建虚拟主机10.0.0.1配置文件
[root@nginx-server ~]# vim /etc/nginx/conf.d/101.conf
server {
    listen 10.0.0.1:80;    #监听IP为10.0.0.1的80端口
    server_name www.a.com;    #虚拟主机域名为www.a.com
    access_log /data/101/log/access.log combined;    #定义服务日志路径和格式
    location / {    #location规则,用来匹配请求url,"/"表示任何请求都会被匹配到
        root /data/101/basic;    #站点主目录
        index index.html index.htm;    #设置默认页
    }
}

#创建虚拟主机10.0.0.2配置文件
[root@nginx-server ~]# vim /etc/nginx/conf.d/82.conf
server {
    listen 10.0.0.2:80;    #监听IP为10.0.0.2的80端口
    server_name www.a.com;    #虚拟主机域名为www.a.com
    access_log /data/102/log/access.log combined;    #定义服务日志路径和格式
    location / {    #location规则,用来匹配请求url,"/"表示任何请求都会被匹配到
        root /data/102/basic;    #站点主目录
        index index.html index.htm;    #设置默认页
    }
}

#编辑测试网页内容
[root@nginx-server ~]# vim /data/101/basic/index.html    //编辑虚拟主机81测试页
This is test from 10.0.0.1
[root@nginx-server ~]# vim /data/102/basic/index.html    //编辑虚拟主机82测试页
This is test from 10.0.0.2

#添加路由
[root@nginx-server ~]# ip route add 10.0.0.0/24 via 192.168.140.142 dev ens33    #将10.0.0.0/24网段请求转发到192.168.140.142
[root@nginx-server ~]# route -n    #查看是否添加成功
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.140.2   0.0.0.0         UG    100    0        0 ens33
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 ens33
192.168.140.0   0.0.0.0         255.255.255.0   U     100    0        0 ens33

  这次不一样啦!在windows上浏览器进行测试,需要先添加路由,再进行测试。
  以管理员身份打开CMD(命令提示符),添加路由,将所有到10.0.0.0/24网段的请求转发到192.168.140.142(虚拟主机所在真实主机IP)上。(代码在这里:route add -p 10.0.0.0 mask 255.255.255.0 192.168.140.142

nginx 识别文件还是文件夹 nginx文件解析_虚拟主机_07


  现在可以进行测试啦!!

nginx 识别文件还是文件夹 nginx文件解析_配置文件_08