室内nginx技术交流
简介:
Nginx(发音同 engine x)是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,在中国使用nginx网站用户有:新浪、网易、 腾讯等。
特点:
•1、高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。
•2、内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。
•3、配置文件非常简单:配置文件非常简洁风格跟程序一样通俗易懂, (还能够支持perl语法)。
•4、成本低廉:Nginx为开源软件,可以免费使用。而购买F5 BIG-IP、NetScaler等硬件负载均衡交换机则需要十多万至几十万人民币。
•5、支持Rewrite重写规则:能够根据域名、URL的不同,将 HTTP 请求分到不同的后端服务器群组。
•6、内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。
•7、节省带宽:支持 GZIP 压缩,可以添加浏览器本地缓存的 Header 头。
•8、稳定性高:用于反向代理,宕机的概率微乎其微。 ,Bugs非常少的服务器,Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不 间断服务的情况下进行软件版本的 升级。
安装:
•Nginx在版本0.7.69 开始支持windows版本。
在window下面安装很简单,下面已目前最新版本安装(nginx-1.5.6 )举例说明:
在nginx官网下载nginx-1.5.6.zip安装包
解压到指定目录(如 d:/nginx-1.5.6) 即可使用。
进入到解压后的目录nginx-1.5.6
启动: nginx.exe
停止: nginx -s stop
重启: nginx -s reload
•进入到安装包目录,执行以下语句
tar -zxvf nginx-1.5.6.tar.gz
•然后解压后目录输入
cd nginx-1.5.6
•接着开始编译源代码
./configure --user=wap7 --group=wap --prefix=/home/wap7/nginx1.5.6/ --with-openssl=/usr/local/openssl --without-http_proxy_module --without-http_rewrite_module --with-pcre=/usr/local/pcre-8.10
• ./configure 有很多可选项,这里就几种常用的选项做一些说明
•--user=<user> - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的用户。如果没有指定,默认为 nobody。
•--group=<group> - 在nginx.conf中没有指定user指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。
•--prefix=<path> - Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。
•--sbin-path=<path> - Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx。
•--without-http_rewrite_module --with-pcre=/usr/local/pcre-8.10
启用rewrite模块 需要用到pcre库
•--with-openssl=/usr/local/openssl --without-http_proxy_module
启用ssl连接 需要用到openssl库
•make && make install
安装完成 !
•到安装目录的sbin目录下
启动:./nginx
停止:./nginx –s stop
重启: ./nginx –s reload
配置:
•#启动进程,通常设置成和cpu的数量相等
worker_processes 4;
•#全局错误日志及PID文件
error_log logs/error.log;
pid conf/nginx.pid;
•#工作模式及连接数上限
events {
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024;#单个后台worker process进程的最大并发链接数
}
http节点配置
•#设置http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/log/nginx/access.log;
• #sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
• #连接超时时间
keepalive_timeout 65;
#开启gzip压缩
gzip on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
• #设置请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
• #设置负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}
server配置
• server {
#侦听80端口
listen 80;
#定义使用wapmail.10086.cn访问
server_name w;
• #设定本虚拟主机的访问日志
access_log logs/ wapmail.10086.cn.access.log main;
• #默认请求
location / {
proxy_pass http://wap_login_server; #对应一个upstream配置
client_max_body_size 100m; #客户端最大请求报文数据,超过这个值将拒绝请求
proxy_set_header x-forward-for $remote_addr; #透传用户IP到后端服务器
proxy_set_header Host $host;
proxy_pass_header Set-Cookie; #透传cookie到后端服务器
}
• # 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}
upstream配置
upstream 是nginx负载均衡的主要模块
•#设置负载均衡的服务器列表
upstream wap_login_server {
server 172.16.200.55:9000;
server 172.16.200.56:9000;
}
默认是轮询负载策略,nginx提供四种负载策略
1、轮询:(默认,weight 指定权重)
2、ip_hash: 根据请求IP地址hash结果分配后台服务
3、fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配
4、url_hash:按访问url的hash结果来分配请求
location配置
upstream 是nginx负载均衡的主要模块
•#设置负载均衡的服务器列表
upstream wap_login_server {
server 172.16.200.55:9000;
server 172.16.200.56:9000;
}
默认是轮询负载策略,nginx提供四种负载策略
1、轮询:(默认,weight 指定权重)
2、ip_hash: 根据请求IP地址hash结果分配后台服务
3、fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配
4、url_hash:按访问url的hash结果来分配请求
rewrite配置
•Rewrite语法
rewrite regex replacement flag
•其中flag标记有四种格式:
last – 终止当前rewirte,继续匹配
break – 中止rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
•
• Rewrite可以放在server, location 和 if 模块中。
•Rewrite主要的功能就是实现URL的重写,nginx的rewrite规则采用PCRE Perl兼容正则表达式的语法进行规则匹配,如果您需要nginx的rewrite功能,在编译nginx之前,需要编译安装PCRE库。
•location /wp12/ {
rewrite "^/wp12/(.*)$" /wp/$1 break;
proxy_pass http://wap_rm_wp_server;
……省略
}
将请求 /wp12/xxx.htm URL重写成 /wp/xxx.htm
nginx管理
•默认配置:log_format main ‘$host $remote_addr - $remote_user [$time_local] $request ‘ ‘“$status” $body_bytes_sent “$http_referer” ‘ ‘“$http_user_agent” “$http_x_forwarded_for”’;
•我们使用nginx作为反向代理,代理后端部署的实际服务地址可能不止一个。我们要了解后端服务器的响应情况,就需要在log_format中增加几个变量。
•下面列出几个重要的变量:
•$status $upstream_status : 响应的状态码(响应正常还是出错了?)
•$request_time $upstream_response_time : 关注性能必备!看看前台传输文件的时间,以及后台处理的时间。前者对了解网络状态有益,后者对了解服务性能有益。
•$remote_addr $upstream_addr : 用户的IP地址,后端服务的IP地址
•$bytes_sent $body_bytes_sent : 发送给用户端的数据量(包含HTTP头和不包含HTTP头)
•$host $request : 最重要的,搞定具体域名具体URL,不抓瞎。
•根据实际情况,把以上的变量组合放进log_format中。
平滑重启
如果改变了Nginx的配置文件(nginx.conf),想重启Nginx,可以发送系统信号给Nginx主进程的方式来进行。这样进程在处理完当前请求后,使用新的进程处理新的请求,然后关闭旧的进程。不过,在重启之前,要确认Nginx配置文件的语法是正确的,可通过如下命令测试配置文件是否正确:
•/nginx_home/sbin/nginx -t -c /nginx_home/conf/nginx.conf
•如果配置文件不正确,屏幕会提示配置文件的第几行出错: nginx:[emerg] invalid number of arguments in "autoindex" directive in /nginx_home/conf/nginx.conf:29
nginx:configuration file /nginx_home/conf/nginx.conf test failed
•如果配置文件正确,屏幕将提示以下两行信息:
the configuration file /nginx_homeconf/nginx.conf syntax is ok
configuration file /nginx_home/conf/nginx.conf test is successful
•这时候,就可以平滑重启了:
•对于Nginx 0.8.x之前的版本 kill -HUP `cat /usr/local/nginx/logs/nginx.pid`
对于Nginx 0.8.x之后的版本 /nginx_home/sbin/nginx -s reload
平滑升级
1、 备份旧版本的nginx可执行文件,复制新版本的nginx这行文件
mv /opt/nginx/sbin/nginx /opt/nginx/sbin/nginx.old
cp objects/nginx /opt/nginx/sbin/nginx
2、 测试新版本nginx是否正常
/opt/nginx/sbin/nginx –t –c /opt/nginx/conf/nginx.conf
3、 平滑升级nginx
kill –USR2 `cat /nginx_home/logs/nginx.pid`
4、 旧版本Nginx的pid变为oldbin,这是旧版本和新版本的nginx同时运行,过一段时间等就nginx处理完用户请求后,执行下面操作
5、 从容关闭旧版本的Nginx进程
kill –WINCH `cat /nginx_home/logs/nginx.oldbin`
6、 决定是否升级到新版的nginx
kill –HUP `cat /nginx_home/logs/nginx.oldbin` ##nginx在不重载配置文件启动工作进程
kill –QUIT `cat /nginx_home/logs/nginx.oldbin` ##关闭旧版nginx
7、验证nginx是否升级成功
/nginx_home/sbin/nginx –V ###显示类似以下信息则升级成功
nginx version: nginx/1.2.9
nginx实例