user www www; worker_processes auto; #nginx要开启的进程数 一般等于cpu的总核数 其实一般情况下开4个或8个就可,不能确定的时候,将其设置为可用的CPU内核数将是一个好的开始(设置为“auto”将尝试自动检测它)。 error_log /home/wwwlogs/nginx_error.log crit; pid /usr/local/nginx/logs/nginx.pid; worker_rlimit_nofile 51200; #更改worker进程的最大打开文件数限制。如果没设置的话,这个值为操作系统的限制。设置后你的操作系统和Nginx可以处理比“ulimit -a”更多的文件,所以把这个值设高,这样nginx就不会有“too many open files”问题了。 #events模块中包含nginx中所有处理连接的设置。 events { use epoll; #设置用于复用客户端线程的轮询方法。如果你使用Linux 2.6+,你应该使用epoll。如果你使用*BSD,你应该使用kqueue。 worker_connections 51200; #设置可由一个worker进程同时打开的最大连接数。如果设置了上面提到的worker_rlimit_nofile,我们可以将这个值设得很高。 记住,最大客户数也由系统的可用socket连接数限制(~ 64K),所以设置不切实际的高没什么好处。 multi_accept on; #nginx收到一个新连接通知后接受尽可能多的连接。 } #HTTP模块控制着nginx http处理的所有核心特性。 http { include mime.types; default_type application/octet-stream; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 50m; #允许客户端请求的单个文件最大字节数 client_body_buffer_size 128k; #缓冲区代理缓存用户端请求的最大字节数,可以理解为先保存到本地在传给用户 client_header_timeout 10; #设置请求头的超时时间 client_body_timeout 10; #设置请求体的超时时间 sendfile on; #可以让sendfile()发挥作用。sendfile()可以在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据之前在用户空间申请数据缓冲区。之后用read()将数据从文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是立即将数据从磁盘读到OS缓存。因为这种拷贝是在内核完成的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。 tcp_nopush on; #设置nginx在一个数据包里发送所有头文件,而不一个接一个的发送。 keepalive_timeout 60; #设置客户端链接超时时间。服务器将在这个超时时间过后关闭链接。我们将它设置低些可以让ngnix持续工作的时间更长。 reset_timedout_connection on; #设置nginx关闭不响应的客户端连接。这将会释放那个客户端所占有的内存空间。 tcp_nodelay on; #设置nginx不要缓存数据,而是一段一段的发送--当需要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能立即得到返回值。 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 256k; gzip on; #采用gzip压缩的形式发送数据。这将会减少我们发送的数据量 gzip_min_length 1k; #设置对数据启用压缩的最少字节数。如果一个请求小于1000字节,我们最好不要压缩它,因为压缩这些小的数据会降低处理此请求的所有进程的速度。 gzip_buffers 4 16k; gzip_http_version 1.1; gzip_comp_level 2; #设置数据的压缩等级。这个等级可以是1-9之间的任意数值,9是最慢但是压缩比最大的。我们设置为4,这是一个比较折中的设置。 gzip_types text/plain application/javascript application/x-javascript text/javascript text/css application/xml application/xml+rss; #设置需要压缩的数据格式。 gzip_vary on; gzip_proxied expired no-cache no-store private auth; #gzip_proxied允许或者禁止压缩基于请求和响应的响应流。如果置为any,意味着将会压缩所有的请求 gzip_disable "MSIE [1-6]\."; #为指定的客户端禁用gzip功能。我们设置成IE6或者更低版本以使我们的方案能够广泛兼容。 limit_conn_zone $binary_remote_addr zone=perip:10m; #设置用于保存各种key(比如当前连接数)的共享内存的参数。5m就是5兆字节,这个值应该被设置的足够大以存储(32K*5)32byte状态或者(16K*5)64byte状态。$binary_remote_addr是限制同一客户端ip地址 limit_conn_zone $server_name zone=perserver:10m; #$server_name是限制同一server最大并发数; limit_conn perip 10; ##如果设置limit_conn_zone,则新增 "limit_conn perip 10;",limit_conn 为给定的key设置最大连接数。这里key是addr,我们设置的值是100,也就是说我们允许每一个IP地址最多同时打开有100个连接 limit_rate 100k; #limit_rate为限制下载速度 server_tokens off; #是否在错误页面中的nginx版本数字,这样对于安全性是有好处的 #log format log_format access '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" $http_x_forwarded_for'; access_log off; #设置nginx是否将存储访问日志。关闭这个选项可以让读取磁盘IO操作更快 proxy_connect_timeout 600; #跟后端服务器连接超时时间,发起握手等待响应超时时间 proxy_read_timeout 600; #连接成功后等待服务器响应时间,其实已经进入后端服务器队列中排队等候处理 proxy_send_timeout 600; #后端服务器数据传回时间,就是在规定时间内后端服务器必须传完所有数据 proxy_buffer_size 16k; #代理请求缓存区大小,这个缓存区会存储用户头信息以供nginx进行规则处理,一般空间大小只要能保存下头信息即可 proxy_buffers 4 32k; #设置单个用户缓存区个数以及最大缓存大小 proxy_busy_buffer_size 64k; #系统繁忙是可以申请更大的缓存空间 #upstream 设置一组可以在proxy_pass和fastcgi_pass可用的代理服务器,默认的负载均衡方式为轮询。Upstream模块中server指令用于指定后端服务器名称和参数,服务器名称可以是域名、端口号、ip、或unix socket upstream php_server_pool{ server 192.168.1.10:80 weight=4 max_fails=2 fail_timeout=30s; #指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 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; } upstream message_server_pool{ server 192.168.1.13:3245; server 192.168.1.14:3245 down; #down 表示单前的server暂时不参与负载 server 192.168.1.15:3245 backup; #其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。 } //第一个虚拟主机,一般默认 server{ listen 80; server_name www.yourdomain.com; index index.shtml index.html index.htm index.php; root /home/wwwroot/www.yourdomain.com; #error_page 404 /404.html; include enable-php.conf; location / { rewrite ^([^\.]*)/shows-([0-9]+)-([0-9]+)-([0-9]+)\.shtml$ $1/index.php?a=shows&catid=$2&id=$3&page=$4 last; #url重写 if (!-e $request_filename) { rewrite ^(.*)$ /index.php?s=$1 last; break; } } location /nginx_status { stub_status on; access_log off; } location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /\. { deny all; } access_log /home/wwwlogs/www.yourdomain.com.log access; } //第二个虚拟主机,反向代理php_server_pool这组服务器 server{ listen 80; server_name www1.yourdomain.com; location / { #如果后端服务器返回502、504、执行超时等操作,自动将请求转发到upstream负载均衡池中的另一台服务器,实现故障转移。 proxy_next_upstream http_502 http_504 error timeout invalid_header; proxy_pass http://php_server_pool; proxy_set_header Host www1.yourdomain.com; proxy_set_header X-Forwarded-For $remote_addr; } access_log /home/wwwlogs/www1.yourdomain.com.log access; } //第三个虚拟主机 server{ listen 80; server_name www2.yourdomain.com; #访问http://www2.yourdomain.com/message/***地址,反向代理message_server_pool这组服务器 location /message/ { proxy_pass http://message_server_pool; proxy_set_header Host $host; } location / { proxy_pass http://php_server_pool; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; } access_log off; } include vhost/*.conf; }