A部分
nginx.conf 文件内部结构
1、worker_processes
2、error_log
3、events
4、http
1、upstream
2、server
1、listen port
2、server_name domain
3、access_log
4、location
注:nginx配置文件主要分为四部分:main(全局设置)、server(主机设置)、upstream(负载均衡服务器设置)、location(URL匹配 特定位置的设置)。main部分设置的指令将影响到其他的设置;server部分的指令主要用于指定主机和端口;upstream指令主要用于负载均衡,设置一系列的后端服务器;location部分用于匹配网页位置。
B部分
nginx.conf做反向代理配置文件全解析
1、worker_processes 8;
一般一个进程足够了,你可以把连接数设得很大。如果有SSL、gzip这些比较消耗CPU的工作,而且是多核CPU的话,可以设为和CPU的数量一样。或 者要处理很多很多的小文件,而且文件总大小比内存大很多的时候,也可以把进程数增加,以充分利用IO带宽(主要似乎是IO操作有block)。
根据配置实践,服务器是“多个CPU+gzip+网站总文件大小大于内存”的环境,worker_processes设置为CPU个数的两倍比较好。
2、worker_cpu_affinity 0001 0010 0100 1000 0001 0010 0100 1000;
Nginx默认没有开启利用多核cpu,我们可以通过增加worker_cpu_affinity配置参数来充分利用多核cpu的性能。
cpu有多少个核,就有几位数,1代表内核开启,0代表内核关闭。
3、user www;
user是主模块指令,指定nginx worker进程运行用户及其用户组。如果主进程以root运行,nginx将会调用setuid和getuid来设置用户或者组,如果没有指定组,如果没有指定组,那么将使用与用户名相同的组,默认情况下会使用nobody用户与nobody组。
4、worker_rlimit_nofile 40960;
worker_rlimit_nofile是主模块指令,进程能够打开的最多的文件数。如果没有设置的话,这个值就是操作系统的限制。设置后你的操作系统和nginx可以处理比‘ulimit-a’更多的文件。这个值设置的高,nginx就不会报“too many open files”的问题。
5、events {worker_connections 10240;}
单个后台的worker_connections进程的最大并发连接数,并发总数是worker_processes 和worker_connections 的乘积,即max_clients=worker_processes *worker_connections 在设置反向代理的情况下,max_clients=worker_processes *worker_connections/4。进程的最大连接数受liunx系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
6、pid /usr/local/nginx/logs/nginx.pid;
主模块指令,用来指定进程id的存储文件位置。在liunx/unix下,很多程序比如nginx会启动很多进程,而发信号的时候需要知道要向那个进程发信号,不同的进程有不同pid(process id)将pid写进文件就可以使得发送信号时比较简单。比如重新加载nginx的配置可以这样写:kill -HUP ‘cat /usr/local/nginx/logs/nginx.pid’
7、http {
server_tokens off;
设置在HTTP响应中是否显示ngixn的版本号,默认是隐藏的
include blockip.conf;
引入被加入黑名单的IP,里面的记录是:deny 192.168.66.102
include mime.types;
引入mime.types(多用途因特网邮件扩展)
default_type application/octet-stream;
当在映射表找不到时,使用nginx.conf中default-type指定的默认值。例如,默认配置中的指定的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" '
'"$http_host" "$upstream_response_time" "$request_time" "$request_body"';
$remote_addr 记录客户端IP地址
$remote_user 记录客户端用户名称
[$time_local] 通用日志格式下的本地时间
$request 记录请求的URL和http协议
$stauts 记录请求状态
$body_bytes_sent 发送给客户端的字节数,不包括相应头的大小。
$http_referer 记录从哪个页面链接访问过来。
$http_user_agent 记录客户端浏览器相关信息
$http_x_forwarded_for 记录客户端Ip地址
$ http_host始终是HTTP_HOST请求头
$upstream_response_time 是指从Nginx向后端(php-cgi)建立连接开始到接受完数据然后关闭连接为止的时间。$request_time肯定比$upstream_response_time值大,特别是使用POST方式传递参数时,因为Nginx会把request body缓存住,接受完毕后才会把数据一起发给后端。所以如果用户网络较差,或者传递数据较大时,$request_time会比$upstream_response_time大很多。
$request_time请求 nginx 服务所花费的时间,具体而言,针对一个客户端请求,request_time 是指从 nginx 接收到数据到发送完毕 response 的时间间隔
$request_body
记录POST请求日志
access_log /home/nginx/log/access.log main;
用来指定日志文件的存放路径、格式(把定义的log_format 跟在后面)和缓存大小;如果不想启用日志则access_log off ;
error_log /home/nginx/log/error.log;
配置错误日志,用来指定日志文件的存放路径、格式(把定义的log_format 跟在后面)和缓存大小
sendfile on;
开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,减少用户空间和内核空间的上下文切换。对于普通应用设为on,如果用来进行下载等应用自盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。
tcp_nopush on;
FreeBSD 的一个 socket 选项,对应 Linux 的 TCP_CORK,Nginx 里统一用 tcp_nopush 来控制它,并且只有在启用了 sendfile 之后才生效。启用它之后,数据包会累计到一定大小之后才会发送,减小了额外开销,提高网络效率。
keepalive_timeout 65;
长连接超时时间,单位是秒,这个参数很敏感,长连接请求大量小文件的时候,可以减少重新连接的开销,但假如有大文件上传,65s内没有上传完成就会导致失败。如果设置时间过长,用户又多,长时间保持连接会占用大量的资源。
reset_timedout_connection on;
gzip on;
开启gzip压缩输出,减少网络传输
gzip_min_length 1k;
设置允许压缩的页面最小字节数,页面字节数从header头中content-length中获取,或任职为20,建议设置为大于1K的字节数,小于1K可能会越压越大。
gzip_proxied any;
nginx作为反向代理的时候启用,决定开启或者关闭后端服务器返回的结果是否压缩,匹配的前提是后端服务器必须要返回包含“Via”的header头
gzip_buffers 4 16k;
设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16K代表以16K为单位,按照原始数据大小以16K为单位的4倍申请内存。
gzip_http_version 1.0;
用于识别 http 协议的版本,早期的浏览器不支持 Gzip 压缩,用户就会看到乱码,所以为了支持前期版本加上了这个选项,如果你用了 Nginx 的反向代理并期望也启用 Gzip 压缩的话,由于末端通信是 http/1.0,故请设置为 1.0。
gzip_comp_level 4;
gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但是比较消耗CPU)
gzip_types image/jpeg image/gif image/png text/plain text/css application/json text/javascript;
匹配mime类型进行压缩,无论是否指定,“text/html”类型总是会被压缩。
gzip_vary off;
和http头有关系,会在响应头加个 Vary: Accept-Encoding ,可以让前端的缓存服务器缓存经过gzip压缩的页面,例如,用Squid缓存经过Nginx压缩的数据。
gzip_disable “MSIE [1-6].”;
IE6的某些版本对gzip的压缩支持很不好,会造成页面的假死,所以关闭IE6的gzip。
open_file_cache max=100000 inactive=20s;
open_file_cache_valid 30s;
open_file_cache_min_uses 2;
open_file_cache_errors on;
nginx虽然对静态内容做过优化,但是在高流量网站的情况下,仍然可以使用open_file_cache进一步提高性能,nginx缓存将最近使用的文件描述符和相关元数据(如:修改时间,大小等)存储在缓存中。缓存不会存储所请求文件的内容。
upstream TESTGEEXEKCN {
ip_hash;
server 192.168.66.102:9702 max_fails=1 weight=10;
#server 192.168.66.102:8118 max_fails=1 weight=10;
}
upstream按照轮询(默认)方式进行负载,每个请求按照时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。但是缺点:可靠性低和负载分配不均衡。
upstream其他的分配策略:
weight(权重)
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
ip_hash
每个请求访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。
fair(相应时间)
按照后端服务器的相应时间来分配请求,相应时间短的优先分配。
url_hash(第三方)
按照访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
consistent_hash (一致性hash)
upstream TESTGEEXEKCN {
consistent_hash $request_uri;
server 192.168.66.102:9702 id=1001 weight=3;
server 192.168.66.102:8118 id=1002 weight=7;
}
ip_hash存在一个弊端:多个服务器,如果一个服务器挂掉,由于采用的不是一致性hash算法,如果删除没有用到的server,就会影响先前的分配。
server {
listen 80;
server_name test.geexek.cn;
location / {
proxy_next_upstream error timeout http_500 http_502 http_504;
proxy_read_timeout 60s;
proxy_set_header Host $host;
proxy_pass http://TESTGEEXEKCN;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_intercept_errors on;
client_max_body_size 20M;
index index.html index.htm;
}
location ^~ /errorpage {
root /home/nginx/nginx_data;
}
error_page 500 502 503 504 /errorpage/500.html;
error_page 404 /errorpage/404.html;
}
listen用于指定虚拟主机的服务端口
server_name用于指定IP地址或者域名,多个域名之间用空格分开。
location / {
#匹配所有请求
}
location ^~ /errorpage {
#区分大小写,以/errorpage开头的
}
location
location项对请求URL进行匹配,location后面配置了匹配规则。例如上面的例子中,如果请求的URL是localhost/,则会匹配location/这一项;如果请求的URL是localhost/errorpage ,则会匹配location /errorpage 这一项
proxy_next_upstream确定在何种情况下请求将转发到下一个服务器。转发请求只发生在没有数据传递到客户端的过程中。
proxy_read_timeout 设置与后端服务器建立连接的超时时间。
proxy_pass 这个指令设置被代理服务器的地址和被映射的URI,即在前端页面所在服务器nginx配置上开一个路由,然后使用proxy去请求另一个域名下的资源。例如 proxy_pass http://TESTGEEXEKCN; 将匹配的请求反向代理到test.geexek.cn。
proxy_set_header设置HTTP请求中的header字段。默认情况下,反向代理不会转发原始请求中的host头部,如果需要转发,就需要加上。
proxy_intercept_errors 错误请求完成跳转
root 指定项目的根目录。
index 定义首页索引文件
error_page 使用自定义的错误页面

1764

被折叠的 条评论
为什么被折叠?



