Nginx|Tengine

1、Nginx

1.1 特点

  1. Nginx (“engine x”) 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器
  2. 其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名
  3. 官方测试nginx能够支撑5万并发链接,并且cpu、内存等资源消耗却非常低,运行非常稳定
  4. Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发
  5. 其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:新浪、网易、腾讯等。

1.2 功能

  1. web服务器
  2. web reverse prox
  3. smtp reverse proxy

1.3 Nginx和apache的优缺点

一、nginx相对于apache的优点:

  • 轻量级,同样起web 服务,比apache 占用更少的内存及资源
  • 抗并发,nginx 处理请求是异步非阻塞的,而apache 则是阻塞型的,在高并发下nginx 能保持低资源低消耗高性能
  • 高度模块化的设计,编写模块相对简单
  • 社区活跃,各种高性能模块出品迅速啊

** 二、 apache 相对于nginx 的优点: **

  • rewrite ,比nginx 的rewrite 强大
  • 模块超多,基本想到的都可以找到
  • 少bug ,nginx 的bug 相对较多

**三、Nginx 配置简洁, Apache 复杂 **


四、最核心的区别在于apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程

apache 多进程 fork() o(1) i/o : 阻塞
Nginx|Tengine_第1张图片

切分服务:1,连接成功;23秒内返回

Nginx|Tengine_第2张图片

2、Tengine

  1. Tengine 是nginx的加强版,封装版,淘宝开源
  2. **官网**http://tengine.taobao.org/
  3. 动态模块加载(DSO)支持。加入一个模块不再需要重新编译整个Tengine;
  4. 支持SO_REUSEPORT选项,建连性能提升为官方nginx的三倍;
  5. 支持SPDY v3协议,自动检测同一端口的SPDY请求和HTTP请求;
  6. 流式上传到HTTP后端服务器或FastCGI服务器,大量减少机器的I/O压力;
  7. 更加强大的负载均衡能力,包括一致性hash模块、会话保持模块,还可以对后端的服务器进行主动健康检查,根据服务器状态自动上线下线,以及动态解析upstream中出现的域名;
  8. 输入过滤器机制支持。通过使用这种机制Web应用防火墙的编写更为方便;
  9. 支持设置proxy、memcached、fastcgi、scgi、uwsgi在后端失败时的重试次数
  10. 动态脚本语言Lua支持。扩展功能非常高效简单;
  11. 支持管道(pipe)和syslog(本地和远端)形式的日志以及日志抽样;
  12. 支持按指定关键字(域名,url等)收集Tengine运行状态;
  13. 组合多个CSS、JavaScript文件的访问请求变成一个请求;
  14. 自动去除空白字符和注释从而减小页面的体积
  15. –…….

3、NginxTengine安装之前准备

•1、依赖 gcc openssl-devel pcre-devel zlib-devel

• 安装:yum install gcc openssl-devel pcre-devel zlib-devel

•2、创建用户和用户组。为了方便nginx运行而不影响linux安全

• 创建组:groupadd -r nginx

• 创建用户:useradd -r -g nginx -M nginx

• -M 表示不创建用户的家目录。

•简洁方式:

–./configure \

– --prefix=/usr/tengine 

–make && make install
# 1.安装

–./configure \

– --prefix=/opt/sxt/soft/tengine-2.1.0/ \

– --error-log-path=/var/log/nginx/error.log \

– --http-log-path=/var/log/nginx/access.log \

– --pid-path=/var/run/nginx/nginx.pid \

– --lock-path=/var/lock/nginx.lock \

– --with-http_ssl_module \

– --with-http_flv_module \

– --with-http_stub_status_module \

– --with-http_gzip_static_module \

– --http-client-body-temp-path=/var/tmp/nginx/client/ \

– --http-proxy-temp-path=/var/tmp/nginx/proxy/ \

– --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/ \

– --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi \

– --http-scgi-temp-path=/var/tmp/nginx/scgi \

– --with-pcre 
#2. 安装
–make && make install

–启动和配置路径用默认的,用户和用户组限制,都去掉

–其中/var/tmp/nginx/client/目录需要手动创建

3.添加安装的tengine到注册表,具体内容见附件nginx

Nginx|Tengine_第3张图片

•注意修改路径,而且必须是在**/etc/init.d、下面touch或者vi来新建**

不能用xftp传进去,否则文件不被识别

Nginx|Tengine_第4张图片

•1、修改nginx文件的执行权限

• chmod +x nginx

•2、添加该文件到系统服务中去

• chkconfig --add nginx

• 查看是否添加成功

• chkconfig --list nginx

•

•启动,停止,重新装载

•service nginx start|stop|reload

4 Nginx****配置解析

4.1 event下的一些配置及其意义

  • #单个后台worker process进程的最大并发链接数

  • worker_connections 1024;

  • 并发总数是 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的值须小于系统可以打开的最大文件数

  • 而系统可以打开的最大文件数和内存大小成正比,一般1GB内存的机器上可以打开的文件数大约是10万左右

  • 我们来看看360M内存的VPS可以打开的文件句柄数是多少:

  • $ cat /proc/sys/fs/file-max

  • 输出 34336

  • 32000 < 34336,即并发连接总数小于系统可以打开的文件句柄总数,这样就在操作系统可以承受的范围之内

  • 所以,worker_connections 的值需根据 worker_processes 进程数目和系统可以打开的最大文件总数进行适当地进行设置

  • 使得并发总数小于操作系统可以打开的最大文件数目

– # 其实质也就是根据主机的物理CPU和内存进行配置

– # 当然,理论上的并发总数可能会和实际有所偏差,因为主机还有其他的工作进程需要消耗系统资源。

– # ulimit -SHn 65535

4.2 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;

4.3 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; #长连接超时时间,单位是秒

4.4 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连接数的时候需要使用

4.4 虚拟主机一些配置及其意义

#虚拟主机的配置
 server
 {
 \#监听端口
 listen 80;
 \#域名可以有多个,用空格隔开
 server_name 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;
 }

5 什么是虚拟主机

虚拟主机是一种特殊的软硬件技术,它可以将网络上的每一台计算机分成多个虚拟主机,每个虚拟主机可以独立对外提供www服务,这样就可以实现一台主机对外提供多个web服务,每个虚拟主机之间是独立的,互不影响的

Nginx|Tengine_第5张图片

5.1 通过nginx可以实现虚拟主机的配置,nginx支持三种类型的虚拟主机配置

–1、基于ip的虚拟主机, (一块主机绑定多个ip地址)

–2、基于域名的虚拟主机(servername)

–3、基于端口的虚拟主机(listen如果不写ip端口模式)

–示例基于虚拟机ip的配置,这里需要配置多个ip

–server

–{

–  listen 192.168.20.20:80;

–  server_name www.linuxidc.com;

–  root /data/www;}

–server

–{

–  listen 192.168.20.21:80;

–  server_name www.linuxidc.com;

–  root /data/www;}

nginx.conf下的配置

–http{

–server{#表示一个虚拟主机}}

5.2 location 映射(ngx_http_core_module)

Nginx|Tengine_第6张图片

•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配置规则

•Directives with the = prefix that match the query exactly. If found, searching stops.

•All remaining directives with conventional strings, longest match first. If this match used the ^~ prefix, searching stops.

•Regular expressions, in order of definition in the configuration file.

•If #3 yielded a match, that result is used. Else the match from #2 is used.=前缀的指令严格匹配这个查询。如果找到,停止搜索。

•所有剩下的常规字符串,最长的匹配。如果这个匹配使用^〜前缀,搜索停止。

•正则表达式,在配置文件中定义的顺序。

•如果第3条规则产生匹配的话,结果被使用。否则,如同从第2条规则被使用
•location配置规则

•location 的执行逻辑跟 location 的编辑顺序无关。
 矫正:这句话不全对,“普通 location ”的匹配规则是“最大前缀”,因此“普通 location ”的确与 location 编辑顺序无关;

•

•但是“正则 location ”的匹配规则是“顺序匹配,且只要匹配到第一个就停止后面的匹配”;

•“普通location ”与“正则 location ”之间的匹配顺序是?先匹配普通 location ,再“考虑”匹配正则 location 。

•注意这里的“考虑”是“可能”的意思,也就是说匹配完“普通 location ”后,有的时候需要继续匹配“正则 location ”,有的时候则不需要继续匹配“正则 location ”。两种情况下,不需要继续匹配正则 location :

–( 1 )当普通 location 前面指定了“ ^~ ”,特别告诉 Nginx 本条普通 location 一旦匹配上,则不需要继续正则匹配;

–( 2 )当普通location 恰好严格匹配上,不是最大前缀匹配,则不再继续匹配正则

–

–loghaha.html

–l: logha

–l: ^~ loghah

–l: loghaha.html

–l: =loghaha.html

–l:  ^logh.*html$

–l:  ^logha.*html$

Nginx|Tengine_第7张图片

5.4 用户认证访问


–模块ngx_http_auth_basic_module 允许使用“HTTP基本认证”协议验证用户名和密码来限制对资源的访问。

– location / {

– auth_basic      "closed site";

– auth_basic_user_file /var/users;}

–Apache发行包中的htpasswd命令来创建user_file 文件

–

–要通过yum –y install httpd

–htpasswd -c -m /var/users username

–**注:需要安装****httpd****才可以使用上面命令**

6 反向代理

什么是反向代理?

  • 通常的代理服务器,只用于代理内部网络对Internet的连接请求,客户机必须指定代理服务器,并将本来要直接发送到Web服务器上的http请求发送到代理服务器中由代理服务器向Internet上的web服务器发起请求,最终达到客户机上网的目的。
  • 反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器

Nginx|Tengine_第8张图片

6.1 经典的反向代理

Nginx|Tengine_第9张图片

•反向代理:
•proxy_pass
 location /baidu {
     proxy_pass http://192.168.9.12【/】; //nginx收到客户端的uri是否传递到上游,由是否在上游域名后有uri设定,没有uri的情况下:传递
 }
 
# 反向代理配置nginx.conf:

upstream 名字 {

 server IP:PORT;

 server IP:PORT;

}

server {
 location / {
	 proxy_pass http://名字;
	}
}

7. 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/

– -d:后台启动服务

– -m:缓存大小

– -p:端口

– -l:IP

– -P:服务器启动后的系统进程ID,存储的文件

– -u:服务器启动是以哪个用户名作为管理用户

如果源配置了也可以用

 yum –y install memcached
•配置session共享如下:

–3、拷贝jar到tomcat的lib下,jar包见附件

–4、配置tomcat,每个tomcat里面的context.xml中加入

•<Manager className="de.javakaffee.web.msm.MemcachedBackupSessionManager" 

• memcachedNodes="n1:192.168.9.11:11211" 

•  sticky="false" 

•  lockingMode="auto"

•  sessionBackupAsync="false"

• requestUriIgnorePattern=".*\.(ico|png|gif|jpg|css|js)$"

•  sessionBackupTimeout="1000" transcoderFactoryClass="de.javakaffee.web.msm.serializer.kryo.KryoTranscoderFactory" 

•/>
•tengine新增会话保持功能:

– 在upstream 里面增加一行配置:

–  upstream laoxiao {

–    session_sticky cookie=uid fallback=on mode=insert option=indi  rect;

–    server node2:8009 weight=5;

–    server node3:8009 weight=5;}

–  

–  location ~ \.jsp$ {

–       session_sticky_hide_cookie upstream=laoxiao;#对后端服务器隐藏增加的cookie

–       proxy_pass ajp://laoxiao;}

8 Tengine 会话保持

**ngx_http_upstream_session_sticky_module**

  • 该模块是一个负载均衡模块,通过cookie实现客户端与后端服务器的会话保持, 在一定条件下可以保证同一个客户端访问的都是同一个后端服务器。

mode设置cookie的模式:

  • insert: 在回复中本模块通过Set-Cookie头直接插入相应名称的cookie。
  • prefix: 不会生成新的cookie,但会在响应的cookie值前面加上特定的前缀,当浏览器带着这个有特定标识的cookie再次请求时,模块在传给后端服务前先删除加入的前缀,后端服务拿到的还是原来的cookie值,这些动作对后端透明。如:“Cookie: NAME=SRV~VALUE”。
  • rewrite: 使用服务端标识覆盖后端设置的用于session sticky的cookie。如果后端服务在响应头中没有设置该cookie,则认为该请求不需要进行session sticky,使用这种模式,后端服务可以控制哪些请求需要sesstion sticky,哪些请求不需要。

8.1 会话保持模块配置

#insert + indirect模式:

– upstream test { 

–session_sticky cookie=uid domain=www.xxx.com fallback=on path=/ mode=insert option=indirect; 

–server 127.0.0.1:8080;} 

–Server

– {

– location / {#在insert + indirect模式或者prefix模式下需要配置session_sticky_hide_cookie #这种模式不会将保持会话使用的cookie传给后端服务,让保持会话的cookie对后端透明 

–session_sticky_hide_cookie upstream=test;

– proxy_pass [http://test](http://test/);}}

8.2 Tengine 额外功能

•配置在tomcat日志中获取真实的客户端ip

– 在nginx配置文件中加: proxy_set_header Y-Real-IP $remote_addr;

– 在tomcat的conf/server.xml配置文件中修改

–  <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"

–        prefix="localhost_access_log." suffix=".txt"

–        pattern="%{Y-Real-IP}i %l %u %t "%r" %s %b" />

– 

•注意 上面的Y-Real-IP配置和server.xml里面的配置要求一样才行

你可能感兴趣的:(网络通信)