Skip to Main Menu

Nginx 配置介绍

Nginx 配置介绍

简介

Nginx是一个HTTP和反向代理服务器,一个邮件代理服务器,一个通用TCP代理服务器。第一个公开版本发行于2004年,俄国人发布,截止到2015年4月,市场占有率为21.43%,已成为排名第二的服务器(Apache排名第一),成为了高性能服务器的代名词。 Nginx是在互联网产业规模发展起来后,针对高并发设计的服务器,具有高性能,高扩展性,高并发性(单机支持10万以上并发连接),高可靠性,低内存消耗(10000个非活动keep-alive连接仅消耗2.5M内存),热部署,及最自由的开源许可协议(所以第三方功能模块非常丰富)等特性。
官网访问

基本命令

安装

Windows下直接下载解压,linux下可以通过yum等安装工具安装。

命令

  1. 启动
    直接执行ngix可执行文件。在linux下可以通过ps -aux|grep nginx查询nginx进程,windows可以通过任务管理器查看。
  2. 维护
    nginx启动后,大部分的维护都可以通过nginx -s singal维护,参数有:
    • stop: 快速关闭
    • quit: 平滑关闭
    • reload: 修改配置文件后,重新加载配置文件生效。 当修改配置文件后,可以用nginx -t检查配置文件是否符合规范。

配置文件介绍

Nginx设计由许多功能模块构成,这些功能模块都由配置文件控制。配置文件位于%nginx_home%\conf\nginx.conf,是一个普通的文本文件。配置文件由配置项和块配置项构成,注释以#开头。

  • 配置项值
    配置项名 配置项值 配置项值...;
    配置项由配置值项名,配置项值构成,配置项名与值,配置项值与配置项值由空格分隔,最后以分号结束。配置项名必须是Nginx某个模块的配置,否则Nginx会认为非法配置。
  • 块配置项
    块配置项与配置项类似,只是最后”{}“结束,括号中可以包含其它配置项,形成配置上下文,表示配置项同时生效。块配置项可以嵌套,同名配置项优先级,依赖于对应的Nginx模块。

基本配置

  • worker_processes
    worker_processes 2;
    Nginx使用一个Master进程来管理多个worker进程,一般情况下进程的数量与服务器CPU核数相等。用master进程管理,用worker进程处理连接请求,与Apache进程不同,Nginx一个进程可以同时处理多个连接请求,保证了高并发与稳健性。
  • error_log/access_log
    error_log logs/error.log error;
    access_log logs/host.access.log main;
    用于配置错误日志和访问日志,默认日志输出到logs目录中,错误日志输出级别有:debug,info,notice,warn,error,alert,emerg,从小到大。
  • pid
    pid logs/nginx.pid;
    保存master进程id的文件存放位置,默认位于logs目录中。
  • user
    user nobody; 设置worker进程运行的用户及用户组。
  • user
    use epoll;
    设置事件模型,nginx自动选择,依赖于操作系统。windows不支持epoll,所以nginx在windows平台上大并发连接处理能力比较弱。

Web服务器配置

Web服务器主要功能由ngx_http_core_module实现。一个典型的Web服务器由http配置块定义,包含多个server配置块、location配置块、upstream配置块,所有的Web服务器配置必须位于这些块中。 >http { upstream backend{ … } server { listen 80; server_name localhost; location /xxx{ … } location /xxx{ …. } … } server { … } >}

虚拟主机

每个server配置块定义一个虚拟主机,配置对应的主机域名和监听端口。

  • 监听端口
    listen address[:port] listen port
    listen unix:path
    位于server配置块,默认listen:*:80。在地址、端口后还可以添加其它可选参数:
    • default_server 该主机将成为该地址的默认虚拟主机,如果没有配置那么该地址的第一个server将成为默认虚拟主机。当一个请求无法匹配主机域名时,选择默认虚拟主机处理。
  • 主机名称
    server_name name ...;
    server_name后可以配置多个主机名称,第一个主机名成为主主机名,主机名可以支持通配符,正则表达式。当处理一个http请求时,Nginx根据head中的Host值与server中server_name匹配,决定哪个虚拟主机处理该请求,匹配优先级:
    1. 完全匹配
    2. 通配符在前面的最长server_name
    3. 通配符在后面的最长server_name
    4. 第一个正则表式匹配的server_name
      当都不匹配时,采用默认虚拟主机。server_name允许为空值,用于匹配Host无值的请求。

请求分发

location [ = | ~ | ~* | ^~ ] uri { ... }
Nginx根据请求uri与location中配置的uri进行匹配,匹配上了就用location中的配置处理该请求。uri可以是前缀字符串或正则表达式。 * = 表示请求uri与location uri完全匹配,找到停止匹配过程 * ~ 表示匹配uri大小写敏感,用于location uri正则表达式 * ~* 表示匹配uri大小写不敏感,用于location uri正则表达式 * ^~ 表示只需location uri只需匹配请求uri请半部分,不进行正则表达式查询
匹配过程分为两个步聚:首先查找最长匹配的前缀字符串,然后查询第一个匹配的正则表达式。如果存在匹配的正则表达式,则使用该location,否则使用最长匹配的location处理请求。在匹配过程中,如果遇到完全匹配,则直接使用,终止查询;如果最长前缀uri使用^~修饰,则终止正则表达式查找。

资源设置

  • root root path;
    设置请求资源的根目录,对请求文件来说,path+请求uri构成完整的物理文件路径。
  • alias alias path;
    与root差异在于对请求uri的处理不同,alias构成实际路径时,丢弃请求uri中匹配部分,对请求文件来说,path+请求uri去除匹配location的uri构成完整的物理文件路径。
  • index index file ...;
    默认值为index index.html;,用于定义首页,当请求uri以’/‘时,返回首页。index后可以跟多个文件名,ngx_http_index_module模块依次尝试。如果文件存在,拼接uri后,再作内部重定向,重新进行uri分发。
  • autoindex autoindex on | off;
    当请求以’/‘结束时,如果ngx_http_index_module模块无法定位首页,则由ngx_http_autoindex_module模块处理,auoindex用于控制是否允许列出目录,默认禁止。

请求处理过程

请求处理过程,由以上几步组成,首先根据请求IP与端口,确定侯选虚拟主机群,再根据规则确定虚拟主机,进行请求分发,处理请求。

反向代理服务器配置

代理服务器,通常指代理内部网络对外部网络请求,反向代理服务器是指接受外部请求,转向给内部服务器,并返回结果给外部网络。Nginx充当反向代理服务器是常见的功能,当接收到请求时,Nginx并不会立即转向给内部服务器,而是先完整接收请求到Nginx服务器,再转发给内部服务器。这样能屏憋外网差异,减少内部服务器负载。

反向代理

  • proxy_pass proxy_pass URL;
    用于设置访问代理服务器的协议与访问地址(ip或域名都可以),url中可以添加location uri印射的uri。uri不存在时,直接把请求uri转发给代理服务器;当存在时,请求uri中匹配location部分,由代理URL中uri替换。
  • proxy_next_upstream proxy_next_upstream error | timeout | invalid_header | http_500 | http_502 | http_503 | http_504 | http_403 | http_404 | off ...;
    配置哪些场景下,内部处理错误,换一台内部服务器处理该请求。

负载均衡

负载均衡是优化资源配置,减少时延,提高吞吐量和稳健性的技术手段。nginx支持三种负载均衡方式:

  • round-robin:以轮叫调度的方式把请求转发给应用服务器,每个服务器处理的请求数相等,当某个应用服务器处理能力弱时,会超载。nginx默认使用方式。
  • least-connected:最少连接方式,请求分配给活动连接数最少的应用服务器,考虑了服务器处理能力,当用应用处理来不急处理时,选择其它服务器处理。通过least_conn配置
  • ip-hash:根据ip哈希决定服务器,把同一客户端的请求分配给同一应用服务器处理,有利于会话保持。通过ip_hash配置。

在负载均衡处理时,可以对应用服务器分配权重,目前只有round-robin支持权重,nginx后续版本其它两种方式也会支持权重。

  • upstream upstream name { ... }
    定义服务器集群,被proxy_pass引用。服务器可以监听不同端口,请求某一服务器不能建立连接时,请求传递给其它服务器。
  • server server address [parameters];
    定义服务器地址和其它参数。地址可以是ip和域名,端口可选,默认80端口。参数最常用有: weight=number,定义权重,数字越大,权重越高;backup,用于标识备份服务器;down,用于标识服务器不可用,在ip-hash调度方式中,保证hash一致性。

Rewrite

在反向代理过程中,常常需要改变请求uri,ngx_http_rewrite_module模块用于处理请求uri重写,返回重定向,及条件判断。模块指令包含:break,if,return,rewrite,set等。

  • break break;
    终止rewrite模块指令执行。
  • if if (condition) { ... }
    执行条件判断
  • rewrite rewrite regex replacement [flag];
    重写请求uri。如果请求uri匹配正则表达式,则用replacement替换请求uri。flag标记支持:
  • last: 终止处理当前rewrite模块指令,重写后的请求对其所在的server{…}重新发起请求。
  • break: 终止处理当前rewrite模块指令。
  • redirect: 重定向,浏览器地址改变,返回302状态码。
  • permanent: 永久重定向,浏览器地址改变,返回301状态码。

当替换uri以http或https开头时,终止处理,重定向。重写后的uri和原请求的查询参数转发给应用服务器,如果以”?“结束,将丢弃原请求查询参数。