Nginx实战篇 安装部署与配置全解析.docx
- 文档编号:17976309
- 上传时间:2023-04-24
- 格式:DOCX
- 页数:14
- 大小:21.64KB
Nginx实战篇 安装部署与配置全解析.docx
《Nginx实战篇 安装部署与配置全解析.docx》由会员分享,可在线阅读,更多相关《Nginx实战篇 安装部署与配置全解析.docx(14页珍藏版)》请在冰豆网上搜索。
Nginx实战篇安装部署与配置全解析
Nginx实战篇
安装部署与配置全解析
1写在正文之前
最近质保在计划做Portal的性能测试,考虑到在国家统计局项目前期规划到2000多并发的PV情况下面,静态文件的压力会超过10000。
根据对Nginx的介绍,Nginx的性能和Apache相比,会有100%的提升。
原因:
得益于Nginx使用了最新的epoll(Linux2.6内核)和kqueue(freebsd)网络I/O模型,而Apache则使用的是传统的select模型。
目前Linux下能够承受高并发访问的Squid、Memcached都采用的是epoll网络I/O模型。
所以计划对主流的WebServer进行对比性能测试,特引入Nginx进行配置,在测试环境中现场实战了一次,特将过程记录总结如下。
注:
在真正性能测试结束时,再给出各个WebServer的性能对比结果,欢迎大家持续关注。
2部署步骤
2.1下载介质
NgInx部署之前,首先根据项目的需要选择需要安装的组件,实际环境一般会考虑需要支持gzip压缩和rewrite模块。
所以安装的第一步是下载Ngix及Ngix的相关组件。
●Nginx本身
下载地址:
http:
//nginx.org/en/download.html
建议下载最新版本介质,目前最新的是:
0.9.6
●gzip压缩依赖库:
zlib
下载地址:
我下载的版本是:
Version1.2.5
●Rewrite模块的正则表达式依赖库:
pcre
pcre库简称:
Perl兼容正则表达式(PerlCompatibleRegularExpressions)库。
关于正则表达式的写法可以参考附件《perlre-perldoc_perl_org.mht》
下载地址:
http:
//www.pcre.org/
我下载的版本是:
pcre-8.02
2.2编译部署介质
2.2.1部署zlib库
执行Linux命令解压缩后编译安装:
tar-zxvfzlib-1.2.5.tar.gz
./configure
make
makeinstall
默认安装到/usr/local/lib下即可。
安装完成后可以ls-l/usr/local/lib/libz.so查询是否安装成功,安装成功后,通过ls可以提示文件已经存在。
2.2.2部署pcre库
执行Linux命令解压缩后编译安装:
tar-zxvfpcre-8.02.tar.gz
./configure
make
makeinstall
默认安装到/usr/local/lib下即可,安装完成后可以ls-l/usr/local/lib/libpcre.so查询是否安装成功
2.2.3部署nginx
1.解压缩介质:
tar-zxvfnginx-0.9.6.tar.gz
2.编译./configure--prefix=/opt/nginx--with-poll_module–with-http_stub_status_module
需要关注编译的日志
●checkingforepoll...found代表找到了高效的poll模式
●checkingforPCRElibrary...found代表找到了pcre库
●checkingforzliblibrary...found代表找到了zlib库
●如果后面需要用到状态监控,需要加上-with-http_stub_status_module
3.用make来安装:
make
makeinstall
4.验证nginx是否部署成功
cd/opt/nginx/sbin
./nginx
netstat-ano|grep80|grepnginx,看到nginx在80端口处于监听状态,代表配置成功。
部署的两点注意:
1.在kernel>2.6的情况下面,推荐使用poll模式
2.偷懒的情况,可以创建一个软链接到/usr/sbin下
ln-s/opt/nginx/sbin/nginx/usr/sbin/nginx
2.2.4启动和停止nginx
●启动
cd/opt/nginx/sbin
./nginx
●停止
./nginx-sstop
●重新启动
./nginx–sreload
一点小知识:
查看Web请求的部分信息(推荐用httpwatch某些情况用不了的时候直接Linux命令)
curl--head127.0.0.1:
81
HTTP/1.1200OK
Server:
nginx/0.9.6
Date:
Wed,23Mar201107:
29:
24GMT
Content-Type:
text/html
Content-Length:
151Last-Modified:
Wed,23Mar201106:
11:
44GMT
Connection:
keep-alive
Accept-Ranges:
bytes
2.3配置nginx
nginx配置文件存在安装目录的conf,如/opt/nginx/conf/nginx.conf下。
配置文件修改后,可用nginx-t来进行测试
2.3.1配置gzip压缩
配置Gzip压缩,在nginx.conf配置文件中加入:
gzipon;
gzip_min_length1024;
gzip_buffers48K;
gzip_typestext/plainapplication/x-javascripttext/xmltext/csstext/htmlapplication/xml;
每个命令详解如下:
●zip_min_length
设置允许压缩的页面最小字节数,页面字节数从header头中的Content-Length中进行获取。
默认值是0,不管页面多大都压缩。
建议设置成大于1k的字节数,小于1k可能会越压越大。
●gzip_types
配置需要压缩的请求的Content-Type类型,对符合指定类型的请求启用gzip压缩。
●gzip_buffers
设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。
例如44k代表以4k为单位,按照原始数据大小以4k为单位的4倍申请内存。
48k代表以8k为单位,按照原始数据大小以8k为单位的4倍申请内存。
2.3.2高性能配置
●设置工作的进程数
worker_processes5;
设置后重新启动Nginx,可以查看到后台进程:
[root@test217html]#ps-ef|grepnginx
root319301015:
00?
00:
00:
00nginx:
masterprocessnginx
nobody3193131930015:
00?
00:
00:
00nginx:
workerprocess
nobody3193231930015:
00?
00:
00:
00nginx:
workerprocess
nobody3193331930015:
00?
00:
00:
00nginx:
workerprocess
nobody3193431930015:
00?
00:
00:
00nginx:
workerprocess
nobody3193531930015:
00?
00:
00:
00nginx:
workerprocess
●指定事件响应模式为为高效的poll模式
events{
useepoll;
worker_connections1024;
}
2.3.3配置nginx状态监控
在Nginx.conf配置文件中增加:
location/NginxStatus{
stub_statuson;
}
重新启动Nginx,通过浏览器访问http:
//192.9.100.217/NginxStatus,就可以看到状态监控页面。
状态监控结果详细解读:
⏹Activeconnections:
2
当前nginx正处理的活动连接数
⏹serveracceptshandledrequests3310
总共处理了3次连接,成功创建了3次连接,共请求了10次。
总连接数-成功连接数为失败连接数
⏹Reading:
0Writing:
1Waiting:
1
readingnginx读取到客户端的header信息数
Writingnginx返回给客户端的Header信息数
Waiting开启keep-alive的情况下,这个值等于active-(reading+writing),意思指nginx已经处理完正在等候下一次请求的驻留连接
2.3.4反向代理实现动静结合(NgInx+Tomcat/WebLogic/WebSphere)
1.通过location来区分动静文件;
静态文件,在配置文件中增加:
location/portal{
root/home/trs/wchg/wwwhome/;
}
注意:
这里有个陷阱,就是root的目录是指portal目录的父目录
2.动态文件转发给应用服务器
动态文件通过正则表达式区分,所以需要配置pcre库,在配置文件中增加:
location~^/wcm/.*\.(jsp|do){
proxy_passhttp:
//192.9.100.213:
9080;
}
根据应用的不同可能需要转发的请求也不同,只要在我的这个配置(jsp|do|XXX),后面的XXX类似替换为需要转发的后缀就可以了。
注意:
和Rewrite的不同,匹配到的字符串后面不要再加上$1了。
3.反向代理的高级参数
一般在nginx.conf配置文件中增加:
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
proxy_set_headerX-Real-IP$remote_addr;
proxy_set_headerHost$host;
✓带上客户原始请求IP等请求信息
proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;
保留客户端传递过来的XFF信息;XFF信息记录Http请求的真实的客户端,也就是HTTP的请求端真实的IP,只有在通过了HTTP代理或者负载均衡服务器时才会添加该项;
✓保留客户端请求的真实IP地址,用于某些访问统计
proxy_set_headerX-Real-IP$remote_addr;
✓保留客户端请求的域名信息
proxy_set_headerHost$host;
4.反向代理的优化参数
proxy_connect_timeout30;
nginx跟后端服务器连接超时时间
proxy_send_timeout30;
后端服务器数据回传时间(代理发送超时)
proxy_read_timeout60;
连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size16k;
设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers432k;
proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size64k;
高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size256k;
设定缓存文件夹大小,大于这个值,将从upstream服务器传
当代理下载的文件超过该参数设置的大小时,nginx会先将文件写入临时目录(缺省为nginx安装目下/proxy_temp目录),
注意:
更多优化参数可以参考《HttpProxyModule.mht》
2.3.5配置虚拟主机
很简单,Server节点就是一个虚拟主机
1.复制自带的Server节点
2.在Server节点中的Server_Name改成虚拟主机名就可以了
server{
listen81;
server_name;
}
2.3.6配置静态文件超时时间
在配置文件中增加静态文件的超时时间:
location~/wcm/*\.(jpg|css|html|htm|js|gif|txt){
root/home/trs/wchg/wwwhome/;
expires24h;
}
注意:
location匹配长的优先,匹配长的后就不匹配短的了,所以需要每个location都指定root或alias
expires指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标(起到控制页面缓存的作用)
具体的语法:
expires[time|epoch|max|pff]
默认值:
off
expires指令控制HTTP应答中的“Expires”和“Cache-Control”Header头部信息,启动控制页面缓存的作用
time:
可以使用正数或负数。
“Expires”头标的值将通过当前系统时间加上设定time值来设定。
time值还控制"Cache-Control"的值:
负数表示no-cache
正数或零表示max-age=time
2.3.7配置日志格式与按天轮换
1.指定日志格式
由于nginx日志的默认格式不能被awsats所分析,所以经常需要更改nginx的log日志格式。
具体的做法如下:
a)自定义日志格式:
log_formatwchglog'$remote_addr-$remote_user[$time_local]''"$request"$status$body_bytes_sent''"$http_referer""$http_user_agent"';
b)指定访问日志和错误日志的格式和路径:
(路径必须让nginx提供服务的用户,注意不是启动用户具有写的权限)
access_loglogs/access.logwchglog;error_loglogs/error.log
为提高日志文件读写性能,可以用下面的指令来缓存:
open_log_file_cachemax=1000inactive=20smin_uses=2valid=1m;
2.日志按天切换
方式很多,传统的可以借助ocronolog来做,这里采用logrorate来实现日志按天切换,但是ocronolog因为会附件进程,比较费性能,现在比较好的方式是采用logrotate来实现。
主要有两个好处:
a)操作系统安装的时候会自动安装logrorate。
用Linux命令可以查看是否安装cat/etc/log*;
b)不用Kill和restartnginx,只要重新载入一下就可以了。
具体做法:
参考文件nginx,将文件放到/etc/logratate.d目录下面,文件内容如下:
/opt/nginx/logs/*.log{
rotate99
compress
daily
missingok
notifempty
sharedscripts
postrotate/sbin/servicenginxreload>/dev/null2>/dev/null||true
endscript
}
主要内容的意义如下:
第一行,需要切换的文件
rotate99代表总共用99个文件来记录
compress代表启用压缩
daily代表按天切换日志
2.4其它配置
2.4.1禁止出错时泄露服务器的版本
在脚本中增加:
server_tokensoff;
2.4.2限制客户端POST提交的数据大小
在脚本中增加:
client_max_body_size50m;
client_body_buffer_size256k;
2.4.3静态目录root和alias的区别
指定目录的属性:
alias指定的目录是准确的;root是指定目录的上级目录,并且该上级目录要含有location指定名称的同名目录。
使用alias标签的目录块中不能使用rewrite的break
注意:
一般情况下,在location/中配置root,在location/other中配置alias是一个好习惯。
2.4.44.限制并发数和下载速率
limit_connone1;
limit_rate20k;
2.4.5指定nginx提供服务的用户:
缺省为nobody
#usernobody;
2.4.6指定错误页
error_page500502503504/portal/internal_error.html;
location=/portal/internal.html{
alias/home/trs/wchg/wwwhome/portal;
}
2.5高级配置
2.5.1利用Nginx实现开源负载均衡的分发
1.申明负载均衡有哪几台机器组成
upstreamwchgCluster{
serverlocalhost:
82weight=2;
serverlocalhost:
83weight=3;
}
Weight为权重,代表请求分发的百分比,默认为1。
如上述配置,第一台机器的权重为2/5即将40%的请求分给82端口.
2.定义两个Server
Server1监听在本机的82端口
server{
listen82;
server_namelocalhost;
location/{
proxy_passhttp:
//192.9.100.213:
9080;
}
}
Server2监听在本机的83端口
server{
listen83;
server_namelocalhost;
location/{
proxy_passhttp:
//192.9.100.214:
9080;
}
}
3.配置反向代理,将请求发给集群wchgCluster
location~^/portal/.*\.(jsp|do){
proxy_passhttp:
//wchgCluster;#代理给集群的时候,这里的名字和上面的cluster的名字相同
}
通过测试,我们将server2的转发停止掉,然后刷新浏览器就可以看到一会儿正确,一会儿错误了,统计一下请求数,就可以看到转发的规律,基本上是按照weight的顺序进行轮流转发。
Round-Robin的模式。
2.5.2利用Nginx实现静态文件的权限控制
1.主要参考文章
来自于内网肖锋文章
《优化TRS二进制文件的读写效率,推荐nginx的X-Accel-Redirect访问》
地址:
2.原理补充说明
主要原理:
nginx反向代理得到后端请求发现带有X-Accel-Redirect的header,那么根据这个头记录的路径信息打开磁盘文件
3.具体做法
以控制某静态目录的权限为例
a)将真正要控制静态权限的静态目录,如realpub,禁止直接访问
location/realpub/{
alias/home/trs/wchg/wwwhome/realpub/;
internal;
}
b)增加一个虚的目录,如/pub,在虚的目录中配置rewrite规则
location/pub/{
alias/home/trs/wchg/wwwhome/pub;
rewrite"/aaa/(.*)$"/portal/right_check.jsp?
filename=$1last;
}
c)在应用中放置right_check.jsp,根据filename参数中所携带的信息进行权限验证,然后返回。
JSP中的逻辑可以参考下面的代码
StringsFileName=request.getParameter("filename");
//在这里根据文件名插入业务逻辑
response.reset();
response.setHeader("Content-Type","application/octet-stream");response.setHeader("X-Accel-Redirect","/protectfile/"+sFileName);
补充两点:
●注意:
最好不要将realpub和pub指向同一个目录
●补充:
验证过html、txt和zip文件,完全可行
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Nginx实战篇 安装部署与配置全解析 Nginx 实战 安装 部署 配置 解析