本文系统:Centos6.5_x64
三台主机:nginx主机,hostname: master.lansgg.com IP: 192.168.10.128
apache主机,hostname: client1.lansgg.com IP: 192.168.10.129
一、nginx 地址重定向
二、nginx 反向代理
1、地址重定向:是指当使用者浏览某个网址时,将他导向到另一个网址的技术。常用在把一串很长的网址,转成较短的网址。因为当要传播某网站时,常常因为网址太长,不好记忆;又有可能因为换了网路的免费网页空间,网址又必须要变更,不知情的使用者还以为网站关闭了。这时就可以用网路上的转址了。这个技术使一个网页是可借由不同的统一资源定位符(URL)连结。
1.1、这 个模块允许使用正则表达式重写URI(需PCRE库),并且可以根据相关变量重定向和选择不同的配置。如果这个指令在server字段中指定,那么将在被 请求的location确定之前执行,如果在指令执行后所选择的location中有其他的重写规则,那么它们也被执行。如果在location中执行这 个指令产生了新的URI,那么location又一次确定了新的URI。这样的循环可以最多执行10次,超过以后nginx将返回500错误
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<code>正则表达式匹配,其中:</code>
<code>* ~ 为区分大小写匹配</code>
<code>* ~* 为不区分大小写匹配</code>
<code>* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配</code>
<code>文件及目录匹配,其中:</code>
<code>* -f和!-f用来判断是否存在文件</code>
<code>* -d和!-d用来判断是否存在目录</code>
<code>* -e和!-e用来判断是否存在文件或目录</code>
<code>* -x和!-x用来判断文件是否可执行</code>
<code>flag标记有:</code>
<code>* last 相当于Apache里的[L]标记,表示完成rewrite</code>
<code>* </code><code>break</code> <code>终止匹配, 不再匹配后面的规则</code>
<code>* redirect 返回302临时重定向 地址栏会显示跳转后的地址</code>
<code>* permanent 返回301永久重定向 地址栏会显示跳转后的地址</code>
<code>一些可用的全局变量有,可以用做条件判断</code>
<code>$args, 请求中的参数;</code>
<code>$content_length, HTTP请求信息里的</code><code>"Content-Length"</code><code>;</code>
<code>$content_type, 请求信息里的</code><code>"Content-Type"</code><code>;</code>
<code>$document_root, 针对当前请求的根路径设置值;</code>
<code>$document_uri, 与$uri相同;</code>
<code>$host, 请求信息中的</code><code>"Host"</code><code>,如果请求中没有Host行,则等于设置的服务器名;</code>
<code>$limit_rate, 对连接速率的限制;</code>
<code>$request_method, 请求的方法,比如</code><code>"GET"</code><code>、</code><code>"POST"</code><code>等;</code>
<code>$remote_addr, 客户端地址;</code>
<code>$remote_port, 客户端端口号;</code>
<code>$remote_user, 客户端用户名,认证用;</code>
<code>$request_filename, 当前请求的文件路径名</code>
<code>$request_body_file</code>
<code>$request_uri, 请求的URI,带查询字符串;</code>
<code>$query_string, 与$args相同;</code>
<code>$scheme, 所用的协议,比如http或者是https,比如rewrite ^(.+)$ $scheme:</code><code>//example</code><code>.com$1 redirect;</code>
<code>$server_protocol, 请求的协议版本,</code><code>"HTTP/1.0"</code><code>或</code><code>"HTTP/1.1"</code><code>;</code>
<code>$server_addr, 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);</code>
<code>$server_name, 请求到达的服务器名;</code>
<code>$server_port, 请求到达的服务器端口号;</code>
<code>$uri, 请求的URI,可能和最初的值有不同,比如经过重定向之类的。</code>
rewrite 指令:可以使用在 server, location, if 区域;
语法:rewrite regex replacement flag
按照相关的正则表达式与字符串修改URI,指令按照在配置文件中出现的顺序执行。
可以在重写指令后面添加标记。
如果替换的字符串以http://开头,请求将被重定向,并且不再执行多余的rewrite指令。
尾部的标记(flag)可以是以下的值:
last - 完成重写指令,之后搜索相应的URI或location。
break - 完成重写指令。
redirect - 返回302临时重定向,如果替换字段用http://开头则被使用。
permanent - 返回301永久重定向。
<code>rewrite ^(</code><code>/download/</code><code>.*)</code><code>/media/</code><code>(.*)\..*$ $1</code><code>/mp3/</code><code>$2.mp3 last;</code>
<code>rewrite ^(</code><code>/download/</code><code>.*)</code><code>/audio/</code><code>(.*)\..*$ $1</code><code>/mp3/</code><code>$2.ra last;</code>
<code>return</code> <code>403;</code>
但是如果我们将其放入一个名为/download/的location中,则需要将last标记改为break,否则nginx将执行10次循环并返回500错误。
<code>location </code><code>/download/</code> <code>{</code>
<code> </code><code>rewrite ^(</code><code>/download/</code><code>.*)</code><code>/media/</code><code>(.*)\..*$ $1</code><code>/mp3/</code><code>$2.mp3 </code><code>break</code><code>;</code>
<code> </code><code>rewrite ^(</code><code>/download/</code><code>.*)</code><code>/audio/</code><code>(.*)\..*$ $1</code><code>/mp3/</code><code>$2.ra </code><code>break</code><code>;</code>
<code> </code><code>return</code> <code>403;</code>
<code>}</code>
如果替换字段中包含参数,那么其余的请求参数将附加到后面,为了防止附加,可以在最后一个字符后面跟一个问号:
<code>rewrite ^</code><code>/users/</code><code>(.*)$ </code><code>/show</code><code>?user=$1? last;</code>
注意:大括号({和}),可以同时用在正则表达式和配置块中,为了防止冲突,正则表达式使用大括号需要用双引号(或者单引号)。例如要重写以下的URL:
<code>/photos/123456</code>
为:
<code>/path/to/photos/12/1234/123456</code><code>.png</code>
则使用以下正则表达式(注意引号):
<code>rewrite </code><code>"/photos/([0-9] {2})([0-9] {2})([0-9] {2})"</code> <code>/path/to/photos/</code><code>$1/$1$2/$1$2$3.png;</code>
<code>server {</code>
<code> </code><code>server_name www.example.com;</code>
<code> </code><code>rewrite ^ http:</code><code>//example</code><code>.com$request_uri? permanent;</code>
同样,重写只对路径进行操作,而不是参数,如果要重写一个带参数的URL,可以使用以下代替:
<code>if</code> <code>($args ^~ post=100){</code>
<code> </code><code>rewrite ^ http:</code><code>//example</code><code>.com</code><code>/new-address</code><code>.html? permanent;</code>
<code> </code><code>server {</code>
<code> </code><code>listen 80 default_server;</code>
<code> </code><code>server_name www.lansgg.com lansgg.com;</code>
<code> </code><code>access_log logs</code><code>/lansgg</code><code>.access.log main;</code>
<code> </code><code>error_log logs</code><code>/lansgg</code><code>.error.log;</code>
<code> </code><code>root </code><code>/opt/nginx/nginx/html/lansgg</code><code>;</code>
<code> </code><code>index index.html;</code>
<code> </code><code>rewrite ^/ http:</code><code>//www</code><code>.Aries.com/;</code>
<code> </code><code>}</code>
break 指令 可使用server, location, if 区域; 中止Rewirte,不在继续匹配
last 指令 可server, location, if 区域;
last与break的区别在于,last并不会停止对下面location的匹配。
测验一下break与last的区别
<code> </code><code>listen 80 default_server;</code>
<code> </code><code>server_name www.lansgg.com lansgg.com;</code>
<code> </code><code>access_log logs</code><code>/lansgg</code><code>.access.log main;</code>
<code> </code><code>error_log logs</code><code>/lansgg</code><code>.error.log;</code>
<code> </code><code>root </code><code>/opt/nginx/nginx/html/lansgg</code><code>;</code>
<code> </code><code>index index.html;</code>
<code> </code><code>location </code><code>/c1</code><code>.html {</code>
<code> </code><code>rewrite </code><code>/c1</code><code>.html </code><code>/c2</code><code>.html </code><code>break</code><code>;</code>
<code> </code><code>}</code>
<code> </code><code>location </code><code>/c2</code><code>.html {</code>
<code> </code><code>return</code> <code>508;</code>
<code>[root@master sbin]</code><code># echo "c1" > /opt/nginx/nginx/html/lansgg/c1.html</code>
<code>[root@master sbin]</code><code># echo "c2" > /opt/nginx/nginx/html/lansgg/c2.html</code>
使用last的话,会继续搜索下面是否有符合条件(符合重写后的/c2.html请求)的location。此时,/c2.html刚好与面location的条件对应上了,进入花括号{}里面的代码执行,这里会返回508。
<code> </code><code>rewrite </code><code>/c1</code><code>.html </code><code>/c2</code><code>.html last;</code>
使用firebug 可以看到;
<a href="http://s3.51cto.com/wyfs02/M01/4D/F9/wKiom1ReJ_bR_WwhAACvgot1dVM022.jpg" target="_blank"></a>
if 指令 可使用server, location 区域;
示例:当访问http://www.lansgg.com网址的时候跳转到www.Aries.com;
<code> </code><code>if</code> <code>($http_host = www.lansgg.com){</code>
<code> </code><code>rewrite (.*) http:</code><code>//www</code><code>.Aries.com;</code>
<a href="http://s3.51cto.com/wyfs02/M02/4D/F8/wKioL1ReMavwbbrPAAEAO-or-Mg289.jpg" target="_blank"></a>
return 指令 可使用server, location, if 区域
语法:return code
这个指令结束执行配置语句并为客户端返回状态代码,可以使用下列的值:204,400,402-406,408,410, 411, 413, 416与500-504。此外,非标准代码444将关闭连接并且不发送任何的头部。
rewrite_log 指令 可使用server, location, if 区域
启用时将在error log中记录notice 标记的重写日志。
set 指令 可使用server, location, if 区域
语法:set variable value
指令设置一个变量并为其赋值,其值可以是文本,变量和它们的组合。
你可以使用set定义一个新的变量,但是不能使用set设置$http_xxx头部变量的值。
语法:uninitialized_variable_warn on|off
默认值:uninitialized_variable_warn on
开启或关闭在未初始化变量中记录警告日志。
事实上,rewrite指令在配置文件加载时已经编译到内部代码中,在解释器产生请求时使用。
expires 指令 可 http, server, location 区域
语法: expires [time|epoch|max|off]
默认值: expires off
该指令可以控制HTTP应答中的“Expires”和“Cache-Control”的头标,(起到控制页面缓存的作用)。可以在time值中使用正数或负数。“Expires”头标的值将通过当前系统时间加上设定的 time 值来获得。
epoch 指定“Expires”的值为 1 January, 1970, 00:00:01 GMT。
max 指定“Expires”的值为 31 December 2037 23:59:59 GMT,“Cache-Control”的值为10年。
-1 指定“Expires”的值为 服务器当前时间 -1s,即永远过期
“Cache-Control”头标的值由指定的时间来决定:
负数:Cache-Control: no-cache
正数或零:Cache-Control: max-age = #, # 为指定时间的秒数s。其他的单位有d(天),h(小时)
"off" 表示不修改“Expires”和“Cache-Control”的值
控制图片等过期时间为30天,这个时间可以设置的更长。具体视情况而定
<code>location ~ \.(gif|jpg|jpeg|png|bmp|ico)$ {</code>
<code> </code><code>log_not_found off; </code><code>#不记录404 not found 错误日志 expires 30d;</code>
<code> </code><code>break</code><code>; }</code>
控制匹配/resource/或者/mediatorModule/里所有的文件缓存设置到最长时间
<code> </code><code>location ~ /(resource|mediatorModule)/ {</code>
<code> </code><code>root </code><code>/opt/demo</code><code>;</code>
<code> </code><code>expires max;</code>
设定某个文件的过期时间;这里为600秒,并不记录访问日志
<code>location ^~ </code><code>/html/scripts/loadhead_1</code><code>.js {</code>
<code>access_log off;</code>
<code>root </code><code>/opt/lampp/htdocs/web</code><code>;</code>
<code>expires 600;</code>
<code>break</code><code>;</code>
设置GZIP
一般情况下压缩后的html、css、js、php、jhtml等文件,大小能降至原来的25%,也就是说,原本一个100k的html,压缩后只剩下25k。这无疑能节省很多带宽,也能降低服务器的负载。
在nginx中配置gzip比较简单
一般情况下只要在nginx.conf的http段中加入下面几行配置即可
<code> </code><code>gzip</code> <code>on;</code>
<code> </code><code>gzip_min_length 1000;</code>
<code> </code><code>gzip_buffers 48k;</code>
<code> </code><code>gzip_types text</code><code>/plain</code> <code>application</code><code>/x-javascript</code> <code>text</code><code>/css</code> <code>text</code><code>/html</code> <code>application</code><code>/xml</code><code>;</code>
可以通过网页gzip检测工具来检测网页是否启用了gzip
编辑nginx.conf
<code> </code><code>rewrite ^</code><code>/c/</code><code>(.*)$ http:</code><code>//www</code><code>.lansgg.com</code><code>/cc/</code><code>$1;</code>
<code> </code>
<code>[root@master lansgg]</code><code># tree</code>
<code>.</code>
<code>├── c</code>
<code>│ └── index.html</code>
<code>├── cc</code>
<code>├── index.html</code>
<code>└── it.jpg</code>
<code>2 directories, 4 files</code>
<a href="http://s3.51cto.com/wyfs02/M02/4D/F9/wKioL1RePF6hWtH5AAFKE7zHvzw477.jpg" target="_blank"></a>
302即为临时重定向;
永久重定向(隐含重定向)
<code> </code><code>rewrite ^</code><code>/c/</code><code>(.*)$ </code><code>/cc/</code><code>$1;</code>
2、反向代理:是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
2.1、配置nginx实现反向代理;
需求:访问http://192.168.10.128/other 返回 apache主机的other目录下的Index.html
<a href="http://s3.51cto.com/wyfs02/M02/4D/F6/wKioL1Rd21mwBFavAAIkMKYLkDs383.jpg" target="_blank"></a>
涉及nginx指令:
2.2、配置nginx配置文件nginx.conf
<code> </code><code>location / {</code>
<code> </code><code>location </code><code>/other</code> <code>{</code>
<code> </code><code>proxy_pass http:</code><code>//192</code><code>.168.10.129</code><code>/other</code><code>;</code>
<code> </code><code>proxy_set_header X-Real-IP $remote_addr; </code>
2.3、配置client1
<code>mkdir</code> <code>/var/www/html/other</code>
<code>echo</code> <code>"192.168.10.129"</code> <code>> </code><code>/var/www/html/other/index</code><code>.html</code>
2.4、测试;
<a href="http://s3.51cto.com/wyfs02/M01/4D/F7/wKiom1Rd6hKzwCh2AAB13d4xNOk488.jpg" target="_blank"></a>
查看日志:
<code>[root@client1 ~]</code><code># tail -f /var/log/httpd/access_log </code>
<code>192.168.10.1 - - [06</code><code>/Nov/2014</code><code>:21:25:44 +0800] </code><code>"GET /other/ HTTP/1.1"</code> <code>200 15 </code><code>"-"</code> <code>"Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0"</code>
本文转自 西索oO 51CTO博客,原文链接:http://blog.51cto.com/lansgg/1575274