Nginx 配置文件详解

Nginx 配置文件详解

  • Nginx的配置文件结构
    • Nginx的全局配置
    • HTTP服务器配置
    • HttpGzip模块配置
    • 负载均衡配置
    • server虚拟主机配置
    • location URL匹配配置
    • StubStatus模块配置
    • 配置实例
      • 1. nginx 配置 tomcat 集群反向代理
      • 2. 多个tomcat多个项目配置
      • 3.nginx 原生配置

Nginx的配置文件结构

  Nginx 的配置文件 nginx.conf 位于其安装目录的 conf 目录下。
nginx.conf 由多个块组成,最外面的块是 main,main 包含 Events 和 HTTP,HTTP 包含 upstream 和多个 Server,Server 又包含多个 location:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和 location(URL 匹配特定位置的设置)。

Nginx 配置文件详解_第1张图片

  • main 块设置的指令将影响其他所有设置;
  • server 块的指令主要用于指定主机和端口;
  • upstream 指令主要用于负载均衡,设置一系列的后端服务器;
  • location 块用于匹配网页位置。

  这四者之间的关系式:server 继承 main,location 继承 server,upstream 既不会继承其他设置也不会被继承。
在这四个部分当中,每个部分都包含若干指令,这些指令主要包含 Nginx 的主模块指令、事件模块指令、HTTP 核心模块指令,同时每个部分还可以使用其他 HTTP 模块指令,例如 Http SSL 模块、HttpGzip Static 模块和 Http Addition 模块等。

Nginx的全局配置

user nobody nobody;
worker_processes 2;
error_log logs/error.log notice;
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
 
events{
use epoll;
worker_connections 65536;
}

每个配置选项的含义解释如下:

  • user 是个主模块指令,指定 Nginx Worker 进程运行用户以及用户组,默认由 nobody 账号运行。

  • worker_processes 是个主模块指令,指定了 Nginx 要开启的进程数。每个 Nginx 进程平均耗费 10M~12M 内存。建议指定和 CPU 的数量一致即可。

  • error_log 是个主模块指令,用来定义全局错误日志文件。日志输出级别有 debug、info、notice、warn、error、crit 可供选择,其中,debug 输出日志最为最详细,而 crit 输出日志最少。

  • pid 是个主模块指令,用来指定进程 pid 的存储文件位置。

  • worker_rlimit_nofile 用于绑定 worker 进程和 CPU, Linux 内核 2.4 以上可用。

  • events 事件指令是设定 Nginx 的工作模式及连接数上限:
    use 是个事件模块指令,用来指定 Nginx 的工作模式。Nginx 支持的工作模式有 select、poll、kqueue、epoll、rtsig 和 /dev/poll。其中 select 和 poll 都是标准的工作模式,kqueue 和 epoll 是高效的工作模式,不同的是 epoll 用在 Linux 平台上,而 kqueue 用在 BSD 系统中。对于 Linux 系统,epoll 工作模式是首选。

  • worker_connections 也是个事件模块指令,用于定义 Nginx 每个进程的最大连接数,默认是1024。最大客户端连接数由 worker_processes 和 worker_connections 决定,Max_client=worker_processes*worker_connections。在作为反向代理时,max_clients 变为:max_clients = worker_processes * worker_connections/4。
    进程的最大连接数受 Linux 系统进程的最大打开文件数限制,在执行操作系统命令 “ulimit -n 65536” 后 worker_connections 的设置才能生效

HTTP服务器配置

http{
    include conf/mime.types;
    default_type application/octet-stream;
    log_format main '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';
    log_format download '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';
    client_max_body_size 20m;
    client_header_buffer_size 32K;
    large_client_header_buffers 4 32k;
    Sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 60;
    client_header_timeout 10;
    client_body_timeout 10;
    send_timeout 10;

  下面详细介绍下这段代码中每个配置选项的含义。

  • include 是个主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度。类似于 Apache 中的 include 方法。

  • default_type 属于 HTTP 核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置 PHP 环境时,Nginx 是不予解析的,此时,用浏览器访问 PHP 文件就会出现下载窗口。

  下面的代码实现对日志格式的设定:

    log_format main '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$gzip_ratio"';
    log_format download '$remote_addr - $remote_user [$time_local] '
    '"$request" $status $bytes_sent '
    '"$http_referer" "$http_user_agent" '
    '"$http_range" "$sent_http_content_range"';

  log_format 是 Nginx 的 HttpLog 模块指令,用于指定 Nginx 日志的输出格式。main 为此日志输出格式的名称,可以在下面的 access_log 指令中引用。

  • client_max_body_size 用来设置允许客户端请求的最大的单个文件字节数;

  • client_header_buffer_size 用于指定来自客户端请求头的 headerbuffer 大小。对于大多数请求,1K 的缓冲区大小已经足够,如果自定义了消息头或有更大的 Cookie,可以增加缓冲区大小。这里设置为 32K;

  • large_client_header_buffers 用来指定客户端请求中较大的消息头的缓存最大数量和大小, “4” 为个数,“128K” 为大小,最大缓存量为 4 个 128K;

  • sendfile 参数用于开启高效文件传输模式。将 tcp_nopush 和 tcp_nodelay 两个指令设置为 on 用于防止网络阻塞;

  • keepalive_timeout 设置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接;

  • client_header_timeout 设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx 将返回 “Request time out(408)” 错误;

  • client_body_timeout 设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx 将返回 “Request time out(408)” 错误,默认值是 60;

  • send_timeout 指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx 将会关闭连接。

HttpGzip模块配置

  下面配置 Nginx 的 HttpGzip 模块。这个模块支持在线实时压缩输出数据流。
看是否安装了 HttpGzip 模块:

[root@vps ~]# /opt/nginx/sbin/nginx  -V
nginx version: nginx/1.0.14
built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx

  通过 /opt/nginx/sbin/nginx -V 命令可以查看安装 Nginx 时的编译选项,由输出可知,我们已经安装了 HttpGzip 模块。

  下面是 HttpGzip 模块在 Nginx 配置中的相关属性设置:

gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.1;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
  • gzip用于设置开启或者关闭 gzip 模块,“gzip on” 表示开启 GZIP 压缩,实时压缩输出数据流;

  • gzip_min_length 设置允许压缩的页面最小字节数,页面字节数从 header 头的Content-Length 中获取。默认值是 0,不管页面多大都进行压缩。建议设置成大于 1K 的字节数,小于 1K 可能会越压越大;

  • gzip_buffers 表示申请 4 个单位为 16K 的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储 gzip 压缩结果;

  • gzip_http_version 用于设置识别 HTTP 协议版本,默认是 1.1,目前大部分浏览器已经支持 GZIP 解压,使用默认即可;

  • gzip_comp_level 用来指定 GZIP 压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗 cpu 资源;

  • gzip_types 用来指定压缩的类型,无论是否指定,“text/html” 类型总是会被压缩的;

  • gzip_vary 选项可以让前端的缓存服务器缓存经过 GZIP 压缩的页面,例如用 Squid 缓存经过 Nginx 压缩的数据。

负载均衡配置

  下面设定负载均衡的服务器列表:

upstream cszhi.com{
ip_hash;
    server 192.168.8.11:80;
    server 192.168.8.12:80 down;
    server 192.168.8.13:8009 max_fails=3 fail_timeout=20s;
    server 192.168.8.146:8080;
}

  upstream 是 Nginx 的 HTTP Upstream 模块,这个模块通过一个简单的调度算法来实现客户端 IP 到后端服务器的负载均衡。
  在上面的设定中,通过 upstream 指令指定了一个负载均衡器的名称 cszhi.com。这个名称可以任意指定,在后面需要的地方直接调用即可。

  Nginx 的负载均衡模块目前支持 4 种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法。

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;

  • Weight:指定轮询权值,Weight 值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;

  • ip_hash:每个请求按访问 IP 的 hash 结果分配,这样来自同一个 IP 的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;

  • fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx 本身是不支持 fair 的,如果需要使用这种调度算法,必须下载 Nginx 的 upstream_fair 模块;

  • url_hash:按访问 url 的 hash 结果来分配请求,使每个 url 定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx 本身是不支持 url_hash 的,如果需要使用这种调度算法,必须安装 Nginx 的 hash 软件包。

  在 HTTP Upstream 模块中,可以通过 server 指令指定后端服务器的 IP 地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • down:表示当前的 server 暂时不参与负载均衡;

  • backup:预留的备份机器。当其他所有的非 backup 机器出现故障或者忙的时候,才会请求 backup 机器,因此这台机器的压力最轻;

  • max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;

  • fail_timeout:在经历了 max_fails 次失败后,暂停服务的时间。max_fails 可以和 fail_timeout 一起使用。

  注意,当负载调度算法为 ip_hash 时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup。

server虚拟主机配置

  下面介绍对虚拟主机的配置。
  建议将对虚拟主机进行配置的内容写进另外一个文件,然后通过 include 指令包含进来,这样更便于维护和管理。

server{
    listen 80;
    server_name 192.168.8.18 cszhi.com;
    index index.html index.htm index.php;
    root /wwwroot/www.cszhi.com
    charset gb2312;
    access_log logs/www.ixdba.net.access.log main;
  • server 标志定义虚拟主机开始。

  • listen 用于指定虚拟主机的服务端口。

  • server_name 用来指定 IP 地址或者域名,多个域名之间用空格分开。

  • index 用于设定访问的默认首页地址。

  • root 指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。
    Charset 用于设置网页的默认编码格式。

  • access_log 用来指定此虚拟主机的访问日志存放路径,最后的 main 用于指定访问日志的输出格式。

location URL匹配配置

  URL 地址匹配是进行 Nginx 配置中最灵活的部分。 location 支持正则表达式匹配,也支持条件判断匹配,用户可以通过 location 指令实现 Nginx 对动、静态网页进行过滤处理。使用 location URL 匹配配置还可以实现反向代理,用于实现 PHP 动态解析或者负载负载均衡。

  以下这段设置是通过 location 指令来对网页 URL 进行分析处理,所有扩展名以 .gif、.jpg、.jpeg、.png、.bmp、.swf 结尾的静态文件都交给 nginx 处理,而 expires 用来指定静态文件的过期时间,这里是 30 天。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
    root /wwwroot/www.cszhi.com;
    expires 30d;
}

  以下这段设置是将 upload 和 html 下的所有文件都交给 nginx 来处理,当然,upload 和 html 目录包含在 /web/wwwroot/www.cszhi.com 目录中。

location ~ ^/(upload|html)/ {
    root /web/wwwroot/www.cszhi.com;
    expires 30d;
}

  在最后这段设置中,location 是对此虚拟主机下动态网页的过滤处理,也就是将所有以 .jsp 为后缀的文件都交给本机的 8080 端口处理。

location ~ .*.php$ {
    index index.php;
    proxy_pass http://localhost:8080;
}

StubStatus模块配置

  StubStatus 模块能够获取 Nginx 自上次启动以来的工作状态,此模块非核心模块,需要在 Nginx 编译安装时手工指定才能使用此功能。

  以下指令实指定启用获取 Nginx 工作状态的功能。

location /NginxStatus {
    stub_status on;
    access_log logs/NginxStatus.log;
    auth_basic "NginxStatus";
    auth_basic_user_file ../htpasswd;
}
  • stub_status 设置为 “on” 表示启用 StubStatus 的工作状态统计功能。

  • access_log 用来指定 StubStatus 模块的访问日志文件。auth_basic 是 Nginx 的一种认证机制。

  • auth_basic_user_file 用来指定认证的密码文件,由于 Nginx 的 auth_basic 认证采用的是与 Apache 兼容的密码文件,因此需要用 Apache 的 htpasswd 命令来生成密码文件,例如要添加一个 test 用户,可以使用下面方式生成密码文件:

/usr/local/apache/bin/htpasswd -c  /opt/nginx/conf/htpasswd test

  然后输入两次密码后确认之后添加用户成功。

  要查看 Nginx 的运行状态,可以输入 http://ip/NginxStatus ,输入创建的用户名和密码就可以看到 Nginx 的运行状态:

Active connections: 1
server accepts handled requests
34561 35731 354399
Reading: 0 Writing: 3 Waiting: 0

  Active connections 表示当前活跃的连接数,第三行的三个数字表示 Nginx当前总共处理了 34561 个连接, 成功创建次握手, 总共处理了 354399 个请求。最后一行的 Reading 表示 Nginx 读取到客户端 Header 信息数, Writing 表示 Nginx 返回给客户端的Header 信息数
,“Waiting” 表示 Nginx 已经处理完,正在等候下一次请求指令时的驻留连接数。

  在最后这段设置中,设置了虚拟主机的错误信息返回页面,通过 error_page 指令可以定制各种错误信息的返回页面。在默认情况下,Nginx 会在主目录的 html 目录中查找指定的返回页面,特别需要注意的是,这些错误信息的返回页面大小一定要超过 512K,否者会被 ie 浏览器替换为 ie 默认的错误页面。

error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}

配置实例

配置主机为 192.168.1.52、192.168.1.52,且 tomcat 中只有一个 root 项目。

1. nginx 配置 tomcat 集群反向代理

#user  nobody;
worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

pid        logs/nginx.pid;


events {
    worker_connections  1024;
}

http {

gzip              on;  
gzip_min_length   1000;  
gzip_types        text/plain text/css application/x-javascript;

#设定负载均衡的服务器列表
#weigth 参数表示权值,权值越高被分配到的几率越大
upstream helptimely_52{
    server 192.168.1.52:8090 weight=1;
    server 192.168.1.53:8090 weight=1;
                
}
   
server {
    #侦听的80端口
    listen       80;
    server_name  localhost;
    #设定查看 Nginx 状态的地址
    location /nginxstatus{
         stub_status on;
         access_log on;
         auth_basic "nginxstatus";
         auth_basic_user_file htpasswd;
    }
    #匹配以 jsp 结尾的,tomcat 的网页文件是以 jsp 结尾
    location / {
        index index.jsp;
        proxy_pass   http://helptimely_52;    #在这里设置一个代理,和 upstream 的名字一样
        #以下是一些反向代理的配置可删除
        proxy_redirect             off; 
        #后端的Web服务器可以通过X-Forwarded-For获取用户真实 IP
        proxy_set_header           Host $host; 
        proxy_set_header           X-Real-IP $remote_addr; 
        proxy_set_header           X-Forwarded-For $proxy_add_x_forwarded_for; 
        client_max_body_size       10m; #允许客户端请求的最大单文件字节数
        client_body_buffer_size    128k; #缓冲区代理缓冲用户端请求的最大字节数
        proxy_connect_timeout      300; #nginx跟后端服务器连接超时时间(代理连接超时)
        proxy_send_timeout         300; #后端服务器数据回传时间(代理发送超时)
        proxy_read_timeout         300; #连接成功后,后端服务器响应时间(代理接收超时)
        proxy_buffer_size          4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
        proxy_buffers              4 32k; #proxy_buffers 缓冲区,网页平均在 32k以下的话,这样设置
        proxy_busy_buffers_size    64k; #高负荷下缓冲大小(proxy_buffers*2)
        proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
    }
}

}

2. 多个tomcat多个项目配置

多个 tomcat 及每个 tomcat 下有多个项目的时候,需要指定 tomcat 及其下的指定项目。

#user  nobody;
worker_processes  1;

error_log  logs/error.log;
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

#pid存放路径
pid        logs/nginx.pid;

events {
    worker_connections  1024;
}

http {

gzip              on;  
gzip_min_length   1000;  
gzip_types        text/plain text/css application/x-javascript;
#该配置为多个 tomcat 及其下多个项目时配置
#指定 tomcat 并指定项目
server {
    #侦听的 80 端口
    listen       80;
    server_name  localhost;
    #设定查看 Nginx 状态的地址
    location /nginxstatus{
         stub_status on;
         access_log on;
         auth_basic "nginxstatus";
         auth_basic_user_file htpasswd;
    }
     #默认路径不能指定路径、配置原始配置
	 location /{
            root   html;
            index  index.html index.htm;	
	}    
        #为多个tomcat指定其下的某个项目,Timely50 为访问路径名
        #项目名后面需要加/,表示访问项目根路径
        location /Timely50/{
             #指定访问路径
             proxy_pass http://192.168.1.50:8090/Timely4000_01_hrb/;
             #给访问url赋予正常访问值
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location /Timely52/{
             proxy_pass http://192.168.1.52:8090/Timely4000/;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
        location /Timely53/{
             proxy_pass http://192.168.1.53:8090/Timely4000/;
             proxy_set_header Host $host;
             proxy_set_header X-Real-IP $remote_addr;
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }

}
}

3.nginx 原生配置

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   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   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;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

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


    # HTTPS server
    #
    #server {
    #    listen       443 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

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

}

你可能感兴趣的:(nginx)