Nginx的配置文件结构和基本配置说明

原文链接

摘要: nginx模块配置案例 nginx配置文件格式 nginx日常配置

Nginx能干什么

  • 基本HTTP服务:可作为HTTP代理服务器和反向代理服务器,支持通过缓存加速访问,可以完成简单的负载均衡和容错,支持过滤功能,支持SSL等
  • 高级HTTP服务:进行自定义配置,支持虚拟主机,支持URL重定向,支持网络监控,支持流媒体传输等
  • 作为邮件代理服务器,支持IMAP/POP3代理服务,支持内部SMTP代理服务功能

基本HTTP服务

  • 处理静态文件,处理索引文件以及支持自动索引
  • 打开并自行管理文件描述符缓存
  • 提供反向代理服务,并且可以使用缓存加速反向代理,同时完成简单负载均衡及容错
  • 提供远程FastCGI服务的缓存机制,加速访问,同时完成简单的负载均衡以及容错
  • 使用Nginx的模块化特性提供过滤器功能,Nginx基本过滤器包括gzip压缩,ranges支持,chunked响应,XSLT,SSL以及图像缩放等
  • 支持HTTP下的安全套接层协议SSL

高级HTTP服务

  • 支持基于名字和IP的虚拟主机设置
  • 支持HTTP/1.0 中的KEEP-Alive模式和管线PipeLined模型连接
  • 支持重新加载配置和在线升级时,无须中断正在处理的请求
  • 自定义访问日志格式,带缓存的日志写操作以及快速日志轮转
  • 提供错误代码重定向功能
  • 支持重写rewrite模块拓展
  • 支持HTTP DAV模块,从而为HTTP webDAV提供PUT,DELETE,MKCOL,COPY,MOVE方法
  • 支持FLV流和MP4传输
  • 支持网络监控,限制等
  • 支持嵌入Perl语言

邮件代理服务器

  • 支持使用外部HTTP认证服务器重定向用户到IMAP/POP3后端,并支持IMAP认证方式和POP3认证方式
  • 支持使用外部HTTP认证服务器认证用户后重定向连接到内部SMTP后端,并支持SMTP认证方式
  • 支持右键代理服务下的安全套接层协议SSL
  • 支持纯文本通信协议的扩展协议STAPTTLS

nginx服务的信号控制

信号 作用
TREM或INT 快速停止Nginx服务
QUIT 平缓停止Nginx服务
USR1 平缓重启
USR2 重新的打开日志文件
WINCH 平滑升级
TREM或INT 平滑停止worker process,用于nginx服务器平滑升级
  • 也可以使用nginx -s 参数或者 systemctl来管理

Nginx服务的升级

  • 过程:Nginx服务接收到USR2信号后,首先将旧的nginx.pid文件添加.oldbin变为nginx.pid.old文件,然后执行新版本nginx服务器的二进制文件启动服务.如果启动成功,系统中将有新旧两个nginx服务共同提供web服务,之后,需要向旧的nginx服务进程发送WINCH信号,使旧的nginx服务平滑停止,并删除nginx.pid.oldbin文件.

Nginx服务器基本配置指令

    user  nginx;                                    #全局有效
    worker_processes  1;
    error_log  /var/log/nginx/error.log warn;
    pid        /var/run/nginx.pid;
    events {
        worker_connections  1024;                   #只在events中有效
    }
    http {                                          #以下指令在http部分中生效
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        ...
    }
  • nginx.conf文件结构

      ...                      #全局块
      events{}                 #events块
        http{                  #http块
          ...                  #http全局块
          server{              #server块
            ...                #server全局块
            location [/]{      #location块
              ...
            }
          }
        }
        ...
    • 全局块:nginx服务器的配置信息
    • events块:主要影响nginx服务器与用户的网络连接,
    • http块:代理缓存和日志定义绝大多数功能和第三方模块的配置可以放这
    • server块:每个server相当于一台虚拟主机,它内部可以有多台主机联合提供服务,一起对外提供在逻辑上关系密切的一组服务
    • location:基于nginx服务器接收到的请求字符串,对除虚拟主机名之外的字符串进行匹配,对特定的请求进行处理

配置运行nginx服务器用户组

  • /etc/nginx/nginx.conf

    • user 表示谁有权使用nginx服务
    • group 表示哪个用户组可以使用nginx服务
    • 如果都允许使用nginx服务,那么直接不写user或者user nobody nobody
    • user只能在全局块中配置

配置允许生成的worker process数

  • worker process是nginx服务器实现并发处理服务的关键所在
  • 配置允许生成的worker process数语法为 : worker_process number|auto;

    • number 指定nginx进程最多可以产生的worker process数.默认为 1
    • auto nginx 自动检测

配置nginx进程PID存放路径

  • /etc/nginx/nginx.conf
  • 配置pid [path];即可

配置错误日志

  • 在全局块,http块,server块中都可以对nginx日志进行配置
  • error_log [path] [debug|info|notice|warn|error|crit|alert|emerg]

配置文件的引入

  • include [path]

设置网络连接的序列化

  • 只能在events中配置
  • "惊群问题" : 意思就是网络来一个连接,但是会同时唤醒多个睡眠进程,但是只有一个进程可以得到这个连接,如果每次唤醒的数目太多,会影响系统性能
  • 为了解决上述问题,当accept_mutex开启时,将会对多个nginx进程接收连接进行序列化,防止多个进程对连接的争抢

    • 语法:accept_mutex on | off 默认为on

设置是否允许同时接收多个网络连接

  • 只能在events中配置
  • 每个worker process都有能力同时接收多个新到达的网络连接

    • 语法multi_accept on|off;
    • 默认关闭,即每个worker process一次只能接收一个新到达的网络连接

事件驱动模型的选择

  • 语法:use method

    • method的选择有: select`pollkqueueepollrtsig/dev/poll`eventport

配置最大连接数

  • 只能在events中配置
  • 设置允许每一个worker process同时开启的最大连接数

    • 语法:worker_connections number 默认是512
    • 这里的数量包括所有可能的连接数,并且number不能大于操作系统支持打开的最大文件句柄数量

定义MIME-Type

  • MIME Type是网络资源的媒体类型:HTML, XML, GIF, FLASH 等
  • /etc/nginx/nginx.conf下里面的两行内容

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    • mime.types定义了所支持的资源类型
    • default_type 定义了用于处理前端请求的MIME类型

自定义服务日志

  • 也就是访问日志和日志格式的格式化问题access_log 和 log_format

    • access_log语法: access_log path [format[buffer=size]]

      • format就是log_format定义好的字符串,可选
      • buffer就是存放日志的内存缓存区大小
      • 在全局块,http块,server块,location块中配置
      • 如果取消日志服务 : access_log off;
    • log_format 用于定义日志格式,并只能在http块中配置

配置允许sendfile方式传输文件

  • 语法:sendfile on|off 默认是off

    • 在全局块,http块,server块,location块中配置
  • 语法:sendfile_max_chunk size size默认为0

    • size>0,nginx进程的每个worker process每次调用sendfile传输的数据量最大不能超过这个值, size=0,无限制.
    • 在全局块,http块,server块,location块中配置

配置连接超时时间

  • 用户建立会话连接后,nginx服务器可以保持连接打开一段时间
  • 语法:keepalive_timeout timeout[header_timeout]

    • timeout:服务器对连接的保持时间,默认75s
    • header_timeout:在报文头部的Keep_Alive设置超时时间

      • 当使用Keep-Alive模式(又称持久连接、连接重用)时,Keep-Alive功能使客户端到服 务器端的连接持续有效,当出现对服务器的后继请求时,Keep-Alive功能避免了建立或者重新建立连接。
    • 在http块,server块,location块中配置

单链接请求数上限

  • 用于限制用户通过某一连接向nginx服务器发送请求的次数

    • 语法:keepalive_request number 默认100

配置网络监听

  • 默认的设置为:listen *:80 | *:8000
  • 其他用法

    listen 192.168.1.10:8000;                       #监听ip上端口的链接
    listen 192.168.1.10;                            #监听ip上所有端口的链接
    listen 8000;                                    #监听具体端口上的所有ip连接
    listen 192.168.1.10 default_server backlog=1024;#设置ip的连接请求默认由虚拟主机处理,并允许最多1024网络连接同时处于挂起状态
    • 更多的配置参考文档,很多参数....

基于名称的虚拟主机配置

  • 设置了主机的名称并配置好DNS,用户就可以使用这个名称向此虚拟主机发送请求了

    • 语法:server_name name {...}

      • 对于name来说,可以由多个名称并列之间用空格隔开,每个名字就是一个域名
      • 也可以使用正则表达式
      • 虚拟主机名的匹配优先级

        • 准确匹配server_name
        • 通配符在开始时匹配server_name成功
        • 通配符在结尾时匹配server_name成功
        • 正则表达式匹配server_name成功
  • 在测试的时候不能输入自己配置的域名,因为并没有设置域名解析服务,如果需要输入域名访问的话,那么就更改自己主机的host文件.

基于IP的虚拟主机配置

  • 将一块网卡设置别名

    • ifconfig eth1:0 192.168.1.31 netmask 255.255.255.0 up
    • ifconfig eth1:1 192.168.1.32 netmask 255.255.255.0 up
  • 为了让机子重启后还是有效的,可以把上面的指令加入/etc/rc.local
  • 配置文件

      server {
          listen       80;
          server_name  192.168.1.31;
          location / {
              root   /vagrant;
              index  index.html index.htm;
          }
      }
      server {
          listen       80;
          server_name  192.168.1.32;
          location / {
              root   /vagrant;
              index  index.html index.htm;
          }
      }
    • 请求网址后,就会展现不一样的结果

配置location块

  • 语法:location [=|~|~*|^~] uri {...}

    • =:表示严格匹配
    •  
    • ~*:用于表示uri包含正则,并且不区分大小写
    • ^~:用于标准uri前,要求nginx服务器找到标识uri和请求字符串匹配度最高的location后,立即使用此location处理请求

配置请求的根目录

  • 语法:root path :path为nginx服务器接收到请求后查找资源的根目录路径

      location /data/{
        root /locationtest;
      }
    • 请求路径: /data/index可以匹配成功

更改location的URi

  • 语法:alias path : alias指令改变location接收到的URI的请求路径

      location ~ ^/data/(.+\.(html|htm}))$ {
        alias /locationtest/other/$1;
      }
    • 由上可以看出:请求路径由/data/index.html匹配成功后,在/locationtest/other路径下寻找资源文件

设置网站默认首页

  • index file;

设置网站的错误页面

  • 一般来说2XX请求完成, 3XX代表网站重定向, 4XX客户端出错 ,5XX服务器出错
  • Http错误
    Nginx的配置文件结构和基本配置说明_第1张图片

Nginx的配置文件结构和基本配置说明_第2张图片

  • 语法:error_page code ...[=[response]] uri

    • code代表错误码
    • response,将code指定的错误代码转换为新的错误代码response
    • uri,错误页面的路径或者网站地址
  • 案例

    • error_page 404 /404.html:页面找不到,报404错误,映射到404.html响应
    • error_page 403 http://some.com/s.html:设置nginx服务器使用指定路径的页面响应403错误
    • error_page 410 =301 /empty.gif:设置nginx服务器产生410的http消息时,使用nginx安装路径/html/empty.gif返回给用户端301消息
  • 上面的页面的所有的返回路径都是基于nginx的安装目录来说的相对路径,如果想自定义路径,只需要另外使用一个location指令定向错误页面到新路径下就可以了

      error_page 404 /404.html
      location /404.html{
        root /myserver/myerror
      }

基于IP配置Nginx的访问权限

  • 可在http,server,location中使用
  • allow address | CIDR | all:设置允许访问Nginx的客户端IP

    • CIDR:允许访问的客户端的CIDR地址,例如202.80.18.23/25表示,前面是32位IP地址,后面/25表示该IP地址中前25位是网络部分,其余代表主机部分
  • deny address | CIDR | all:设置禁止访问Nginx的客户端IP

      location /{
        deny 192.168.1.1;
        allow 192.168.1.0/24;
        deny all;
      }
    #192.168.1.0是可以访问的,因为nginx配置在解析的过程中,遇到deny指令或者allow是按照顺序对当前客户端的链接进行访问权限检查的

基于密码配置Nginx的访问权限

  • auth_basic string|off:用于开启或关闭该认证功能

    • string:开启认证,并配置验证时的指示信息..off关闭
  • auth_basic_user_file file : 用于设置包含用户名和密码信息的文件路径
  • 明文加密: htpasswd -c -d /vagrant/pass test test是用户名,这是linux自带的工具,回车后,要求输入用户名对应的密码.

  [root@myNginx ~]# cat /etc/nginx/conf.d/default.conf
  server {
      listen       80;
      server_name  localhost;    #访问的域名

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

      location / {        
          root   /usr/share/nginx/html;       #nginx 的默认的html文件存放位置
          index  index.html index.htm;        #默认页面
      }

      #error_page  404              /404.html;   #错误页面

      # redirect server error pages to the static page /50x.html
      #
      error_page   500 502 503 504  /50x.html;       #拦截错误码  转发到对应页面
      location = /50x.html {
          root   /usr/share/nginx/html;              #错误码对应的页面的存放的位置
      }

      # proxy the PHP scripts to Apache listening on 127.0.0.1:80
      #
      #location ~ \.php$ {
      #    proxy_pass   http://127.0.0.1;
      #}

      # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
      #
      #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;
      #}

      # deny access to .htaccess files, if Apache's document root
      # concurs with nginx's one
      #
      #location ~ /\.ht {
      #    deny  all;
      #}
  }

  [root@myNginx ~]#
  • nginx安装以后就会作为centos的一个系统服务自动启动,用systemctl进行管理就可以

  • curl -v 可以查看请求和响应的头信息

    • request 包括 请求行,请求头部,请求数据
    • response 包括状态行,消息报头,响应正文
      [root@myNginx html]# curl -v www.baidu.com
      * About to connect() to www.baidu.com port 80 (#0)
      *   Trying 61.135.169.121...
      * Connected to www.baidu.com (61.135.169.121) port 80 (#0)
      > GET / HTTP/1.1                     request请求方式  请求协议
      > User-Agent: curl/7.29.0            request
      > Host: www.baidu.com
      > Accept: */*
      >
      < HTTP/1.1 200 OK                     response响应返回
      < Accept-Ranges: bytes
      < Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform
      < Connection: Keep-Alive
      < Content-Length: 2381
      < Content-Type: text/html
      < Date: Sat, 04 Aug 2018 06:32:44 GMT
      < Etag: "588604c4-94d"
      < Last-Modified: Mon, 23 Jan 2017 13:27:32 GMT
      < Pragma: no-cache
      < Server: bfe/1.0.8.18
      < Set-Cookie: BDORZ=27315; max-age=86400; domain=.baidu.com; path=/
      <
      
       ... 
      * Connection #0 to host www.baidu.com left intact
      [root@myNginx html]#

模块配置案例

nginx模块分:nginx官方模块和第三方模块


stub_status

  • nginx -V 中的 --with-http_stub_status_module Nginx客户端的状态

    • 配置

        语法: stub_status;
        默认是没有配置的
        Context:server-locaiton之间配置
    • 在 /etc/nginx/conf.d/default.conf里,server下加入

        server{
          ...
          location /qidia {
            stub_status;
          }
          ...
        }
      • 检查正确性:nginx -t -c /etc/nginx/nginx.conf
      • 重加在:nginx -s reload -c /etc/nginx/nginx.conf
    • 页面访问ip/(location后的 /qidia) : 192.168.43.201/qidia,显示如下

      Active connections: 1       #nginx当前活跃的连接数
      server accepts handled requests    
      8 8 7                       #nginx接受的握手的总次数,nginx处理的连接数,总请求数 : nginx接受的握手的总次数==nginx处理的连接数表示nginx没有丢失
                                  #总共处理了8个连接 , 成功创建8次握手, 总共处理了7个请求
      Reading: 0 Writing: 1 Waiting: 0   
                                  #reading — 读取客户端的连接数.
                                  #writing — 响应数据到客户端的数量
                                  #waiting — 开启 keep-alive 的情况下,这个值等于 active – (reading+writing), 意思就是 Nginx 已经处理完正在等候下一次请求指令的驻留连接.

random_index

  • nginx -V 中的 --with-http_random_index_module 目录中随机选择一个主页作为一个随机主页

    • 配置

      语法:random_index on|off;
      默认是关闭的
      Context:location中
    • /etc/nginx/conf.d/default.conf里,只能在location中加入

      location / {
         random_index on;               #开启random_index
         root   /usr/share/nginx/html;  #指定随机访问的页面的存放位置
        #index  index.html index.htm;   #注释掉原有的index页面
      }
      • 检查重加在后,页面就会出现随机访问的效果
      • 需要注意的是: linux中的隐藏文件就是以.开头的文件是不会作为随机页面作为访问的

sub

  • nginx -V 中的 --with-http_sub_module HTTP内容替换

    • 配置

        语法:sub_filter string  replacement   #string要替换的内容,   replacement替换后的内容
        默认不开
        Context:http,server,lication     #如果加载http下面可以完成对多个server的内容替换
       语法:sub_filter_last_modified on|off;
       默认关闭
       Context:http,server,location
        语法:sub_filter_once on|off;
        默认开启                        #on只匹配第一个.off会把html的全部内容都匹配一次
        Context:http,server,location
    • /etc/nginx/conf.d/default.conf里,如下

      location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
        sub_filter 'nginx' 'qidai';     #将nginx替换成qidai
        sub_filter_once off;            #全局替换
      }
      • sub_filter_once on 就只匹配第一,替换第一个

你可能感兴趣的:(Nginx的配置文件结构和基本配置说明)