Nginx学习笔记
一. 安装nginx
Nginx官方网站是http://sysoev.ru/nginx/英文主页http://nginx.net在这里可以获得nginx的最新版本。Nginx有三个版本:稳定版,开发板,历史稳定版。
1.下载nginx http://nginx.org/en/download.html
安装nginx之前确保系统已经安装了gcc,openssl-devel,pcre-devel,zlib-devel软件库。这几个库一般安装系统时只要选择了开发环境一般都已经安装好了,如果没有安装使用yum安装即可。
2.开始安装nginx
经过编译安装的nginx包含了大部分可用模块,可通过“./configure --help”选项设置各个模块的使用情况,例如对不需要的http_ssi模块可以通过--without-http_ssi_module”方式关闭。如果需要“http_perl”模块,可以通过“--with-http_perl_module”方式进行安装。
[root@open 下载]#tar -zxvf nginx-1.8.0.tar.gz -C /usr/src/
[root@open 下载]#cd /usr/src/nginx-1.8.0/
[root@open nginx-1.8.0]#./configure \
>--with-http_stub_status_module
>--with-http_gzip_static_module
>--prefix=/usr/local/nginx
[root@open nginx-1.8.0]#make
[root@open nginx-1.8.0]#make install
上面configure选项中“--with-http_stub_status_module”可以用来启用nginx的nginxstatus功能,监控nginx的当前状态。
Nginx安装完成
二. Nginx 配置文档
Nginx的配置文件是一个纯文本文件,它一般位于nginx安装目录的conf目录下,这个配置文件是以block的形式组织的。每个block一般以一个大括号“{}”来表示,block可以分为几个层次,整个配置文件中main指令位于最高层,在main层下面可以有events,HTTP等层级,而在HTTP层中又包含有server层,即server block,server block中又可分为location层,并且一个server block中可以包含多个location block。
下图大概说明了这个层次关系:
1. 配置与调试nginx
Nginx安装后,会产生相应的安装目录,根据前面的安装路径,nginx的配置文件路径为/usr/local/nginx/conf其中的nginx.conf这个配置文件为nginx的主配置文件。
Nginx配置文件分为四部分:
Main(全局设置)
Server(主机设置)
Upstream(负载均衡服务器设置)
Location(URL匹配特定位置的设置)
Main部分设置的指令将影响其它所有设置。
Server部分的指令主要用于指定主机和端口。
Upstream指令主要用于负载均衡,设置一系列的后端服务器。
Location部分用于匹配网页位置。
这四者关系:server继承main,location继承server。Upstream既不会继承其他设置也不会被继承。
1) nginx的全局配置
下面这段内容是nginx的全局配置属性:
#user nobody; //nginx worker进程运行用户
worker_processes 1; //nginx开启的进程数
#error_log logs/error.log; //主模块指令,定义全局错误日志文件
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid; //指定进程id的存储文件位置
worker_rlimit_nofile 65535;
events {
use epoll; //指定nginx工作模式
worker_connections 1024; //每个进程最大连接数
}
User主模块指令:指定nginxworker进程运行用户以及用户组,默认由nobody账号运行。
Worker_processes:指定nginx要开启的进程数。每个nginx进程平均耗费10MB-12MB根据经验,一般指定一个进程足够了,如果多核CPU建议指定和CPU的数量一样多的进程即可。
Error_log:用来定义全局错误日志文件,日志输出级别有debug(输出最详细),info(仅次于debug),notice(注意,提示服务器某些应用可能要出问题),warn(警告,需要引起管理员注意),error(错误,服务器某些应用已经出现错误,不能正常工作),crit(估计服务器已经宕机了)。
Pid:用来指定进程和id的存储文件位置
Worker_rlimit_nofile:用于绑定worker进程和CPU,linux内核2.4以上可用。
Events:设定nginx的工作模式及连接数上限。
Use:用来指定nginx的工作模式。Nginx支持的工作模式有select,poll,kqueue,epoll,rtsig和/dev/poll其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在linux平台,而kqueue用在BSD系统中。对于linux系统,epoll工作模式是首选。
Worker_connections:定义nginx每个进程的最大连接数默认是1024,最大客户端连接数由worker_processes和worker_connections决定。即:max_client=worker_processes*worker_connections。作为反向代理时为:max_client=worker_processes*worker_connections/4
进程的最大连接数受linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效。
2) HTTP服务器配置
http {
include mime.types;
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"‘;
access_log logs/access.log main;
sendfile on; //开启高效文件传输模式
tcp_nopush on; //防止网络阻塞
#keepalive_timeout 0;
keepalive_timeout 65; //超时时间,默认为秒
gzip on; //开启zip压缩输出
client_max_body_size 20m; //客户端请求最大大哥文件字节数
client_header_buffer_size 32k;//客户端请求头headerbuffer大小
large_client_header_buffers 432k;
client_header_timeout 10;
client_body_timout 10;
send_timeout 10;
include主模块指令:实现对配置文件所包含的设定,可以减少主配置文件的复杂度,类似于apache的include用法
default_type:属于HTTP核心模块指令,这里设定默认类型为二进制流,也就是当文件类型未定义时使用这种方式,例如在没有配置PHP环境时,nginx是不予解析的此时,用浏览器访问PHP文件就会出现下载窗口。
Log_format:用于指定nginx日志的输出格式。mylog为此日志输出格式的名称.例如:
Log_format mylog ‘$server_name $remote_addr - $remote_user
[$time_local] “$request”’
‘$status $uptream_status $body_bytes_sent
“http_referer”’
‘”$http_user_agent” “$http_x_forwarded_for”’
‘$ssl_protocol $ssl_cipher $upstream_addr
$request_time $upstream_response_time’;
可以在下面的access_log指令中引用。
Access_log logs/nginx_access.log mylog;
$server_name:虚拟主机名称
$remote_addr:远程客户端的IP地址
-:空白,用一个“-”占位符代替,历史原因导致还存在
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登陆百度的用户名test,如果没有登陆就是空白。
[$time_lockal]:访问的时间与时区。
$request:请求的URL和HTTP协议,这是真个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求。
$status:记录请求返回的http状态吗,如成功是200
$body_bytes_sent:发送给客户端的文件主题内容的大小,如899,可以将日志每条记录中这个值累加起来初略估计服务器吞吐量。
$http_referer:记录从哪个页面链接访问过来。
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的ip地址,通过$remote_add拿到的ip地址是反向代理服务器的ip地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的ip地址和原来客户端的请求的服务器地址。
$ssl_protocol:ssl协议版本,如TLSv1
$ssl_cipher:交换数据中的算法。
$upstream_addr:upstream的地址,即真正提供服务器的主机地址。
$request_time:整个请求的总时间
$upstream_response_time:请求过程中upstream的响应时间
Client_max_body_size:用来设置允许客户端请求的最大的单个文件字节数。
Client_header_buffer_size:用来指定客户端请求头的headerbuffer大小。对于大多数请求,1KB的缓冲区大小已经足够,如果自定义了消息头或有更大的cookie,可以增加缓冲区大小。这里设置为32KB。
Large_client_header_buffers:用来指定客户端请求中较大的消息头的缓存最大数量和大小,“4”为个数,“128K”为大小,最大缓存为4个128KB
Sendfile:参数用于开启高效文件传输模式,将tcp_nopush和tcp_nodely两个指令设置为on用于防止网络阻塞。
Keepalive_timeout:用于设置客户端连接保持活动的超时连接。在超过这个时间之后,服务器会关闭该连接。
Client_header_timeout:用于设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,nginx将返回“request time out(408)”错误。
Client_body_timeout:用于设置客户端请求主题读取超时时间,默认值为60.如果超过这个时间,客户端还没有发送任何数据,nginx将发后“request time out(408)”错误。
Send_timeout:用于指定响应客户端的超时时间,这个超时仅限于两个链接活动之间的时间,如果超过这个时间,客户端没有任何活动,nginx将会关闭连接。
3)HTTP gzip模块配置
配置nginx的http gzip模块,这个模块支持在线实时压缩输出数据流,经过良好的配置优化,可以大幅的提升网站的输出效率。要看是否安装此模块,使用如下命令:
[root@open ~]# /usr/local/nginx/sbin/nginx –V
下面是httpgzip模块在nginx配置中相关属性设置:
gzip on; //开启gzip压缩
gzip_min_length 1k; //压缩页面最小字节数
gzip_buffers 4 16k; //申请4个单位16K内存作为压缩结果流缓存
gzip_http_version 1.1; //设置识别http协议版本
gzip_comp_level 2; //指定gzip压缩比
gzip_types text/plain applicatio/x-javascript text/css
application/xml; //指定压缩类型
gzip_vary on;
gzip:用于设置开启或者关闭gzip模块,“gzip on”表示开启gzip压缩,实时压缩输出数据流。
Gzip_min_length:用于设置允许压缩的页面最小字节数,页面字节数从header头的content-length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字计数,小于1K可能会越压越大
Gzip_buffers:表示盛情4个单位为16K的内存作为压缩结果流缓存,默认值是盛情与原始数据大小相同的内存空间来存储gzip压缩结果。
Gzip_http_version:用于设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持gzip解压,使用默认即可。
Gzip_comp_level:用来指定gzip压缩比,1压缩比最小,处理速度最快,9压缩比最大,传输速度最快,但处理最慢,比较消耗CPU资源
Gzip_types:用来指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的。
Gzip_vary:选项可以让前端缓存服务器缓存经过gzip压缩的页面,例如,用squid缓存经过nginx压缩的数据。
3) 负载均衡配置
Upstream是nginx的http upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。在上面的设定中,通过upstream指令指定了一个负载均衡器的名称为my_test。这个名称可以任意指定,在后面需要用到的地方直接调用即可。
Nginx负载模块支持4种调度算法:
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响。
weight:指定轮询权值,weight值越大,分配到的访问几率越高,主要用于后端每个服务器性能不均的情况下。
ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决动态网页存在的session共享问题。但是仅仅能用ip来分配后端,因此ip_hash是有缺陷的:
nginx不是前端的服务器,ip_hash要求nginx一定是最前端的服务器,否则nginx得不到正确ip,就不能根据ip做hash譬如使用的是squid最为前端,那么nginx取ip时只能得到squid服务器ip地址,用这个个地址来做分流肯定是错乱的。
Nginx的后端还有其他方式负载均衡,如果nginx后端又有其它负载均衡,将请求又通过另外的方式分流了,那么某个客户端的请求肯定不能定位到同一台session应用服务器上,这么算起来,nginx后端智能直接指向应用服务器,或者再搭一个squid,然后指向应用服务器,最好的办法是用location做一次分流,将需要session的部分请求通过ip_hash分流,剩下的走其它后端去。
fair:这是比上面两个更加智能的负载均衡算法,此种算法可以依据页面大小和加载时间长短智能的进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的有限分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载nginx的upstream_fair模块。
url_hash:此方法按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装nginx的hash软件包。
在HTTPupstream 模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均很调度中的状态。常用的状态有:
down:表示当前的server暂时不参与负载均衡
backup:预留的备份机器,当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器压力最轻。
max_fails:允许请求失败的次数,默认为1,当超过最大次数时,返回proxy_next_upstream模块定义的错误。
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一期使用。
当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。
4)Server虚拟主机配置
Server{
listen 80; //服务器监听端口
server_name localhost; //服务器IP地址或域名
index index.html index.htm index.php index.jsp;
root /opt/html/ //网页根目录
charset gb2312; //网页默认编码格式
access_log /data/logs/nginx_access.log mylog; //日志存放路径
error_log /data/logs/nginx_error.log; //错误日志存放路径
}
Server标志定义虚拟主机开始,listen用于指定虚拟主机的服务器端口;server_name用来指定ip地址或者域名,多个域名之间用空格分开;index用于设定访问的默认首页地址;root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径;charset用于设置网页的默认编码格式。Access_log用来指定次虚拟主机的访问日志存放路径。最后的,mylog(mylog为http段内设置的日志输出格式,在access_log中引用)用于指定访问日志输出格式。
4) URL匹配设置
URL地址匹配是nginx匹配中最灵活的部分。Location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现nginx对动,静态网页的过滤处理。
以下设置是通过location指令来对网页URL进行分析处理,所有扩展名为.gif .jpg .png .bmp .swf的静态文件都交给nginx处理,而expires用来指定静态文件的过期时间,这里是30天
location ~ .*\. (gif|jpg|jpeg|png|bmp|swf)$ {
root /opt/html/;
expires 30d;
}
下面这段设置是将upload和html下的所有文件都交给nginx来处理,当然,upload和html目录包含在/opt/html/目录中
location ~ ^/(uplocad|html)/ {
root /opt/html/;
expires 30d;
}
location语法规则:
location [=|~|~*|^~|] /uri/ {...}
=:精确匹配,如果这个查询匹配,将停止搜索并立即处理此请求
~:以~开头表示区分大小写匹配的正则表达式
~*:以此为开头表示不区分大小写的正则表达式
^~:如果把这个前缀用于一个常规字符串,那么告诉nginx如果路径匹配那么不测试正则表达式。
示例1:
location / {} //匹配任何查询,因为所有请求都以/开头。但是正则表达式规则将被优先和查询匹配。
示例2:
location =/ {} //仅仅匹配/
示例3:
location ~* .(gif|jpg|jpeg)$ {
Rewrite .(gif|jpg)$ /logo.png;
} //不区分大小写匹配任何以gif,jpg,jpeg结尾的文件。
5) stubstatus模块配置
stubstatus模块能够获取nginx自上次启动以来的工作状态,此模块非核心模块,需要在nginx编译安装时手工指定才能使用。
location /NginxStatus {
stub_status on;
access_log logs/nginxstatus.log;
auth_basic “nginxstatus”;
auth_basic_user_file ../htpasswd;
}
stub_status为“on”表示启用stubstatus的工作状态统计功能;access_log用来指定stubstatus模块的访问日志文件;auth_basic是nginx的一种认证机制;auth_basic_user_file用来指定认证的密码文件,因此需要用apache的htpasswd命令来生成密码文件。例如添加一个webadmin用户:
[root@open ~]# htpasswd -c/usr/local/nginx/conf/htpasswd webadmin
在浏览器中输入:http://ip/nginxstatus输入刚创建的用户名密码登陆
登陆后的页面:
Active connections表示当前活跃的连接数,第三行3个数字表示nginx当前共处理了3个连接,成功建立了3次握手,总共处理了5个请求。最后一行的reading表示nginx读取到客户端header信息数;writing表示nginx返回给客户端的header信息数,waiting表示nginx已经处理完,正在等候下一次请求指令时的驻留连接数。
6) nginx的启动,关闭和平滑重启
nginx自身提供了一些用于日常维护的命令:
检查nginx配置文件的正确性:
/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
上述:“-t”参数用于检查配置文件是否正确,但并不执行。“-c”参数用于指定配置文件路径,如果不指定配置文件路径,nginx默认会在安装时指定的安装目录下查找conf/nginx.conf文件。
检测如下信息说明配置文件正确:
显示nginx的版本以及相关编译信息:
/usr/local/nginx/sbin/nginx -V
显示安装nginx版本信息
/usr/local/nginx/sbin/nginx -v
Nginx的启动,关闭与重启
Nginx对进程的控制能力非常强大,可以通过信号指令控制进程,常用的信号:
QUIT:表示处理完当前请求后,关闭进程。
HUP:表示重新加载配置,也就是关闭原有的进程,并开启新的工作进程。此操作不会中断用户的访问请求,因此可以通过此信号平滑的重启nginx。
USR1:用于nginx的日志切换,也就是重新打开一个日志文件,例如每天要生成一个新的日志文件时,可以使用这个信号来控制。
USR2:用于平滑升级可执行程序。
WINCH:从容关闭工作进程。
Nginx的启动命令:
/usr/local/nginx/sbin/nginx
查看nginx启动进程:
Ps -ef | grep nginx
关闭nginx
Kill -xxx pid //xxx是信号名,pid是进程号
Killall -9 nginx //强制杀死nginx所有进程。慎用。
Nginx平滑重启(不间断的重新启动nginx)
Kill -HUP ‘cat /usr/local/nginx/logs/nginx.pid’
本文出自 “追求探索” 博客,请务必保留此出处http://caesar1990.blog.51cto.com/8821483/1727287
原文地址:http://caesar1990.blog.51cto.com/8821483/1727287