web中间件之nginx

web中间件之nginxjavascript

1、nginx css

nginx缺点,负载均衡时,nginx和负载的tomcat集群,session不共享。java

apache+tomcat能够实现session共享。node

nginx五种负载均衡模式。linux

 

 

配置文件一:nginx

uer nginx nginx ;  #Nginx用户及组:用户 组。window下不指定
worker_processes 8; #工做进程:数目。根据硬件调整,一般等于CPU数量。
#error_log  logs/error.log  notice;  
error_log  logs/error.log  info;  
pid logs/nginx.pid;
worker_rlimit_nofile 204800; #指定进程能够打开的最大描述符:数目。 -n)与nginx进程数相除,可是nginx分配请求并非那么均匀,因此最好与ulimit -n 的值保持一致。如今在Linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。这是由于nginx调度时分配请求到进程并非那么的均衡,因此假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。
 
events
{
use epoll; #使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。
/*  补充说明: 与apache相类,nginx针对不一样的操做系统,有不一样的事件模型 A)标准事件模型 Select、poll属于标准事件模型,若是当前系统不存在更有效的方法,nginx会选择select或poll B)高效事件模型 Kqueue:使用于FreeBSD
4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会形成内核崩溃。 Epoll:使用于Linux内核2.6版本及之后的系统。 Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。
*/ worker_connections
204800; #没个工做进程的最大链接数量。根据硬件调整,和前面工做进程配合起来用,尽可能大,可是别把cpu跑到100%就行。每一个进程容许的最多链接数,理论上每台nginx服务器的最大链接数为。worker_processes*worker_connections keepalive_timeout 60; #keepalive超时时间。 client_header_buffer_size 4k; #客户端请求头部的缓冲区大小。这个能够根据你的系统分页大小来设置,通常一个请求头的大小不会超过1k,不过因为通常系统分页都要大于1k,因此这里设置为分页大小。分页大小能够用命令getconf PAGESIZE 取得。但也有client_header_buffer_size超过4k的状况,可是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参数时间内文件的最少使用次数,若是超过这个数字,文件描述符一直是在缓存中打开的,如上例,若是有一个文件在inactive时间内一次没被使用,它将被移除。 } ##负载均衡配置 upstream bakend { server 127.0.0.1:8027; server 127.0.0.1:8028; server 127.0.0.1:8029; hash $request_uri; }
/* nginx的upstream目前支持5种方式的分配
1、轮询(默认) 每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。 2、weight 指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。 例如: upstream bakend { server 192.168.0.14 weight=80; server 192.168.0.15 weight=10; } 3、ip_hash 每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。 例如: upstream bakend { ip_hash; server 192.168.0.14:88; server 192.168.0.15:80; } 4、fair(第三方) 按后端服务器的响应时间来分配请求,响应时间短的优先分配。 upstream backend { server server1; server server2; fair; } 5、url_hash(第三方) 按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 例:在upstream中加入hash语句,server语句中不能写入weight等其余的参数,hash_method是使用的hash算法 upstream backend { server squid1:3128; server squid2:3128; hash $request_url; 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;max_fails:10 fail_timeout:10 server 127.0.0.1:7070 backup; } 在须要使用负载均衡的server中增长 proxy_pass http://bakend/; 每一个设备的状态设置为: 1.down表示单前的server暂时不参与负载 2.weight为weight越大,负载的权重就越大。 3.max_fails:容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误 4.fail_timeout:max_fails次失败后,暂停的时间。 5.backup: 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。 nginx支持同时设置多组的负载均衡,用来给不用的server来使用。 client_body_in_file_only设置为On 能够讲client post过来的数据记录到文件中用来作debug client_body_temp_path设置记录文件的目录 能够设置最多3层目录 location对URL进行匹配.能够进行重定向或者进行新的代理 负载均衡 */ ##设定http服务器,利用它的反向代理功能提供负载均衡支持 http { server_tokens off; #并不会让nginx执行的速度更快,但它能够关闭在错误页面中的nginx版本数字,这样对于安全性是有好处的。 sendfile on; #可让sendfile()发挥做用。sendfile()能够在磁盘和TCP socket之间互相拷贝数据(或任意两个文件描述符)。Pre-sendfile是传送数据以前在用户空间申请数据缓冲区。以后用read()将数据从 文件拷贝到这个缓冲区,write()将缓冲区数据写入网络。sendfile()是当即将数据从磁盘读到OS缓存。由于这种拷贝是在内核完成 的,sendfile()要比组合read()和write()以及打开关闭丢弃缓冲更加有效(更多有关于sendfile)。 tcp_nopush on; # 告诉nginx在一个数据包里发送全部头文件,而不一个接一个的发送。 tcp_nodelay on; # 告诉nginx不要缓存数据,而是一段一段的发送--当须要及时发送数据时,就应该给应用设置这个属性,这样发送一小块数据信息时就不能当即获得返回值。 keepalive_timeout 10; #给客户端分配keep-alive连接超时时间。服务器将在这个超时时间事后关闭连接。咱们将它设置低些可让ngnix持续工做的时间更长。 client_header_timeout 10; # 设置请求头和请求体(各自)的超时时间。咱们也能够把这个设置低些。 client_body_timeout 10; reset_timedout_connection on; #告诉nginx关闭不响应的客户端链接。这将会释放那个客户端所占有的内存空间 send_timeout 10; #指定客户端的响应超时时间。这个设置不会用于整个转发器,而是在两次客户端读取操做之间。若是在这段时间内,客户端没有读取任何数据,nginx就会关闭链接。 gzip on; #是告诉nginx采用gzip压缩的形式发送数据。这将会减小咱们发送的数据量。 gzip_disable "msie6"; #为指定的客户端禁用gzip功能。咱们设置成IE6或者更低版本以使咱们的方案可以普遍兼容 # gzip_static on; # 告诉nginx在压缩资源以前,先查找是否有预先gzip处理过的资源。这要求你预先压缩你的文件,从而容许你使用最高压缩比,这样nginx就不用再压缩这些文件了。 gzip_proxied any; #容许或者禁止压缩基于请求和响应的响应流。咱们设置为any,意味着将会压缩全部的请求。 gzip_min_length 1000; #设置对数据启用压缩的最少字节数。若是一个请求小于1000字节,咱们最好不要压缩它,由于压缩这些小的数据会下降处理此请求的全部进程的速度。 gzip_comp_level 4; #设置数据的压缩等级。这个等级能够是1-9之间的任意数值,9是最慢可是压缩比最大的。咱们设置为4,这是一个比较折中的设置。 gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript; #设置须要压缩的数据格式 include mime.types; #设定mime类型,类型由mime.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"'; 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; access_log logs/host.access.404.log log404; #用了log_format指令设置了日志格式以后,须要用access_log指令指定日志文件的存放路径; server_names_hash_bucket_size 128; #保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size老是等于hash表的大小,而且是一路处理器缓存大小的倍数。在减小了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。若是hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的状况下在内存中查找的次数为2。第一次是肯定存储单元的地址,第二次是在存储单元中查找键 值。所以,若是Nginx给出须要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小. client_header_buffer_size 4k; #客户端请求头部的缓冲区大小。这个能够根据你的系统分页大小来设置,通常一个请求的头部大小不会超过1k,不过因为通常系统分页都要大于1k,因此这里设置为分页大小。分页大小能够用命令getconf PAGESIZE取得。 large_client_header_buffers 8 128k; #客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,若是header过大,它会使用large_client_header_buffers来读取。 open_file_cache max=102400 inactive=20s; #这个指令指定缓存是否启用。 client_max_body_size 300m; #设定经过nginx上传文件的大小 sendfile on; #sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。若是用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,下降系统uptime。 tcp_nopush on; #此选项容许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用 proxy_connect_timeout 90; #后端服务器链接的超时时间_发起握手等候响应超时时间 proxy_read_timeout 180; #链接成功后_等候后端服务器响应时间_其实已经进入后端的排队之中等候处理(也能够说是后端服务器处理请求的时间) proxy_send_timeout 180; #后端服务器数据回传时间_就是在规定时间以内后端服务器必须传完全部的数据 proxy_buffer_size 256k; #设置从被代理服务器读取的第一部分应答的缓冲区大小,一般状况下这部分应答中包含一个小的应答头,默认状况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过能够将其设置为更小 proxy_buffers 4 256k; #设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认状况也为分页大小,根据操做系统的不一样多是4k或者8k proxy_busy_buffers_size 256k; proxy_temp_file_write_size 256k; #设置在写入proxy_temp_path时数据的大小,预防一个工做进程在传递文件时阻塞太长 proxy_temp_path /data0/proxy_temp_dir; #proxy_temp_path和proxy_cache_path指定的路径必须在同一分区 proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g; #设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。 keepalive_timeout 120;keepalive超时时间。 tcp_nodelay on; client_body_buffer_size 512k; #若是把它设置为比较大的数值,例如256k,那么,不管使用firefox仍是IE浏览器,来提交任意小于256k的图片,都很正常。若是注释该指令,使用默认的client_body_buffer_size设置,也就是操做系统页面大小的两倍,8k或者16k,问题就出现了。不管使用firefox4.0仍是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误 proxy_intercept_errors on; #表示使nginx阻止HTTP应答代码为400或者更高的应答。 ##配置虚拟机 server { listen 80; #配置监听端口 server_name image.***.com; #配置访问域名 location ~* \.(mp3|exe)$ {对以“mp3或exe”结尾的地址进行负载均衡 proxy_pass http://img_relay$request_uri; #设置被代理服务器的端口或套接字,以及URL proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上 } location /face { if ($http_user_agent ~* "xnp") { rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; } proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; error_page 404 502 = @fetch; } location @fetch { access_log /data/logs/face.log log404; rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; } location /image { if ($http_user_agent ~* "xnp") { rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; } proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; error_page 404 502 = @fetch; } location @fetch { access_log /data/logs/image.log log404; rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; } } #设定Nginx状态访问地址 location /NginxStatus { stub_status on; access_log on; auth_basic "NginxStatus"; #auth_basic_user_file conf/htpasswd; } }

配置文件二:web

net.ipv4.tcp_max_tw_buckets = 6000 #timewait的数量,默认是180000。

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 #web应用中listen函数的backlog默认会给咱们内核参数的net.core.somaxconn限制到128,而Nginx内核参数定义的NGX_LISTEN_BACKLOG默认为511,因此有必要调整这个值。

net.core.netdev_max_backlog = 262144 #每一个网络接口接收数据包的速率比内核处理这些包的速率快时,容许送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。若是超过这个数字,孤儿链接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过度依靠它或者人为地减少这个值,更应该增长这个值(若是增长了内存以后)。

net.ipv4.tcp_max_syn_backlog = 262144 #记录的那些还没有收到客户端确认信息的链接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。

net.ipv4.tcp_timestamps = 0 #时间戳能够避免序列号的卷绕。一个1Gbps的链路确定会遇到之前用过的序列号。时间戳可以让内核接受这种“异常”的数据包。这里须要将其关掉。

net.ipv4.tcp_synack_retries = 1 #为了打开对端的链接,内核须要发送一个SYN并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃链接以前发送SYN+ACK包的数量。

net.ipv4.tcp_syn_retries = 1 #在内核放弃创建链接以前发送SYN包的数量。

net.ipv4.tcp_synack_retries = 1#为了打开对端的链接,内核须要发送一个SYN 并附带一个回应前面一个SYN的ACK。也就是所谓三次握手中的第二次握手。这个设置决定了内核放弃链接以前发送SYN+ACK 包的数量。

net.ipv4.tcp_fin_timeout = 1 #若是套接字由本端要求关闭,这个参数决定了它保持在FIN-WAIT-2状态的时间。对端能够出错并永远不关闭链接,甚至意外当机。缺省值是60秒。2.2 内核的一般值是180秒,你能够按这个设置,但要记住的是,即便你的机器是一个轻载的WEB服务器,也有由于大量的死套接字而内存溢出的风险,FIN- WAIT-2的危险性比FIN-WAIT-1要小,由于它最多只能吃掉1.5K内存,可是它们的生存期长些。

net.ipv4.tcp_keepalive_time = 30 #当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时。

net.core.somaxconn = 262144 #web 应用中listen 函数的backlog 默认会给咱们内核参数的net.core.somaxconn限制到128,而nginx 定义的NGX_LISTEN_BACKLOG 默认为511,因此有必要调整这个值。

net.core.netdev_max_backlog = 262144 #每一个网络接口接收数据包的速率比内核处理这些包的速率快时,容许送到队列的数据包的最大数目。

net.ipv4.tcp_max_orphans = 262144 #系统中最多有多少个TCP套接字不被关联到任何一个用户文件句柄上。若是超过这个数字,孤儿链接将即刻被复位并打印出警告信息。这个限制仅仅是为了防止简单的DoS攻击,不能过度依靠它或者人为地减少这个值,更应该增长这个值(若是增长了内存以后)。

net.ipv4.tcp_max_syn_backlog = 262144 #记录的那些还没有收到客户端确认信息的链接请求的最大值。对于有128M内存的系统而言,缺省值是1024,小内存的系统则是128。
相关文章
相关标签/搜索