njinx

njinx

njinx 概论 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。 功能: web服务器 web reverse proxy smtp reverse proxy Nginx和apache的优缺点 1、nginx相对于apache的优点:轻量级,同样起web 服务,比apache 占用更少的内存及资源抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能高度模块化的设计,编写模块相对简单社区活跃,各种高性能模块出品迅速啊2.apache 相对于nginx 的优点:rewrite ,比nginx 的rewrite 强大模块超多,基本想到的都可以找到少bug ,nginx 的bug 相对较多3、Nginx 配置简洁, Apache 复杂4、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程 /usr/nginx/conf/nginx.conf,文件中的参数的意义和用法: nginx.conf配置文件#定义Nginx运行的用户和用户组user www www; #nginx进程数,建议设置为等于CPU总核心数。worker_processes 8; #全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]error_log /var/log/nginx/error.log info; #进程文件pid /var/run/nginx.pid; #一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。worker_rlimit_nofile 65535; events{#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。use epoll;#单个进程最大连接数(最大连接数=连接数*进程数)worker_connections 65535;} http下的一些配置及其意义#设定http服务器http{include mime.types; #文件扩展名与文件类型映射表default_type application/octet-stream; #默认文件类型#charset utf-8; #默认编码server_names_hash_bucket_size 128; #服务器名字的hash表大小client_header_buffer_size 32k; #上传文件大小限制large_client_header_buffers 4 64k; #设定请求缓client_max_body_size 8m; #设定请求缓sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。tcp_nopush on; #防止网络阻塞tcp_nodelay on; #防止网络阻塞keepalive_timeout 120; #长连接超时时间,单位是秒 gzip的一些配置及其意义#gzip模块设置 gzip on; #开启gzip压缩输出 gzip_min_length 1k; #最小压缩文件大小 gzip_buffers 4 16k; #压缩缓冲区 gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0) gzip_comp_level 2; #压缩等级 gzip_types text/plain application/x-javascript text/css application/xml; #压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。 gzip_vary on; #limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用 虚拟主机的配置 server { #监听端口 listen 80; #域名可以有多个,用空格隔开 server_name http://www.ha97.com ha97.com; index index.html index.htm index.jsp; root /data/www/ha97; location ~ .*.(php|php5)?$ { fastcgi_pass 127.0.0.1:9000; fastcgi_index index.jsp; include fastcgi.conf; } nginx.conf下的配置http{server{​#表示一个虚拟主机}} location 映射(ngx_http_core_module)​location [ = | ~ | ~ | ^~ ] uri { ... }​location URI {}:​对当前路径及子路径下的所有对象都生效;​location = URI {}: 注意URL最好为具体路径。​精确匹配指定的路径,不包括子路径,因此,只对当前资源生效;​location ~ URI {}:​location ~ URI {}:​模式匹配URI,此处的URI可使用正则表达式,~区分字符大小写,~不区分字符大小写;​location ^~ URI {}:​不使用正则表达式​优先级:= > ^~ > ~|~ >/|/dir/ /loghaha.html/logheihei.html^/log.*html$ location配置规则location 的执行逻辑跟 location 的编辑顺序无关。 矫正:这句话不全对,“普通 location ”的匹配规则是“最大前缀”,因此“普通 location ”的确与 location 编辑顺序无关; 但是“正则 location ”的匹配规则是“顺序匹配,且只要匹配到第一个就停止后面的匹配”;“普通location ”与“正则 location ”之间的匹配顺序是?先匹配普通 location ,再“考虑”匹配正则 location 。注意这里的“考虑”是“可能”的意思,也就是说匹配完“普通 location ”后,有的时候需要继续匹配“正则 location ”,有的时候则不需要继续匹配“正则 location ”。两种情况下,不需要继续匹配正则 location :( 1 )当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;( 2 )当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则 loghaha.htmll:loghal:^~ loghahl:loghaha.htmll:=loghaha.htmll: ^logh.html$l: ^logha.html$ location配置规则 nginx收到请求头:判定ip,port,hosts决定server nginx location匹配:用客户端的uri匹配location的uri 先普通 顺序无关 最大前缀 匹配规则简单 打断: ^~ 完全匹配 再正则 不完全匹配 正则特殊性:一条URI可以和多条location匹配上 有顺序的 先匹配,先应用,即时退出匹配 请求头 host:决策server负责处理 uri:决策location 反向代理:proxy_passip:port[uri]; IP访问控制 location{ ​denyIP /IP段 ​deny192.168.1.109; ​allow 192.168.1.0/24;192.168.0.0/16;192.0.0.0/8 ​ } 规则:按照顺序依次检测,直到匹配到第一条规则 nginx访问状态监控 location /basic_status { ​stub_status on; } 什么是反向代理? 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的。 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器 反向代理: proxy_passlocation /baidu { ​proxy_pass http://192.168.9.12【/】;//nginx收到客户端的uri是否传递到上游,由是否在上游域名后有uri设定,没有uri的情况下:传递} 反向代理配置nginx.conf: upstream名字 { serverIP:PORT; serverIP:PORT; } server { location/{ ​ proxy_pass http://名字; } } event下的一些配置及其意义# 单个后台worker process进程的最大并发链接数​worker_connections1024; 单个后台worker process进程的最大并发链接数 ​worker_connections1024; # 并发总数是 worker_processes 和 worker_connections 的乘积# 即 max_clients = worker_processes * worker_connections# 在设置了反向代理的情况下,max_clients = worker_processes * worker_connections / 4为什么# 为什么上面反向代理要除以4,应该说是一个经验值# 根据以上条件,正常情况下的Nginx Server可以应付的最大连接数为:4 * 8000 = 32000# worker_connections 值的设置跟物理内存大小有关# 因为并发受IO约束,max_clients的值须小于系统可以打开的最大文件数 Nginx的session一致性问题 http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。 那么,在一些场合,确实需要服务器记住当前用户怎么办?比如用户登录邮箱后,接下来要收邮件、写邮件,总不能每次操作都让用户输入用户名和密码吧,为了解决这个问题,session的方案就被提了出来,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术 session的常见实现形式是会话cookie(session cookie),即未设置过期时间的cookie,这个cookie的默认生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。实现机制是当用户发起一个请求的时候,服务器会检查该请求中是否包含sessionid,如果未包含,则系统会创造一个名为JSESSIONID的输出 cookie返回给浏览器(只放入内存,并不存在硬盘中),并将其以HashTable的形式写到服务器的内存里面;当已经包含sessionid是,服务端会检查找到与该session相匹配的信息,如果存在则直接使用该sessionid,若不存在则重新生成新的 session。这里需要注意的是session始终是有服务端创建的,并非浏览器自己生成的。 但是浏览器的cookie被禁止后session就需要用get方法的URL重写的机制或使用POST方法提交隐藏表单的形式来实现Session共享 首先我们应该明白,为什么要实现共享,如果你的网站是存放在一个机器上,那么是不存在这个问题的,因为会话数据就在这台机器,但是如果你使用了负载均衡把请求分发到不同的机器呢?这个时候会话id在客户端是没有问题的,但是如果用户的两次请求到了两台不同的机器,而它的session数据可能存在其中一台机器,这个时候就会出现取不到session数据的情况,于是session的共享就成了一个问题Session一致性解决方案 ​ 1、session复制 ​ tomcat 本身带有复制session的功能。(不讲) ​ 2、共享session ​ 需要专门管理session的软件, ​ memcached 缓存服务,可以和tomcat整合,帮助tomcat共享管理session。安装memcached 1、安装libevent 2、安装memcached 3、启动memcached ​ memcached -d -m 128m -p 11211 -l 192.168.9.11 -u root -P /tmp/(这里的ip改成uginx主机的ip) ​ -d:后台启动服务 ​ -m:缓存大小 ​ -p:端口 ​ -l:IP ​ -P:服务器启动后的系统进程ID,存储的文件 ​ -u:服务器启动是以哪个用户名作为管理用户 如果源配置了也可以用 ​ yum –y install memcached3、拷贝jar到tomcat的lib下,jar包见附件 4、配置tomcat,每个tomcat里面的context.xml中加入(这里的ip改成uginx主机的ip)