您的位置:首页 > 运维架构 > Nginx

Nginx配置详解以及内核优化

2014-09-01 14:20 597 查看
安装nginx:
yum -y install pcre*

tar -zxvf nginx-1.6.0.tar.gz
cd nginx-1.6.0/
mkdir /usr/local/nginx/
./configure --prefix=/usr/local/nginx/ --with-http_stub_status_module #开启NginxStatus功能,监控nginx当前状态
make && make install

至此,安装完成

配置nginx:

jvm_route $cookie_JSESSIONID|sessionid reverse;

nginx_upstream_jvm_route;

user nobody nobody; #主模块指令,指定nginx worker进程运行的用户以及用户组,默认由nobody 帐号运行。

worker_processes 4; # 主模块指令,指定nginx要开启的进程数。每个nginx进程平均消耗 10~20M内存,不建议设置超过8个。

error_log logs/error_log notice; #主模块指令, 用来定义全局错误日志文件。

pid logs/nginx.pid; #主模块指令,指定nginx 的pid.

worker_rlimit_nofile 65535; #用来绑定worker进程和CPU。

events{ #指定nginx工作模式和连接上限。
use epoll; #设置nginx工作模式,epoll是高效工作模式。
worker_connections 65536; #事件模块指令,定义nginx每个进程最大连接数,默认1024。最大客户连接数由worker_processes和worker_connections决定
即 max_client=worker_processes*worker_connections,在作为反向代理时:max_client=worker_processes*worker_connections / 4
}

http{
include conf/mime.types; #主模块指令,设置包含文件。
default_type application/octet-stream; #属于http核心模块指令,设置默认类型为二进制流,当文件类型未定义时使用这种方式。

client_max_body_size 20; #设置允许客户端请求最大单个文件字节数。
client_header_buffer_size 32k; #指定来自客户端请求头的缓冲区大小。
large_client_header_buffers 4 32k; #指定客户端请求头中较大的消息头缓存最大数量和大小。

sendfile on; #开启高效文件传输模式,防止网络堵塞。
tcp_nopush on;
tcp_nodelay on;

keepalive_timeout 60; #客户端连接时时间,超时之后服务器端自动关闭该连接。
client_header_timeout 10; #客户端请求头的超时时间。
client_body_timeout 10; #客户端请求主体超时时间。
send_timeout 10; #客户端响应超时时间,仅限于两个连接活动之间的时间

gzip on; #开启gzip压缩输出数据流,提高传输速度
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认是0,表示不管多大都进行压缩,建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k; #表示申请4个为16k的内存作为存储gizp的压缩缓存。
gzip_http_version 1.1; #指定http协议版本,默认1.1,默认即可。
gzip_comp_level 2; #gzip压缩比,1为最小,处理最快;9为压缩比最大,处理最慢,传输速度最快,也最消耗CPU;
gzip_types text/plain application/x-javascript text/css application/xml; #指定压缩类型,text/html这种类型即使不指定也会被压缩。
gzip_vary on; #让前端缓存server(如squid、varnish等)也缓存经gzip压缩的页面。

upstream crazy.net{ #upstream 是定义负载均衡的模块,定义crazy.net名称的负载均衡器,通过调度算法,将client调度给后端不同的server;
ip_hash;
server 10.2.16.253:80;
server 10.2.16.254:80 max_fails=3 fail_timeout=20s;
server 10.2.16.252:80 down;
server 10.2.16.251:8080;
}

nginx的四种调度算法:

1、轮询,默认使用rr轮询算法,将client逐一分发给不同的server,后端某台服务器宕机,会被自动剔除,使用户不受影响。

2、weight,权值算法,数字越大,分配的几率越高,主要用于后端服务器性能不同的情况下。

3、ip_hash,将client按IP的hash值分配,这样的话,client会被分配给一台固定的server,让client始终访问的都是这台,解决Session问题;

4、fair, 比以上更智能,根据 页面大小 和 加载速度 进行负载均衡,看后端的服务器响应时间来决定分配请求,时间短的优先。需要下载upstream_fair模块才能使用。

5、url_hash,此方法按访问url的hash结果来分配请求,使每个url定向到某一台固定server,可以进一步提高server效率。需要下载nginx的hash包才能用。

upstream模块指定server后端服务器的ip和端口,同时可以设定每个后端服务器在upstream中的状态:

down: 表示这台server暂时不参与负载均衡;
backup:预留的备份server,当所有的非bakcup机器出现故障或忙的时候,才会请求bakcup机器,因此这台server压力最轻;
max_fails:允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误;
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。和max_fails一起使用;

注意:当使用ip_hash调度算法时,后端服务器不能是bakcup状态或weight。

server{ #配置nginx虚拟主机

listen 80; #本机nginx的监听端口
server_name www.czy.com; #域名
index index.html index.htm index.jsp index.php index.cgi; #指定首页文件
root /usr/local/nginx/html/; #指定网页根目录
charset gb2312; #网页默认编码格式,gb2312为简体中文;

access_log logs/www.czy.com.access.log main; #指定访问日志路径,main表示访问日志的输出格式;

location ~ (\.jsp)|(\.do)$ { # URL 匹配设置,location支持正则匹配和if判断,所以很灵活。

proxy_pass http://crazy.net; #指定代理的后端服务器地址和端口,也可以是upstream的负载均衡器名;
proxy_next_upstream http_500 http_502 http_503 error timeout invalid_header; #指定故障转移策略,当后端节点返回500,502,503,等执行超时错误时,自动将请求转发到upstream组的另一台服务器,实现故障转移。
proxy_redirect off; #如果需要修改从被代理server传来的应答头中的"Location"和"Refresh"字段,可以用这个指令设置。
proxy_set_header Host $host; #指定后端server获取Client的主机名和地址以及代理的真实IP
proxy_set_header X-Real_IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #
client_body_buffer_size 128k; #指定客户端请求body缓冲区的大小,可以理解为先保存到本地再传给用户
proxy_connect_timeout 90; #指定后端server的连接超时时间,即发起握手等候响应的超时时间
proxy_send_timeout 90; #指定后端server的数据回传时间,即在规定时间内后端服务器必须传完所有数据,否则nginx将断开连接
proxy_read_timeout 90; #设置nginx从后端server取信息的时间,表示建立连接成功后,nginx等待后端服务器的响应时间
proxy_buffer_size 4k; #设置缓冲区大小,默认该缓冲区大小等于指令proxy_buffers设置的大小
proxy_buffers 4 32k; #设置缓冲区的数量和大小,nginx从后端server获取的响应信息会放到缓冲区
proxy_busy_buffers_size 64k; #设置系统很忙时可以使用的proxy_buffers大小,官方推荐的大小为proxy_buffers*2
proxy_temp_file_write_size 64k; #设置 Proxy缓存临时文件的大小
}

location ~ ^/(upload|html)/ { #将upload和html目录下的所有文件都交给nginx处理
root /usr/local/nginx/html/; #指定/usr/local/nginx/html/下的upload或html目录
expires 30d; #expires指定静态文件过期时间,30d表示30天
}
location ~ .*.jsp$ { #将所有以.jsp文件为后缀的url都交给10.2.16.253的80端口来处理
index index.jsp;
proxy_pass http://10.2.16.253:80; }
location /NginxStatus{ #开启nginx的stubstatus模块,能够获取nginx的工作状态,此模块需要编译安装时指定才能用
stub_status on; #启用
access_log logs/NginxStatus.log;
auth_basic "NginxStatus"; #指定认证机制
auth_basic_user_file ../htpasswd; #指定密码文件,Nginx的auth_basic与apache的兼容,因此用htpasswd命令来生成一个密码文件即可
} #在http://ip/NginxStatus 输入刚刚htpasswd创建的用户名密码即可看到

location ~ \.php$ {
root /usr/local/nginx/html; #
fastcgi_pass 127.0.0.1:9000; #设置fastcgi的使用端口
fastcgi_index index.php; #首页
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; #指定php网页文件的主目录
include fastcgi_params; #包含fastcgi的参数配置文件
}

location ~ \.cgi$ { #添加fastcgi对perl的支持,需要下载wrapper程序,然后写脚本启动,详细解释在下文
root /usr/local/nginx/html;
fastcgi_pass unix:/usr/local/nginx/logs/nginx-fcgi.sock; #通信方式为unix socket,速度快
fastcgi_index index.cgi;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; #
include fastcgi_params;
}

location ~* \.(jpg|gif|png|swf)$ { #匹配 以jpg或gif或png或swf结尾的文件的网页根目录
root /usr/local/nginx/html/img;
index index.jpg index.gif index.png index.swf;
}

####关于perl(fastcgi)安装:

1、需要先获取wrapper程序,从http://www.nginx.eu/nginx-fcgi/下载nginx-fcgi.txt文件,然后将其命名为nginx-fcgi.pl,放到/usr/local/nginx目录下,nginx-fcgi.pl是一个用perl脚本写的wrapper实例,所以操作系统必须支持perl程序和相关模块。
2、安装FCGI、安装IO模块、安装IO-ALL模块,过程略
3、编写启动wrapper程序的脚本,用unix套接字的方式启动,给套接字文件777权限。

#####关于nginx支持java,可以使用Nginx做反向代理,后端跑tomcat,把.jsp | .do 的文件,都定向到tomcat来处理。

nginx内核参数优化项:

net.ipv4.tcp_max_tw_buckets = 6000 #设定timewait的数量,默认是180000,这里设置为6000
net.ipv4.ip_local_port_range = 1024 65000 #用来设定允许系统打开的端口范围
net.ipv4.tcp_tw_recycle = 1 #设置启用timewait快速回收
net.ipv4.tcp_tw_reuse = 1 #设置开启重用,允许将TIME-WAIT sockets 重新用于新的TCP连接
net.ipv4.tcp_syncookies = 1 #设置开启SYN Cookies,当出现SYN等待队列溢出时,启用cookies进行处理
net.core.somaxconn = 262144 #默认值是128,用于调节系统同时发起的tcp连接数,在高并发的请求中,默认的值可能会导致连接超时或者重传
net.core.netdev_max_backlog = 262144 #表示当每个网络接口,接收数据包,的速率,比内核,处理这些包的,速率快时,允许发送到 队列 的数据包的最大数目
net.ipv4.tcp_max_orphans = 262144 #防止简单DDOS攻击,不能过分依靠这个限制甚至人为减小这个值,更多的情况下应该增加这个值
net.ipv4.tcp_max_syn_backlog = 262144 #用于记录那些 尚未收到 客户端确认信息 的 连接请求 的最大值,对于有128MB内存的系统来说,默认值是1024,
net.ipv4.tcp_synack_retries = 1 #决定了内核放弃连接之前,发送SYN+ACK包的数量
net.ipv4.tcp_syn_retries = 1 #表示在内核放弃建立连接之前发送SYN包的数量
net.ipv4.tcp_fin_timeout = 1 #决定了套接字保持在FIN-WAIT-2状态的时间,默认值是60秒,正确设置这个值非常重要,有时即使一个负载很小的web服务器,也会出现大量的死套接字而产生内存溢出的风险
net.ipv4.tcp_keepalive_time = 30 #当keepalived启用的时候,TCP发送keepalive消息的频度,默认值是2(单位是小时)

本文出自 “Fate” 博客,请务必保留此出处http://yyzll.blog.51cto.com/4283444/1547431
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: