Nginx配置详解以及内核优化

  

安装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(单位是小时)


你可能感兴趣的:(nginx,配置)