Nginx ("engine x") 是一款高性能的,轻量级的HTTP Web 服务器 和 反向代理服务器及电子邮件 IMAP/POP3/SMTP 代理服务器。php
Nginx 是由俄罗斯的程序设计师 Igor Sysoev 所开发,为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过四年多时间了,Igor 将源代码以类BSD许可证的形式发布。自Nginx 发布四年来,Nginx 已经因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名了。Nginx 超越Apache的高性能和稳定性,使得国内使用 Nginx 做为 Web 服务器的网站也愈来愈多。目前国内各大门户网站已经部署了Nginx,如新浪、网易、腾讯等;新近发现 Nginx 技术在国内日趋火热,愈来愈多的网站开始应用部署Nginx。css
(1)Nginx 能够在大多数 Unix like OS 上编译运行,并有 Windows 移植版。 Nginx 的1.2.6稳定版已经于2012年12月11日发布,[1]1.3.10开发版已经于2012年12月25日发布,若是新建站点,建议使用最新稳定版做为生产版本,已有站点升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。html
(2)Nginx 是一个很强大的高性能Web和反向代理服务器,它具备不少很是优越的特性:
在高链接并发的状况下,Nginx是Apache服务器不错的替代品:Nginx在美国是作虚拟主机生意的老板们常常选择的软件平台之一。可以支持高达 50,000 个并发链接数的响应,感谢Nginx为咱们选择了 epoll and kqueue做为开发模型。linux
(3)Nginx做为负载均衡服务器:Nginx 既能够在内部直接支持 Rails 和 PHP 程序对外进行服务,也能够支持做为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不管是系统资源开销仍是CPU使用效率都比 Perlbal 要好不少。做为邮件代理服务器:Nginx 同时也是一个很是优秀的邮件代理服务器(最先开发这个产品的目的之一也是做为邮件代理服务器),Last. fm 描述了成功而且美妙的使用经验。nginx
(4)Nginx 是一个安装很是的简单,配置文件很是简洁(还可以支持perl语法),Bugs很是少的服务器:Nginx 启动特别容易,而且几乎能够作到7*24不间断运行,即便运行数个月也不须要从新启动。你还可以不间断服务的状况下进行软件版本的升级。web
第一步:从 http://nginx.org/download/ 上下载相应的版本
直接在Linux上用命令下载正则表达式
wget http://nginx.org/download/nginx-1.5.9.tar.gz
若是你下载的包是tar.gz 或者.tar包,直接使用tar命令解压文件。算法
tar -zxvf nginx-1.5.9.tar.gz
在命令行下进入解压好的nginx源码文件夹中,在该文件夹中存在可执行的configure文件,该执行程序是配置Nginx的安装参数,好比安装路径等。后端
Nginx的安装参数有如下几种:浏览器
–prefix=<path> – Nginx安装路径。若是没有指定,默认为 /usr/local/nginx。
–sbin-path=<path> – Nginx可执行文件安装路径。只能安装时指定,若是没有指定,默认为<prefix>/sbin/nginx。
–conf-path=<path> – 在没有给定-c选项下默认的nginx.conf的路径。若是没有指定,默认为<prefix>/conf/nginx.conf。
–pid-path=<path> – 在nginx.conf中没有指定pid指令的状况下,默认的nginx.pid的路径。若是没有指定,默认为 <prefix>/logs/nginx.pid。
–lock-path=<path> – nginx.lock文件的路径。
–error-log-path=<path> – 在nginx.conf中没有指定error_log指令的状况下,默认的错误日志的路径。若是没有指定,默认为 <prefix>/logs/error.log。
–http-log-path=<path> – 在nginx.conf中没有指定access_log指令的状况下,默认的访问日志的路径。若是没有指定,默认为 <prefix>/logs/access.log。
–user=<user> – 在nginx.conf中没有指定user指令的状况下,默认的nginx使用的用户。若是没有指定,默认为 nobody。
–group=<group> – 在nginx.conf中没有指定user指令的状况下,默认的nginx使用的组。若是没有指定,默认为 nobody。
–builddir=DIR – 指定编译的目录
–with-rtsig_module – 启用 rtsig 模块
–with-select_module –without-select_module – 容许或不容许开启SELECT模式.
–with-http_ssl_module – 开启HTTP SSL模块,使NGINX能够支持HTTPS请求。这个模块须要已经安装了OPENSSL,在DEBIAN上是libssl
–with-http_realip_module – 启用 ngx_http_realip_module
–with-http_addition_module – 启用 ngx_http_addition_module
–with-http_sub_module – 启用 ngx_http_sub_module
–with-http_dav_module – 启用 ngx_http_dav_module
–with-http_flv_module – 启用 ngx_http_flv_module
–with-http_stub_status_module – 启用 “server status” 页
–without-http_charset_module – 禁用 ngx_http_charset_module
–without-http_gzip_module – 禁用 ngx_http_gzip_module. 若是启用,须要 zlib 。
–without-http_ssi_module – 禁用 ngx_http_ssi_module
–without-http_userid_module – 禁用 ngx_http_userid_module
–without-http_access_module – 禁用 ngx_http_access_module
–without-http_auth_basic_module – 禁用 ngx_http_auth_basic_module
–without-http_autoindex_module – 禁用 ngx_http_autoindex_module
–without-http_geo_module – 禁用 ngx_http_geo_module
–without-http_map_module – 禁用 ngx_http_map_module
–without-http_referer_module – 禁用 ngx_http_referer_module
–without-http_rewrite_module – 禁用 ngx_http_rewrite_module. 若是启用须要 PCRE 。
–without-http_proxy_module – 禁用 ngx_http_proxy_module
–without-http_fastcgi_module – 禁用 ngx_http_fastcgi_module
–without-http_memcached_module – 禁用 ngx_http_memcached_module
–without-http_limit_zone_module – 禁用 ngx_http_limit_zone_module
–without-http_empty_gif_module – 禁用 ngx_http_empty_gif_module
–without-http_browser_module – 禁用 ngx_http_browser_module
–without-http_upstream_ip_hash_module – 禁用 ngx_http_upstream_ip_hash_module
–with-http_perl_module – 启用 ngx_http_perl_module
–with-perl_modules_path=PATH – 指定 perl 模块的路径
–with-perl=PATH – 指定 perl 执行文件的路径
–http-log-path=PATH – Set path to the http access log
–http-client-body-temp-path=PATH – Set path to the http client request body temporary files
–http-proxy-temp-path=PATH – Set path to the http proxy temporary files
–http-fastcgi-temp-path=PATH – Set path to the http fastcgi temporary files
–without-http – 禁用 HTTP server
–with-mail – 启用 IMAP4/POP3/SMTP 代理模块
–with-mail_ssl_module – 启用 ngx_mail_ssl_module
–with-cc=PATH – 指定 C 编译器的路径
–with-cpp=PATH – 指定 C 预处理器的路径
–with-cpu-opt=CPU – 为特定的 CPU 编译,有效的值包括:pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64
–without-pcre – 禁止 PCRE 库的使用。同时也会禁止 HTTP rewrite 模块。在 “location” 配置指令中的正则表达式也须要 PCRE 。
–with-pcre=DIR – 指定 PCRE 库的源代码的路径。
–with-pcre-opt=OPTIONS – Set additional options for PCRE building.
–with-md5=DIR – Set path to md5 library sources.
–with-md5-opt=OPTIONS – Set additional options for md5 building.
–with-md5-asm – Use md5 assembler sources.
–with-sha1=DIR – Set path to sha1 library sources.
–with-sha1-opt=OPTIONS – Set additional options for sha1 building.
–with-sha1-asm – Use sha1 assembler sources.
–with-zlib=DIR – Set path to zlib library sources.
–with-zlib-opt=OPTIONS – Set additional options for zlib building.
–with-zlib-asm=CPU – Use zlib assembler sources optimized for specified CPU, valid values are: pentium, pentiumpro
–with-openssl=DIR – Set path to OpenSSL library sources
–with-openssl-opt=OPTIONS – Set additional options for OpenSSL building
–with-debug – 启用调试日志
–add-module=PATH – Add in a third-party module found in directory PATH
一般状况下,咱们只须要默认设置便可。 执行设置编译参数,并设置安装路径为/usr/local/nginx
./configure –prefix=/usr/local/nginx
在Linux命令行下,切换到nginx的源码包目录中(即刚刚解压的路径)
执行make命令
make的过程是把各类语言写的源码文件,变成可执行文件和各类库文件
./make
第四步中执行make命令完成,若没有出错,则能够执行安装命令。
make install是把这些编译出来的可执行文件和库文件复制到合适的地方
./make install
在配置信息的时候,也就是在第三步,可能会出现一些错误:
错误为:./configure: error: the HTTP rewrite module requires the PCRE library.
这个错误是因为Nginx的rewrite模块依赖于PCRE功能,若是须要启用rewrite功能,须要首先安装PCRE库。(rewrite是Nginx中很重要的模块,因此咱们须要安装PCRE)
安装完成PCRE库以后,执行make和make install,软件顺利安装。
下载pcre
pcre主页位置为:http://www.pcre.org/
选择适当的方式下载pcre安装包
wget http://sourceforge.net/projects/pcre/files/pcre/7.8/pcre-7.8.tar.bz2/download
解压缩
进入到下载文件所在目录中,执行解压缩命令
tar xjpf pcre-7.8.tar.bz2
编译安装
当前目录切换到pcre解压后的目录中
执行设置安装命令:
./configure --prefix=/usr/local/pcre-7.8 --libdir=/usr/local/lib/pcre --includedir=/usr/local/include/pcre
编译
make
编译安装
make install
程序的启动方式是/usr/local/nginx/sbin/nginx
此时打开浏览器,输入服务器地址看到以下画面即为安装成功。
Nginx的配置文件为存放在根目录的conf文件夹中的nginx.conf
默认安装完Nginx后,服务器会自带一个nginx默认配置,用户若须要实现本身的功能,须要修改配置文件来实现。
一般状况下,咱们不直接在主配置文件中添加nginx配置信息,而是分不一样的站点,配置不一样的配置文件,而后引入到主文件中。
在nginx的配置文件conf目录下建立一个专门存仿配置文件的目录,命名为vhosts,能够把虚拟目录的配置所有放在这里。在里面建立名为websuitA.conf的配置文件。在主文件中的引入配置文件的作法在http{***}中引入以下代码:
include /usr/local/nginx/conf/vhosts/*.conf;
websuitA.conf文件写法以下:
server {
listen 80;#监听的端口号
server_name websuitA.com;#域名
location / {
root X:/wnmp/www/websuitA; #站点的路径
#若是用户是用IE访问,则跳转到/nginx-ie/下
if ($http_user_agent ~ MSIE) {
rewrite ^(.*)$ /nginx-ie/$1 break;
}
}
#错误页的配置
error_page 404 /error.html;
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
一般来讲 一个nginx服务器可能会配置多个站点信息,好比:
a1.newegg.com => 192.168.1.1
a2.newegg.com => 192.168.1.2
a3.newegg.com => 192.168.1.3
此时,能够经过多个server_name以及proxy配置来实现:
server {
listen 80;
server_name a1.newegg.com; #访问的站点URL地址
location / {
proxy_store off; #反向代理缓存
proxy_redirect off; #不展现给客户真实域名
proxy_pass http://192.168.1.1; #须要反向代理的服务器地址
proxy_set_header Host $host; #设置host为请求的主机名称
proxy_set_header X-real-ip $remote_addr; #用户请求的IP地址
}
}
server {
listen 80;
server_name a2.newegg.com;
location / {
proxy_store off;
proxy_redirect off;
proxy_pass http://192.168.1.2;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
}
}
server {
listen 80;
server_name a3.newegg.com;
location / {
proxy_store off;
proxy_redirect off;
proxy_pass http://192.168.1.3;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
}
}
a1.nginx.com=>192.168.1.1、192.1.168.1.2、192.168.1.3:8080
配置以下:
server {
listen 80;
server_name a1.newegg.com; #访问的站点URL地址
location / {
proxy_store off; #反向代理缓存
proxy_redirect off; #不展现给客户真实域名
proxy_pass http://a1; #须要反向代理的服务器地址
proxy_set_header Host $host; #设置host为请求的主机名称
proxy_set_header X-real-ip $remote_addr; #用户请求的IP地址
}
}
upstream a1{
server 192.168.1.1;
server 192.168.1.2;
server 192.168.1.3:8080;
}
www.newegg.com/a1/ => 192.168.1.1
www.newegg.com/a2/ => 192.168.1.2
示例:
server {
listen 80;
server_name www.newegg.com; #访问的站点URL地址
location /a1/ {
proxy_store off; #反向代理缓存
proxy_redirect off; #不展现给客户真实域名
proxy_pass http://192.168.1.1; #须要反向代理的服务器地址
proxy_set_header Host $host; #设置host为请求的主机名称
proxy_set_header X-real-ip $remote_addr; #用户请求的IP地址
}
location /a2/ {
proxy_store off; #反向代理缓存
proxy_redirect off; #不展现给客户真实域名
proxy_pass http://192.168.1.2; #须要反向代理的服务器地址
proxy_set_header Host $host; #设置host为请求的主机名称
proxy_set_header X-real-ip $remote_addr; #用户请求的IP地址
}
}
www.newegg.com/test.jpg => image1.newegg.com/test.jpg
server {
listen 80;
server_name www.newegg.com;
location ~* \.jpg$ {
proxy_store off;
proxy_redirect off;
proxy_pass http://images;
proxy_set_header Host $host;
proxy_set_header X-real-ip $remote_addr;
}
}
upstream a1{
server image1.newegg.com;
server image2.newegg.com;
server image3.newegg.com;
}
upstream
nginx的upstream目前支持5种方式的分配
1、轮询(默认)
每一个请求按时间顺序逐一分配到不一样的后端服务器,若是后端服务器down掉,能自动剔除。
2、weight
指定轮询概率,weight和访问比率成正比,用于后端服务器性能不均的状况。
例如:
upstream a1 {
server 192.168.1.1 weight=10;
server 192.168.1.2 weight=10;
}
3、ip_hash
每一个请求按访问ip的hash结果分配,这样每一个访客固定访问一个后端服务器,能够解决session的问题。
例如:
upstream a1 {
ip_hash;
server 192.168.1.1;
server 192.168.1.2;
}
4、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream a1 {
server server1;
server server2;
fair;
}
5、url_hash(第三方)
按访问url的hash结果来分配请求,使每一个url定向到同一个后端服务器,后端服务器为缓存时比较有效。
例:在upstream中加入hash语句,server语句中不能写入weight等其余的参数,hash_method是使用的hash算法
upstream a1 {
server squid1:3128;
server squid2:3128;
hash $request_uri;
hash_method crc32;
}
示例:
upstream a1{
#定义负载均衡设备的Ip及设备状态
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在须要使用负载均衡的server中增长
proxy_pass http://a1;
每一个设备的状态设置为:
1.down 表示单前的server暂时不参与负载
2.weight 默认为1.weight越大,负载的权重就越大。
3.max_fails :容许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream 模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间.
5.backup: 其它全部的非backup机器down或者忙的时候,请求backup机器。因此这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
client_body_in_file_only 设置为On 能够讲client post过来的数据记录到文件中用来作debug
client_body_temp_path 设置记录文件的目录 能够设置最多3层目录
location 对URL进行匹配.能够进行重定向或者进行新的代理 负载均衡
要用nginx作负载均衡的话,首先要在配置文件里面定义一组用来负载均衡的后端服务器(backend servers),例如:
upstream a1 {
server 192.168.1.1;
server 192.168.1.2;
server 192.168.1.3;
}
那个server指令的语法是 server name [parameters],这里的name是服务器名,能够是域名、ip或者unix socket,也能够指定端口,例如:
server 192.168.1.1:8080;
server指令可用的参数有:
weight —— 设置服务器的权重,默认值是1,权重值越大那么该服务器被访问到的概率就越大,例如 server 192.168.1.11 weight=5;
max_fails和fail_timeout —— 这俩是关联的,若是某台服务器在fail_timeout时间内出现了max_fails次链接失败,那么nginx就会认为那个服务器已经挂掉,从而在fail_timeout时间内再也不去查询它,fail_timeout的默认值是10s,max_fails的默认值是1(这意味着一发生错误就认为服务器挂掉),若是把max_fails设为0则表示把这个检查取消。
down —— 表示该服务器已经停用,例如server 192.168.1.11 down;
backup —— 表示该服务器是备用服务器,只有其它后端服务器都挂了或者很忙才会访问到。
举个例子:server 192.168.1.11 max_fails=3 fail_timeout=30s; 这表示,若是服务器192.168.1.11在30秒内出现了3次错误,那么就认为这个服务器工做不正常,从而在接下来的30秒内nginx再也不去访问这个服务器。
Location
语法规则: location [=|~|~*|^~] /uri/ { … }
开头表示精确匹配
^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径便可。nginx不对url作编码,所以请求为/static/20%/aa,能够被规则^~ /static/ /aa匹配到(注意是空格)。
~ 开头表示区分大小写的正则匹配
~* 开头表示不区分大小写的正则匹配
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
/ 通用匹配,任何请求都会匹配到。
多个location配置的状况下匹配顺序为(参考资料而来,还未实际验证,试试就知道了,没必要拘泥,仅供参考):
首先匹配 =,其次匹配^~, 其次是按文件中顺序的正则匹配,最后是交给 / 通用匹配。当有匹配成功时候,中止匹配,按当前匹配规则处理请求。
例子,有以下匹配规则:
location = / {
#规则A
}
location = /login {
#规则B
}
location ^~ /static/ {
#规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
#规则D
}
location ~* \.png$ {
#规则E
}
location !~ \.xhtml$ {
#规则F
}
location !~* \.xhtml$ {
#规则G
}
location / {
#规则H
}
那么产生的效果以下:
访问根目录/, 好比 http://localhost/ 将匹配规则A
访问 http://localhost/login 将匹配规则B
访问 http://localhost/register 则匹配规则H
访问 http://localhost/static/a.html 将匹配规则C
访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,可是规则D顺序优先,规则E不起做用
而 http://localhost/static/c.png 则优先匹配到规则C
访问 http://localhost/a.PNG 则匹配规则E,而不会匹配规则D,由于规则E不区分大小写。
访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.XHTML 不会匹配规则G,由于不区分大小写。规则F,规则G属于排除法,符合匹配规则可是不会匹配到,因此想一想看实际应用中哪里会用到。 http://localhost/a.XHTML不会匹配规则G,由于不区分大小写。规则F,规则G属于排除法,符合匹配规则可是不会匹配到,因此想一想看实际应用中哪里会用到。
访问 http://localhost/category/id/1111 则最终匹配到规则H,由于以上规则都不匹配,这个时候应该是nginx转发请求给后端应用服务器,好比FastCGI(php),tomcat(jsp),nginx做为方向代理服务器存在。
因此实际使用中,我的以为至少有三个匹配规则定义,以下:
location = / {
proxy_pass http://tomcat:8080/index
}
location ^~ /static/ {
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
root /webroot/res/;
}
location / {
proxy_pass http://tomcat:8080/
}
防盗链
location ~* \.(gif|jpg|swf)$ {
valid_referers none blocked start.igrow.cn sta.igrow.cn;
if ($invalid_referer) {
rewrite ^/ http://$host/logo.png;
}
}
根据文件类型设置过时时间
location ~* \.(js|css|jpg|jpeg|gif|png|swf)$ {
if (-f $request_filename) {
expires 1h;
break;
}
}
禁止访问某个目录
location ~* \.(txt|doc)${
root /data/www/wwwroot/linuxtone/test;
deny all;
}
ReWrite
last – 基本上都用这个Flag。
break – 停止Rewirte,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301
1、下面是能够用来判断的表达式:
-f和!-f用来判断是否存在文件
-d和!-d用来判断是否存在目录
-e和!-e用来判断是否存在文件或目录
-x和!-x用来判断文件是否可执行
2、下面是能够用做判断的全局变量
例:http://localhost:88/test1/test2/test.php
$host:localhost
$server_port:88
$request_uri:http://localhost:88/test1/test2/test.php
$document_uri:/test1/test2/test.php
$document_root:D:\nginx/html
$request_filename:D:\nginx/html/test1/test2/test.php
一些可用的全局变量:
Ø $args
Ø $content_length
Ø $content_type
Ø $document_root
Ø $document_uri
Ø $host
Ø $http_user_agent
Ø $http_cookie
Ø $limit_rate
Ø $request_body_file
Ø $request_method
Ø $remote_addr
Ø $remote_port
Ø $remote_user
Ø $request_filename
Ø $request_uri
Ø $query_string
Ø $scheme
Ø $server_protocol
Ø $server_addr
Ø $server_name
Ø $server_port
Ø $uri
Redirect
server {
listen 80;
server_name start.igrow.cn;
index index.html index.php;
root html;
if ($http_host !~ “^star\.igrow\.cn$" {
rewrite ^(.*) http://star.igrow.cn$1 redirect;
}
}