Nginx配置文件说明

Published on 2015 - 09 - 20

Nginx 编译安装

依赖包

yum install gcc gcc-c++ zlib-devel pcre-devel openssl-devel

编译Nginx

./configure --with-http_stub_status_module --prefix=/opt/nginx

## http_stub_status_module 是用来检测nginx状态的模块

make && make install

Nginx.conf

整个文件是以块形式组织的,每个块一般以一个大括号“{}”来表示,块可以分为几个层次,整个配置文件中 main 指令位于最高层,这main层下面可以有Events、HTTP等层级,而在HTTP层中又包含有server层,server层又可分为location层,并且一个server层中可以包含多个location层

Nginx.conf的配置文件主要为4部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)和location(URL匹配特定位置的设置)。

main部分设置的指令将影响其他所有位置;server部分的指令主要用于指定主机和端口;upstream指令主要用于负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置。这四者的关系如下:server集成main,location继承server,upstream既不会继承其他设置也不会被继承。

Nginx配置文件示例

user nobody nobody;
woker_processes 4;
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进程平均耗费10MB~12MB内存。建议设置与cpu核心数量一样多。

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

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

-worker_rlimit_nofile用于指定一个nginx进程可以打开的最多文件描述符数目,这里是65535,需要使用命令“ulimit -n 65535”来设置。

-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=worker_processes * worker_connections/4

进程的最大数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65535”后 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" "$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;
sent_timeout 10;
}

#### 下面是对上面这段代码每个配置选项的说明:

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" "$sent_http_content_range"';

log_format 用来设置日志的格式,main 与 download 是日志输出格式的名称,可以在access—_log中引用。

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

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

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

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

keepalive_timeout 用于设置客户端连接保持活动的超时时间。如果超过这个时间,服务器会关闭该链接。

client_header_timeout用于设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,nginx将返回408错误。

client_body_timeout 用于设置客户端请求主体读取超时时间。在超过这个时间之后,服务器会关闭该连接。

client_body_timeout 用于设置客户端请求主体读取超时时间,默认值为60.如果超过这个时间,客户端还没有发送任何数据,nginx将返回408错误。

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

Gzip模块详解

/opt/nginx/sbin/nginx -V
通过这个命令可以查看nginx编译的时候都安装了哪些模块。    `

#### 下面是gzip的相关属性设置:

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负载均衡详解

upstream 支持4种调度算法,期中后两项属于第三方调度算法。
  • 轮询(默认)轮流来
  • weight。权值,越大越优先,后端服务器配置不均的情况下需要用
  • ip_hash 每个请求按访问ip的hash结果分配,这样来自同一个ip的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题。
  • fair 这是个比前两个更加智能的算法。此种算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块
  • url_hash 此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。nginx本身是不支持url_hash的,必须安装nginx的hash的软件包。

    upstream zhutingyu.com {
    ip_hash;
    server 192.168.12.133:80;
    server 192.168.12.134:80 down;
    server 192.168.12.135:80:8090 max_fails=3 fail_timeout=20s;
    server 192.168.12.136:8080;
    }

每个后端服务器在均衡负载中可以有不同的调度状态:

down,表示当前的server暂时不参与负载均衡。

    backup,预留的备份机器,当所有的非backup状态服务器全部不可用或繁忙后,backup会出来接客。

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

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

Server虚拟主机配置

建议将虚拟主机内容写在另一个文件内,用include指令倒入到nginx中,这样更便于维护。

server {
listen  80;
server_name 192.168.1.1 www.zhutingyu.com;
index   index.html index.htm index.jsp;
root /web/wwwroot/www.zhutingyu.com
charset gb2312;
}

    server标志定义虚拟主机开始;listen用于指定虚拟主机的服务器端口;server_name用来指定IP地址或者域名,多个域名之间用空格分开;index用于设定访问的默认首页地址;root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径;charset用于设置网页的默认编码格式。

access_log logs/access.log main;

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

下面这段设置是指定错误页面:

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