理解nginx的配置

@date:2015-12-17 16:23:00

nginx配置 #

Nginx配置文件主要分为:全局设置、http块配置。全局配置用于配置进程、日志、工作模式、连接数等公共配置;http块配置用于配置日志格式、连接超时时间、gzip、缓冲等设置,通常包含1个或多个sever块。

http块通常包含:server(主机设置)、upstream(上游服务器设置,主要为反向代理、负载均衡相关配置)。server又包含location

server部分的指令主要用于指定虚拟主机域名、IP和端口;upstream的指令用于设置一系列的后端服务器,设置反向代理及后端服务器的负载均衡;location部分用于匹配网页位置(比如,根目录"/","/images",等等)。

他们之间的关系式:server继承全局设置,location继承server;upstream既不会继承指令也不会被继承。它有自己的特殊指令,不需要在其他地方的应用。

可以有多个server,location属于server子集。

nginx配置详解 #

nginx.conf配置详解:


# 运行用户
user  nginx;

# worker角色的工作进程个数,简单可设置为CPU核数
worker_processes  2; 

# CPU亲和性设置
# 如果是2核,则是01 10
# 如果是4核,则是0001 0010 0100 1000
#worker_cpu_affinity  01 10;

# 全局错误日志
#error_log  logs/error.log;
#error_log  logs/error.log  crit;
error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

# PID文件
pid        logs/nginx.pid;

# worker进程可以允许打开的最大文件数
worker_rlimit_nofile 65535;

# 工作模式及连接数上限
events 
{
	# epoll是多路复用IO(I/O Multiplexing)中的一种方式,
	# 仅用于linux2.6以上内核,可以大大提高nginx的性能
	use epoll;
	
	# 单个后台worker process进程的最大并发链接数 
	worker_connections 65535;
}

# http设置
http {
    # 设定mime类型,类型由mime.type文件定义
	include       mime.types;
	default_type  application/octet-stream;

    # log格式设置
    # log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';
	
	# 设置日志路径,使用定义的main格式
	access_log  logs/access.log  main;
	
	# 设置是否显示目录
	#autoindex on;  
    #autoindex_exact_size off; # 人性化方式显示文件大小否则以byte显示
    #autoindex_localtime on; # 按服务器时间显示,否则以gmt时间显示

    # 解决虚拟主机名字过长 http://www.jb51.net/article/26412.htm
	server_names_hash_bucket_size 128;

	# sendfile指令设置
	#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,
    #对于普通应用,必须设为 on,
    #如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime
	sendfile on; 
	#tcp_nopush on;
	
	# 开启gzip压缩,减少网络传输,建议开启
	gzip on;
    gzip_min_length 200; # 最小长度为多少才开启
    gzip_buffers 4 32k;
    gzip_comp_level 6;
    gzip_types text/plain application/x-javascript application/javascript text/css application/xml text/javascript;
    gzip_vary on;
	
	# 客户端设置
    keepalive_timeout  65; # 连接超时时间
    tcp_nodelay     on;
	send_timeout 20; # 指定响应客户端的超时时间
	
	# 设定客户端请求缓冲
	large_client_header_buffers  4 128k;
    client_header_buffer_size    128k;
	client_max_body_size 10m;# 允许客户端请求的最大单文件字节数
    client_body_buffer_size 128k; # 缓冲区代理缓冲用户端请求的最大字节数

    # FastCGI设置
	fastcgi_connect_timeout 300;
	fastcgi_send_timeout 300;
	fastcgi_read_timeout 300;
	fastcgi_buffer_size 64k;
	fastcgi_buffers 4 64k;
	fastcgi_busy_buffers_size 128k;
	fastcgi_temp_file_write_size 128k;
	
	# ignore Client Closed Request
    fastcgi_ignore_client_abort on;
	
	# nginx带宽限制
	#limit_zone  crawler  $binary_remote_addr  10m;

	# http_proxy设置,按需设置
    #proxy_connect_timeout   75; # 代理连接超时
    #proxy_send_timeout   75; # 代理发送超时
    #proxy_read_timeout   75; # 代理接收超时
    #proxy_buffer_size   4k;
    #proxy_buffers   4 32k;
    #proxy_busy_buffers_size   64k;
    #proxy_temp_file_write_size  64k;
    #proxy_temp_path   /www/server/nginx/proxy_temp 1 2;
    
    # 设定负载均衡后台服务器列表,按需设置,一般不需要
    upstream  backend  { 
		server   192.168.10.100:8080 max_fails=2 fail_timeout=30s ;  
		server   192.168.10.101:8080 max_fails=2 fail_timeout=30s ;  
    }
	
	# 虚拟主机配置,server 指令开始
	#include /usr/local/nginx/conf.d/*.conf;
	
	# server块必须在http块里,可以放在conf.d目录里面,每个虚拟主机一个,例如mysite.com.conf
	server{
		listen 80;
		server_name localhost;

		location /{
			root   /usr/share/nginx/html;
			index index.html index.htm;
		}
	}
}

虚拟主机配置示例 #

/usr/local/nginx/conf.d/me.52fhy.com.conf

# 虚拟主机配置
server {
    listen       80;
    server_name  me.52fhy.com;
    index index.php index.html index.htm;
    root /52fhy.com/wordpress/;
    
    # WordPress Rewrite
    location / {
        if (-f $request_filename/index.html){
            rewrite (.*) $1/index.html break;
        }
        if (-f $request_filename/index.php){
            rewrite (.*) $1/index.php;
        }
        if (!-f $request_filename){
            rewrite (.*) /index.php;
        }
    }
    
    # 解析php|php5后缀
    location ~ .*\.(php|php5)?$
    {
        #fastcgi_pass  unix:/tmp/php-cgi.sock;
        fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        include fastcgi.conf;
    }
    
    # 设置gif|jpg|jpeg|png|bmp|swf文件缓存时间
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires 30d; # 缓存30天
    }
    
    # 设置js|css文件缓存时间
    location ~ .*\.(js|css)?$
    {
        expires 1h; # 缓存1小时
    }

    # 访问日志
    access_log  /www/log/me.52fhy.com.log;
}

简单的nginx配置示例 #

nginx.conf,仅用于测试:

user  nginx;
worker_processes  1;

error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;


events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/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  /var/log/nginx/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    #include /etc/nginx/conf.d/*.conf;

	server{
		listen 80;
		server_name localhost;

		location /{
			root   /usr/share/nginx/html;
			index index.html index.htm;
		}
	}
}

nginx优化 #

优化思路:增加nginx进程可以打开的文件数,增加子进程最大并发连接数;同时进行系统内核优化。系统内核优化也是从单个进程可以打开的文件数、子进程可以打开的连接数等入手。

常见优化参数:

# 内核优化
ulimit -n 65535
net.core.somaxconn = 262144
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_syncookies = 1

# nginx优化
worker_rlimit_nofile 65535;
use epoll;
worker_connections 65535;
keepalive_timeout 60;

内核优化如何修改:
1、ulimit参数直接运行ulimit -SHn 65535即可,可以使用ulimit -n查看;
2、其它参数优化示例:
net.core.somaxconn对应文件/proc/sys/net/core/somaxconn:

# 查看
cat /proc/sys/net/core/somaxconn

# 修改
echo 65535 > /proc/sys/net/core/somaxconn

net.ipv4.tcp_tw_recycle对应文件/proc/sys/net/ipv4/tcp_tw_recycle:

# 查看
cat /proc/sys/net/ipv4/tcp_tw_recycle

# 修改
echo 65535 > /proc/sys/net/ipv4/tcp_tw_recycle

3、也可以修改/etc/sysctl.conf文件:

# 调高系统的 IP 以及端口数据限制,从可以接受更多的连接
net.ipv4.ip_local_port_range = 2000 65000
 
net.ipv4.tcp_window_scaling = 1
 
# 设置协议栈可以缓存的报文数阀值,超过阀值的报文将被内核丢弃
net.ipv4.tcp_max_syn_backlog = 3240000
 
# 调高 socket 侦听数阀值
net.core.somaxconn = 3240000
net.ipv4.tcp_max_tw_buckets = 1440000
 
# 调大 TCP 存储大小
net.core.rmem_default = 8388608
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_congestion_control = cubic

# tcp重新回收
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1

修改配置之后需要执行以下命令使之生效:

sysctl -p /etc/sysctl.conf

反向代理示例 #

反向代理配置示例:

location / {
	#设置主机头和客户端真实地址,以便服务器获取客户端真实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;
	
	#禁用缓存
	proxy_buffering off;
	
	#设置反向代理的地址
	proxy_pass http://192.168.1.1;
}

代理地址根据实际情况修改。

注意:反向代理必须配置在server块里。

负载均衡示例 #

upstream site {
	server 192.168.3.82:8040;
	server 192.168.3.82:8041;
}
 
server {
	listen 8039;
	server_name 192.168.3.82;
	 
	#charset koi8-r;
	 
	#access_log logs/host.access.log main;
	 
	location / {
		root html;
		index index.html index.htm;
		proxy_pass http://site;
	}
}

访问192.168.3.82:8080的时候,会来回访问192.168.3.82:8040和192.168.3.82:8041。

注意:负载均衡必须配置在http块里。

负载均衡分配方式 #

Nginx的upstream支持5种分配方式,下面将会详细介绍,其中,前三种为Nginx原生支持的分配方式,后两种为第三方支持的分配方式:
1、轮询
轮询是upstream的默认分配方式,即每个请求按照时间顺序轮流分配到不同的后端服务器,如果某个后端服务器down掉后,能自动剔除。

upstream backend {
	server 192.168.1.101:8888;
	server 192.168.1.102:8888;
	server 192.168.1.103:8888;
}

2、weight
轮询的加强版,即可以指定轮询比率,weight和访问几率成正比,主要应用于后端服务器异质的场景下。

upstream backend {
	server 192.168.1.101 weight=1;
	server 192.168.1.102 weight=2;
	server 192.168.1.103 weight=3;
}

3、ip_hash
每个请求按照访问ip(即Nginx的前置服务器或者客户端IP)的hash结果分配,这样每个访客会固定访问一个后端服务器,可以解决session一致问题。

upstream backend {
	ip_hash;
	server 192.168.1.101:7777;
	server 192.168.1.102:8888;
	server 192.168.1.103:9999;
}

4、fair
fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。

upstream backend {
	server 192.168.1.101;
	server 192.168.1.102;
	server 192.168.1.103;
	fair;
}

5、url_hash
与ip_hash类似,但是按照访问url的hash结果来分配请求,使得每个url定向到同一个后端服务器,主要应用于后端服务器为缓存时的场景下。

upstream backend {
	server 192.168.1.101;
	server 192.168.1.102;
	server 192.168.1.103;
	hash $request_uri;
	hash_method crc32;
}

其中,hash_method为使用的hash算法,需要注意的是:此时,server语句中不能加weight等参数。

参考:
1、Nginx 服务器安装及配置文件详解
http://www.runoob.com/w3cnote/nginx-install-and-config.html#rd
2、nginx配置location总结及rewrite规则写法 | Sean's Notes
http://seanlook.com/2015/05/17/nginx-location-rewrite/
3、Nginx 图片 js文件缓存配置方法-nginx-操作系统-壹聚教程网
http://www.111cn.net/sys/nginx/64074.htm
4、nginx利用proxy_cache来缓存文件
http://blog.51yip.com/apachenginx/1018.html
5、Nginx负载均衡 - 小刚qq - 博客园
http://www.cnblogs.com/xiaogangqq123/archive/2011/03/04/1971002.html
6、Nginx深入详解之upstream分配方式-scq2099yt-ChinaUnix博客
http://blog.chinaunix.net/uid-22312037-id-4081140.html

Build by Loppo 0.6.14