# 允许编辑此配置的用户或用户组(默认nginx)
user nginx;
# 工作衍生进程数,可以同时处理的进程数,通常是 cpu 核数或 cpu 核数的2倍
worker_processes 1;
# 设置错误文件的存放路径(错误类型可选 warn, info, notice, crit 也可不选为空)
error_log /var/log/nginx/error.log warn;
# 设置进程 pid 存放路径
pid /var/run/nginx.pid;
events {
use epoll; # epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024; # 单个后台 worker process进程的最大并发链接数
}
# 网页相关的 http 请求配置
http {
include /etc/nginx/mime.types; # 文件扩展名与类型映射表
default_type application/octet-stream; # 默认文件类型
#设定请求缓存
server_names_hash_bucket_size 128;
client_header_buffer_size 512k;
large_client_header_buffers 4 512k;
client_max_body_size 100m;
#隐藏响应header和错误通知中的版本号
server_tokens off;
#设置日志模式
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 参数可以允许把 httpresponse header 和文件的开始放在一个文件里发布,积极的作用是减少网络报文段的数量
#tcp_nopush on;
#激活 tcp_nodelay, 内核会等待将更多的字节组成一个数据包,从而提高I/O性能
tcp_nodelay on;
#连接超时时间,单位:秒
keepalive_timeout 65;
#开启ssi支持,默认是off
ssi on;
ssi_silent_errors on;
# 开启gzip, 具体 gzip 相关配置见下文(一, 具体的 gzip 相关配置) ↓
gzip on;
#反向代理负载均衡设定部分
#upstream表示负载服务器池,定义名字为 backend_server 的服务器池
upstream backend_server {
server 10.254.244.20:81 weight=1 max_fails=2 fail_timeout=30s;
server 10.254.242.40:81 weight=1 max_fails=2 fail_timeout=30s;
server 10.254.245.19:81 weight=1 max_fails=2 fail_timeout=30s;
server 10.254.243.39:81 weight=1 max_fails=2 fail_timeout=30s;
#设置由 fail_timeout 定义的时间段内连接该主机的失败次数,以此来断定 fail_timeout 定义的时间段内该主机是否可用。默认情况下这个数值设置为 1。零值的话禁用这个数量的尝试。设置在指定时间内连接到主机的失败次数,超过该次数该主机被认为不可用。
#这里是在30s内尝试2次失败即认为主机不可用!
}
# 具体 upstream 分配方式 详见下文 (三, upstream 模块相关说明)↓
# 也可以引用外部 基于域名的虚拟主机的配置文件, 详见下文 (二, default.conf 配置)↓
# include /etc/nginx/conf.d/*.conf;
# 基于域名的虚拟主机
server {
# 监听 80 端口
listen 80;
#定义使用 localhost 访问
server_name www.abc.com;
#定义服务器的默认网站根目录位置(也可定义在默认请求 location /{} 里)
root html;
#定义首页索引文件的名称
index index.html index.htm;(也可定义在默认请求 location /{} 里)
# 字符编码
#charset koi8-r;
#设定本虚拟主机的访问日志
#access_log /var/log/nginx/host.access.log main;
# 默认请求
location / {
root /usr/share/nginx/html;
}
# 根目录禁下止访问 .htxxx 文件
location ~ /.ht {
deny all;
}
# 静态文件, 将符合js,css文件的等设定expries缓存参数,要求浏览器缓存。
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
#过期30天,静态文件不怎么更新,过期可以设大一点,
#如果频繁更新,则可以设置得小一点。
expires 30d;
}
# 错误页面
#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 /usr/share/nginx/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;
#}
}
}
```
#### 具体的 gzip 相关配置
```
# 打开或关闭gzip
gzip on
# gzip 压缩级别,1-9,数字越大压缩的越好,也越占用CPU
# 以一个大小为92.6K的脚本文件为例, 其中最后三个数值分别表示压缩比、包大小、平均处理时间以及CPU消耗(100用户并发下)
-----------------------------------------------
# http://10.27.180.75/jquery.js
# gzip_comp_level 0: 0,94840, 63 [ms], 29%
# gzip_comp_level 1: 2.43,39005, 248 [ms], 100%
# gzip_comp_level 2: 2.51,37743, 273 [ms], 100%
# gzip_comp_level 3; 2.57,36849, 327 [ms], 100%
# gzip_comp_level 4; 2.73,34807, 370 [ms], 100%
# gzip_comp_level 5; 2.80,33898, 491 [ms], 100%
# gzip_comp_level 6; 2.82,33686, 604 [ms], 100%
# gzip_comp_level 7; 2.82,33626, 659 [ms], 100%
# gzip_comp_level 8; 2.82,33626, 698 [ms], 100%
# gzip_comp_level 9; 2.82,33626, 698 [ms], 100%
-----------------------------------------------
# 从这我们可以得出结论:
# 1. 随着压缩级别的升高,压缩比有所提高,但到了级别6后,很难再提高;
# 2. 随着压缩级别的升高,处理时间明显变慢;
# 3. gzip很消耗cpu的性能,高并发情况下cpu达到100%
#因此,建议:
#1. 一方面,不是压缩级别越高越好,其实gzip_comp_level 1的压缩能力已经够用了,后面级别越高,压缩的比例其实增长不大,反而很吃处理性能。
#2. 另一方面,压缩一定要和静态资源缓存相结合,缓存压缩后的版本,否则每次都压缩高负载下服务器肯定吃不住。
gzip_comp_level 1;
# 通过表达式,表明哪些UA头不使用gzip压缩, 比如:禁用IE 6 gzip
gzip_disable "MSIE [1-6]\.";
# 启用gzip压缩的最小文件,小于设置值的文件将不会压缩,以K为单位,当值为0时,所有页面都进行压缩。
gzip_min_length 1k;
# 设置需要进行压缩的文件类型。javascript有多种形式。其中的值可以在 mime.types 文件中找到。如果不在设置类型范围内的请求不进行压缩
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/vnd.ms-fontobject font/ttf font/opentype font/x-woff image/svg+xml;
# 是否在http header中添加Vary: Accept-Encoding,建议开启
gzip_vary on;
# 设置压缩所需要的缓冲区大小,设置用于处理请求压缩的缓冲区数量和大小。比如32 4K表示按照内存页(one memory page)大小以4K为单位(即一个系统中内存页为4K),申请32倍的内存空间。建议此项不设置,使用默认值。
gzip_buffers 32 4k;
# 设置gzip压缩针对的HTTP协议版本, 用于识别http协议的版本,早期的浏览器不支持gzip压缩,用户会看到乱码,所以为了支持前期版本加了此选项。默认在http/1.0的协议下不开启gzip压缩。
gzip_http_version 1.0;
```
#### upstream 模块相关说明
##### 一, upstream 分配方式
##### 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;
}
# 注意:
# 当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是 weight 和 backup, 会导致负载不均衡。
```
4、fair
##### fair顾名思义,公平地按照后端服务器的响应时间(rt)来分配请求,响应时间短即rt小的后端服务器优先分配请求。如果需要使用这种调度算法,必须下载Nginx的upstr_fair模块。
```
upstream backend {
server 192.168.1.101;
server 192.168.1.102;
server 192.168.1.103;
fair;
}
```
5、url_hash,目前用consistent_hash替代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等参数。