[nginx]默认ngixn.conf配置文件源码解析
备注:因为经常使用nginx部署php项目,所以源码带有php配置注释例子
#user nginx nginx;
Nginx用户及组:用户组
默认为#user nobody;
worker_processes 4;
工作进程:通常根据硬件调整,等于CPU处理机数量或两倍数量
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
错误日志:logs目录,存放日志路径
#pid logs/nginx.pid
pid:进程标识符的存放路径
events {
#use epoll;
使用epoll的I/O模型,epoll使用于Linux内核2.6版本及以后的系统
nginx与apache相类,针对不同的OS,有不同的事件模型:
A)标准事件模型
Select、poll属于标准事件模型,如果当前系统不存在更有效的方法(如epoll),nginx会选择select或poll
B)高效事件模型
Epoll:使用于Linux内核2.6版本及以后的系统。
Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
等等...
worker_connections 204800;
每一个工作进程的最大连接数量,根据硬件调整,可以尽量大,但别吧CPU跑到100%就行。
每一个进程允许的最多连接数,理论上=worker_processes*worker_connections
#keepalive_timeout 60;
设置超时时间
#client_header_buffer_size 4k;
设置客户端请求头部的缓冲区大小。可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小(分页大小可以使用命令getconf PAGESIZE获取)
注意,client_header_buffer_size该值必须设置为“系统分页大小”的整倍数
#open_file_cache max=65535 inactive=60s;
为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存
#open_file_cache_valid 80s;
设置多久检查一次缓存的有效信息
#open_file_cache_min_uses 1;
open_file_cache指令中的inactive参数时间内文件的最少使用次数,比如60s。
如果超过这个时间,文件描述符一直是在缓存中打开的,如设置为1,即如果有一个文件在inactive时间内一次没被使用,它将被移除
}
设定http服务器,利用它的反向代理功能提供负载均衡支持,通过不同的域名请求分发到不同的项目目录中
http {
include mime.types;
设定mime类型,类型由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"';
#log_format log404 '$status [$time_local] $remote_addr $host$request_uri $sent_http_location';
设置日志格式
$remote_addr和$http_x_forwarded_for用来记录客户端的ip地址;
$remote_user:用来记录客户端用户名称;
$time_local: 用来记录访问时间与时区;
$request: 用来记录请求的url与http协议;
$status: 用来记录请求状态;成功是200,
$body_bytes_sent :记录发送给客户端文件主体内容大小;
$http_referer:用来记录从那个页面链接访问过来的;
$http_user_agent:记录客户浏览器的相关信息
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
#access_log logs/host.access.log main;
用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径
sendfile on;
#tcp_nopush on;
sendfile指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime
tcp_nopush允许或禁止使用socket的TCP_CORK的选项,此选项仅在使用sendfile的时候使用
#keepalive_timeout 0;
keepalive_timeout 65;
keepalive超时时间。
#gzip on;
gzip on;
upstream bakend {
定义负载均衡设备的ip及设备状态
bakend为访问域名image.***.com,比如cms.project.com,对于其他域名访问,如www.project.com,同样使用upstream配置
server 127.0.0.1:8027;
server 127.0.0.1:8028;
server 127.0.0.1:8029;
hash $request_uri;
}
nginx的upstream目前支持4种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。
例如:
upstream bakend {
server 192.168.0.14 weight=10;
server 192.168.0.15 weight=10;
}
2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访问固定访问一个后端服务器,可以解决session的问题。
例如:
upstream bakend {
ip_hash;
server 192.168.0.14:88;
server 192.168.0.15:80;
}
3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream backend {
server server1;
server server2;
fair;
}
4、url_hash(第三方)
按访问url的hash结果来分配,使每个url定向到同一个后端服务器,在后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法
upstream backend {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
示例:
upstream bakend{#定义负载均衡设备的Ip及设备状态}{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
1.down表示单前的server暂时不参与负载
2.weight为weight越大,负载的权重就越大。
3.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
备注:可以配置多个upstream,即支持多组的负载均衡,用来给不同的server虚拟机使用
配置虚拟机
server {
listen 80;
配置监听端口
server_name image.***.com;
#charset koi8-r;
#access_log logs/host.access.log main;
配置访问域名
location / {
root /opt/javaweb/tianti-module-gateway;
index index.html index.html;
}
根目录访问
location /static {
root /opt/javaweb/tianti-module-gateway;
}
含static目录访问
location ~* \.(mp3|exe)$ {
root /opt/javaweb/tianti-module-admin;
expires 24h;
}
以“mp3|exe”结尾的地址
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
...
location / {
对根目录访问进行负载均衡
root /opt/javaweb/tianti-module-admin;
index index.html index.html;
#proxy_pass http://img_relay$request_uri;
proxy_pass http://127.0.0.1:8080;
设置被代理服务器的端口嗯或套接字,以及URL
该例设置动态请求都转发到http://127.0.0.1:808的tomcat应用去处理
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
以上三行,目的是将代理服务器收到的用户的信息传送到真实的tomcat服务器上
proxy_set_header REMOTE-HOST $remote_addr;
}
...
}
更多详细了解可以阅读另一位博友的文章