【摘自张宴的"实战:Nginx"】nginx配置
user nobody;
worker_processes 2;
#error_log logs/error.log;
error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
#worker_rlimit_nofile 65535 #指定每个nginx进程可以打开的最大文件描述符数量
#worker_rlimit_sigpending 32768 #指定调用进程的真正用户ID的排队数量
# working_directory path #默认值为prifix=path
events {
use poll;
worker_connections 1024; #设置每个进程能处理的连接数,通过worker_connection,worker_processes能够计算出最大连接数为worker_connection*worder_processes;
#假设8个nginx进程(worder_processes),worker_connections 为32768 那么最大连接数就是8*32768 =262144;这个只是理论值而已,其实是达不到这个值的,受系统的限制;
}
http {
include mime.types;
default_type application/octet-stream;
#log_format main 这里的main表示的是格式的名称,可以定义多个log_foramt, 名字不重复就可以了
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"'
#下面以upstream开头的都是upstream模块的相关的变量
'upstream_addr: "$upstream_addr"' #处理请求的upstream地址
'upstream_status: "$upstream_status"' #upstream服务器的应答状态
'upstream_response_time: "$upstream_response_time"' #upstream服务器响应时间(毫秒),多个响应以逗号和冒号分割
'upstream_http_header: "$upstream_http_host"' #$upstream_http_$HEADER HEADER可以是任意的http头,比如host,那么就是$upstream_http_host
'agent:$http_user_agent' #获取浏览器类型
;
#$http_x_forwarded_for 用户可能是经过反向代理,http_x_forwarded_for可以获取到用户的真实IP
#$body_bytes_sent 记录发送给客户端的文件主体内容的大小
#$http_referer 用于记录从哪个页面链接访问过来
#$http_user_agent 用于记录客户端浏览器的信息
#$status 用于记录请求状态
#名字为combined的日志格式
#log_format combined '$remote_addr - $remote_user [$time_local] "$request" ';
access_log logs/access.log main ; #这里的main表示用到了上面名字为main的log_format的格式
#access_log path [format [buffer=size |off]] #path表示日志的存放路径, format指定日志的格式名称, buffer=size 表示设置内置缓冲区的大小,
#access_log logs/access.log main buffer=32k; 设置缓冲区为32k
#access_log off; 关闭访问日志
#
#access_log logs/$server_name.access.log; 使用$server_name变量作为日志名 ,但是这种方式有限制
# 1. nginx进程设置的用户名和组必须对该路径有创建文件的权限,假设Ngxin的user指令设置的用户名和用户组都是wwww,而/data/logs/目录的用户名和用户组为root,日志文件/data/log/$server_name将无法被ningx创建
# 2. 缓冲区不会被使用
# 3. 对于每一条日志记录,日志文件都将先打开文件,写入日志,然后再马上关闭;
# 想法:这样的话,性能不怎么样了吧?详细的配置参数还是看实战Nginx吧。
sendfile on; #指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#http的核心模块
#tcp_nopush on;
#keepalive_timeout 0;
keepalive_timeout 65; #客户端与服务器链接的有效时间 (单位:秒)
keepalive_requests 100; #设置keepalive连接次数,一次请求之后,如果该链接次数并没有超过keepalive_requests指令设置的请求次数,则服务器并不主动断开链接,而是直到达到keepalive_timeout指令设置的时间才关闭链接。
send_timeout 60; #该指令设置发给客户端的应答超时时间。超时时间是指进行了两次TCP握手,还没有转为established状态的时间,如果超过这个时间,客户端没有响应,nginx关闭链接。
send_file on ; #该指令启用或者禁用sendfile()函数,sendfile的作用于数据拷贝在两个文件描述符之间的操作函数.(linux里面的文件操作知识,感觉书上没写明白,还是看Unix环境编程吧)。这个功能谨慎使用,出现过启用之后
#比禁用的效率更低的情况。(关于send_file函数的详解http://www.vpsee.com/2009/07/linux-sendfile-improve-performance/)
server_tokens on#是否在显示返回nginx的版本号
tcp_nodely on ; #该指令运行禁止使用套接字选项TCP_NODELAY,仅适用于keep-alive连接
#默认情况下数据发送时,内核并不会马上发送,它可能等待更多的字节组成一包,这样就可以提高IO的发送效率,但在每次发送很少字节的程序中,TCP_NODELAY时等待时间就会比较长,根据实际情况选择是否开启。
fastcgi_connect_timeoujt 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;
#对网页文件css,js,xml等启动gzip压缩,减少数据量传输,提高访问速度
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript text/css application/xml;
gzip_vary on;
#允许客户端请求的最大单个文件字节数
client_max_body_size 300m;
#缓冲区代理缓冲用户端请求的最大字节数,可以理解为先保存到本地再传给用户
client_body_buffer_size 128k;
#跟后端服务器连接的超时时间_发起握手等候响应超时时间
proxy_connect_timeout 600;
#连接成功后,等候后端服务器响应时间_其实已经进入后端的排队之中等候处理
proxy_read_timeout 600;
#后端服务器数据回传时间,就是在规定时间后端服务器必须传完所有的数据
proxy_send_timeout 600;
#代理请求缓存区,这个缓存区间会保存用户的头信息以供nginx进行规则处理,一般只要能保存头信息即可
proxy_buffer_size 16k;
#同上,告诉Nginx保存单个用的几个buffer最大用多大空间
proxy_buffers 4 32k;
#如果系统繁忙的时候可以申请的最大proxy_buffers 官方推荐*2
proxy_busy_buffers_size 64k;
#proxy 缓存临时文件的大小
proxy_temp_file_write_size 64k;
fastcgi_intercept_errors on; #设置404错误页面,必须开启此项
upstream php_test_pool{
server 127.0.0.1:9000 weight=4 max_fails=2 fail_timeout=30s;
}
upstream php_server_pool {
server 192.168.1.10:80 weight=4 max_fails=2 fail_timeout=30s; #server的后面可以是域名,IP地址加端口, unix socket;
server example.com weight=5;
server unix:/tmp/backend3; #server 是一个unix socket
server 192.168.1.11:80 weight=4 max_fails=2 fail_timeout=30s;
server 192.168.1.12:80 weight=2 max_fails=2 fail_timeout=30s backup; #server 192.168.1.25:3245 backup; #仅仅在非backup服务器全部宕机或者繁忙的时候才启用
}
upstream message_server_pool {
ip_hash; #确保同一个IP访问的时候,会分配到同一台服务器,这样session就可以共享了;使用ip_hash之后,无法保证服务器负载均衡,而且服务器权重等方法不起作用,所以如果后端服务器能共享session还是用服务器的
#不用使用ip_hash方式
server 192.168.1.13:3245;
server 192.168.1.14:3245 down; #down的意思是标记服务器为永久离线状态 #如果后端服务器需要充Nginx负载均衡中(已使用ip_hash)中摘除,那么必须将其标记为"down",而不是从配置文件中删掉或者注释掉,标记为down后,Nginx还是会按照3台负载均衡哈希,如果
server 192.168.1.24:3245; #直接注释掉192.168.1.14:3245,那么就会按照两个哈希,原来已经被分配到192.168.1.13:3245有可能被哈希到192.168.1.24:3245,原来的session就会失效
}
#*************************************************************************
#nginx缓存区的使用,作用类似squid,第一次访问的时候加载资源,后面访问的时候直接使用资源,这里是使用Nginx的方式实现缓存,这里是缓存静态的资源类文件, fastcgi也可以可以缓存的,在server模块里面可以设置的,后面会提到
#注 proxy_temp_path, proxy_cache_path指定的路径必须在一个分区
proxy_temp_path /data/proxy_temp_path;
#设置web缓存区的名字为cache_one ,内存缓存空间大小为200M, 自动清除超过1天美意被访问的缓存数据,磁盘空间大小为30GB
proxy_cache_path /data/proxy_cache_path levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;
#************************************************************************
upstream bbs_server_pool {
server 192.168.1.15:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.16:80 weight=1 max_fails=2 fail_timeout=30s;
server 192.168.1.17:80 weight=1 max_fails=2 fail_timeout=30s;
}
include vhost/*.conf;
}