1、安装Nginx
在安装Nginx之前,确保系统已正确安装gcc、openssl-devel、pcre-devel及zlib-devel软件库,Nginx安装过程如下:
wget http://nginx.org/download/nginx-1.0.14.tar.gz //下载文件
tar zxvf nginx-1.0.14.tar.gz //解压压缩文件
./configure --with-http_stub_status_module --prefix=/opt/nginx //配置命令,启用 Nginx 的 NginxStatus 功能,以监控 Nginx 的运行状态。
cd nginx-1.0.14 //进入nginx目录
make //编译源程序
make install //运行程序
2、Nginx配置文件结构
Nginx的配置文件为nginx.conf,位于安装目录的conf目录下。nginx.conf由多个块组成,最外面的是块是main,main包含events和hhtp,http包含upstream和多个server,server又包含多个location。
main块为全局设置,将影响其它所有设置;
upstream块为负载均衡服务设置,设置一系列后端服务器;
server块为主机设置,指定主机和端口;
location块url匹配特定位置设置,用于匹配网页位置。
server继承main,location继承server,upstream既不会继承其他设置也不会被继承。
在这几个块中,每个部分都包含若干指令,这些指令主要包含Nginx的主模块指令、事件模块指令、HTTP核心模块指令,同时每个部分还可以使用其他HTTP模块指令,例如Http SSL模块、HttpGzip Static模块和Http Addition模块等。
3、Nginx配置
3.1、全局配置
user nginx; #指定Nginx Worker进程运行用户以及用户组
worker_processes 2; #指定了Nginx要开启的进程数。每个Nginx进程平均耗费10M~12M内存。建议指定和CPU的数量一致即可
error_log logs/error.log notice; #用来定义全局错误日志文件,日志输出级别有debug、info、notice、warn、error、crit可供选择,其中,debug输出日志最为最详细,而crit输出日志最少
pid logs/nginx.pid; #用来指定进程pid的存储文件位置
worker_rlimit_nofile 65535; #用于绑定worker进程和CPU, Linux内核2.4以上可用
events{ #设定Nginx的工作模式及连接数上限
use epoll; #用来指定Nginx的工作模式。Nginx支持的工作模式有select、poll、kqueue、epoll、rtsig和/dev/poll。其中select和poll都是标准的工作模式,kqueue和epoll是高效的工作模式,不同的是epoll用在Linux平台上,而kqueue用在BSD系统中。对于Linux系统,epoll工作模式是首选
worker_connections 65536; #用于定义Nginx每个进程的最大连接数,默认是1024。最大客户端连接数由worker_processes和worker_connections决定,即Max_client=worker_processes*worker_connections。
在作为反向代理时,max_clients变为:max_clients = worker_processes * worker_connections/4。
进程的最大连接数受Linux系统进程的最大打开文件数限制,在执行操作系统命令“ulimit -n 65536”后worker_connections的设置才能生效
}
3.2、http配置
http{
include conf/mime.types; #文件扩展名与文件类型映射表,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
default_type application/octet-stream; #默认文件类型,这里设定默认类型为二进制流
log_format main '$remote_addr - $remote_user [$time_local] '
'"$request" $status $bytes_sent '
'"$http_referer" "$http_user_agent" '
'"$gzip_ratio"'; #指定Nginx日志的输出格式。main为此日志输出格式的名称
client_max_body_size 20m; #设置允许客户端请求的最大的单个文件字节数
client_header_buffer_size 32K; #指定来自客户端请求头的headerbuffer大小。对于大多数请求,1K的缓冲区大小已经足够,如果自定义了消息头或有更大的Cookie,可以增加缓冲区大小。这里设置为32K
large_client_header_buffers 4 32k; #指定客户端请求中较大的消息头的缓存最大数量和大小, “4”为个数,“128K”为大小,最大缓存量为4个128K
Sendfile on; #用于开启高效文件传输模式。将tcp_nopush和tcp_nodelay两个指令设置为on用于防止网络阻塞
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 60; #置客户端连接保持活动的超时时间。在超过这个时间之后,服务器会关闭该连接
client_header_timeout 10; #设置客户端请求头读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误
client_body_timeout 10; #设置客户端请求主体读取超时时间。如果超过这个时间,客户端还没有发送任何数据,Nginx将返回“Request time out(408)”错误,默认值是60
send_timeout 10; #指定响应客户端的超时时间。这个超时仅限于两个连接活动之间的时间,如果超过这个时间,客户端没有任何活动,Nginx将会关闭连接
3.3、HttpGzip配置
HttpGzip模块支持在线实时压缩输出数据流,在配置之前先用/opt/nginx/sbin/nginx -V命令查看该模块是否安装,具体如下:
[root@xxx ~]# /opt/nginx/sbin/nginx -V
显示如下:
nginx version: nginx/1.0.14
built by gcc 4.4.6 20110731 (Red Hat 4.4.6-3) (GCC)
configure arguments: --with-http_stub_status_module --with-http_gzip_static_module --prefix=/opt/nginx
相关属性如下:
gzip on; #设置开启或者关闭gzip模块
gzip_min_length 1k; #设置允许压缩的页面最小字节数,页面字节数从header头的Content-Length中获取。默认值是0,不管页面多大都进行压缩。建议设置成大于1K的字节数,小于1K可能会越压越大
gzip_buffers 4 16k; #表示申请4个单位为16K的内存作为压缩结果流缓存,默认值是申请与原始数据大小相同的内存空间来存储gzip压缩结果
gzip_http_version 1.1; #设置识别HTTP协议版本,默认是1.1,目前大部分浏览器已经支持GZIP解压,使用默认即可
gzip_comp_level 2; #指定GZIP压缩比,1 压缩比最小,处理速度最快;9 压缩比最大,传输速度快,但处理最慢,也比较消耗cpu资源
gzip_types text/plain application/x-javascript text/css application/xml; #指定压缩的类型,无论是否指定,“text/html”类型总是会被压缩的
gzip_vary on; #可以让前端的缓存服务器缓存经过GZIP压缩的页面,例如用Squid缓存经过Nginx压缩的数据
3.4、负载均衡配置
upstream通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
upstream cszhi.com{ #指定了一个负载均衡器的名称
ip_hash;
server 192.168.8.11:80;
server 192.168.8.12:80 down;
server 192.168.8.13:8009 max_fails=3 fail_timeout=20s;
server 192.168.8.146:8080; #指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态
}
Nginx的负载均衡模块支持4种调度算法,其中后2项属于第三方的调度方法。
轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;
Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;
ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;
url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。
后端服务器在负载均衡调度中的常用状态:
down:表示当前的server暂时不参与负载均衡;
backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;
max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用。
3.5、虚拟主机配置
server{
listen 80; #指定虚拟主机的服务端口
server_name 192.168.8.18 mscims.com; #指定IP地址或者域名,多个域名之间用空格分开
index index.html index.htm index.php; #设定访问的默认首页地址
root /wwwroot/www.cszhi.com #指定虚拟主机的网页根目录
charset gb2312; #设置网页的默认编码格式
access_log logs/www.ixdba.net.access.log main; #指定此虚拟主机的访问日志存放路径,最后的main用于指定访问日志的输出格式
3.6、location匹配配置
URL地址匹配是进行Nginx配置中最灵活的部分。 location支持正则表达式匹配,也支持条件判断匹配,用户可以通过location指令实现Nginx对动、静态网页进行过滤处理。使用location URL匹配配置还可以实现反向代理,用于实现PHP动态解析或者负载负载均衡。
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { #所有扩展名以.gif、.jpg、.jpeg、.png、.bmp、.swf结尾的静态文件都交给nginx处理
root /www.mscims.com;
expires 30d; #静态文件的过期时间30天
}
4、正则匹配
4.1、表达式匹配
1、~ 为区分大小写匹配;
2、~* 为不区分大小写匹配;
3、!~和!~*分别为区分大小写不匹配及不区分大小写不匹配;
4.2、文件及目录匹配
1、-f和!-f用来判断是否存在文件
2、-d和!-d用来判断是否存在目录
3、-e和!-e用来判断是否存在文件或目录
4、-x和!-x用来判断文件是否可执行
4.3、rewrite指令的flag标记
1、last 相当于apache里面的[L]标记,表示rewrite。
2、break本条规则匹配完成后,终止匹配,不再匹配后面的规则。
3、redirect 返回302临时重定向,浏览器地址会显示跳转后的URL地址。
4、permanent 返回301永久重定向,浏览器地址会显示跳转后的URL地址
4.4、Rewrite 规则相关指令
1.break指令
使用环境:server,location,if;
该指令的作用是完成当前的规则集,不再处理rewrite指令。
2.if指令
使用环境:server,location
该指令用于检查一个条件是否符合,如果条件符合,则执行大括号内的语句。If指令不支持嵌套,不支持多个条件&&和||处理。
3.return指令
语法:return code ;
使用环境:server,location,if;
该指令用于结束规则的执行并返回状态码给客户端。
4.rewrite 指令
语法:rewriteregex replacement flag
使用环境:server,location,if
该指令根据表达式来重定向URI,或者修改字符串。指令根据配置文件中的顺序来执行。注意重写表达式只对相对路径有效。如果你想配对主机名,你应该使用if语句。
5.Set指令
语法:setvariable value ; 默认值:none; 使用环境:server,location,if;
该指令用于定义一个变量,并给变量赋值。变量的值可以为文本、变量以及文本变量的联合。
6.Uninitialized_variable_warn指令
语法:uninitialized_variable_warnon|off
使用环境:http,server,location,if
该指令用于开启和关闭未初始化变量的警告信息,默认值为开启。