Lnmp:502+admin认证+301+日志切割缓存++


1.常见的502问题解决
权限不够502。读取文件不到502。下面502排查:


[root@Linuxhao3 ~]# cd /usr/local/nginx/conf/vhosts/

[root@Linuxhao3 vhosts]# ls
[root@Linuxhao3 vhosts]# vim 111.conf

更改如下:灰色为修改部分

location ~ \.php$ {
        include fastcgi_params;
        fastcgi_pass unix:/tmp/www.sock;
        #fastcgi_pass  127.0.0.1:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;


保存退出。

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t  检测

[root@Linuxhao3 vhosts]# /etc/init.d/nginx reload            重新加载

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.111.com -I

HTTP/1.1 502 Bad Gateway

状态码

[root@Linuxhao3 vhosts]# vim ../nginx  进入主配置文件查看错误日志存放地址。

[root@Linuxhao3 vhosts]# cat /usr/local/nginx/logs/nginx_error.log          查看错误日志cucrit表示级别

2017/02/24 20:45:27 [crit] 2160#0: *54 connect() to unix:/tmp/www.sock failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: www.111.com, request: "HEAD http://www.111.com/ HTTP/1.1", upstream: "fastcgi://unix:/tmp/www.sock:", host: "www.111.com"

Permission denied:表示没有权限

[root@Linuxhao3 vhosts]# ls -l /tmp/www.sock

srw-rw----. 1 root root 0 2月  24 18:46 /tmp/www.sock

[root@Linuxhao3 vhosts]# ps aux | grep nginx

root      1452  0.0  0.1   5188  1384 ?        Ss   17:28   0:00 nginx: master process /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
nobody    2160  0.0  0.2   6368  2432 ?        S    20:43   0:00 nginx: worker process                   
nobody    2161  0.0  0.2   6368  2436 ?        S    20:43   0:00 nginx: worker process                   
root      2175  0.0  0.0   6052   804 pts/0    S+   20:57   0:00 grep nginx

发现用户是nobody

[root@Linuxhao3 vhosts]# vim /usr/local/php/etc/php-fpm.conf  编辑php配置文件的,加入:

listen.owner = nobody
listen.group = nobody

按:wq保存退出。

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t

[root@Linuxhao3 vhosts]# /etc/init.d/nginx reload  

[root@Linuxhao3 vhosts]# /etc/init.d/php-fpm restart


刷新页面访问就ok了,502排查成功。


-------------------------------------------------------------------------------------------------------------------------



2、nginx的用户认证


需求:对管理中心登入界面进行二次验证,网址为http://www.111.com/admin.php,即对访问admin.php文件进行验证。以提高安全度

wKiom1XtervipFv_AABfMg3HByg222.jpg

配置虚拟主机文件

[root@Linuxhao3 vhosts]# vim 111.conf

在第一个server里面加入其中中:

    location ~ .*admin\.php$ {
    auth_basic "aminglinux auth";
    auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
    include fastcgi_params;
    fastcgi_pass unix:/tmp/www.sock;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;

    }

按:wq保存退出

用户认证需要用到htpasswd工具来生成密码文件,这个工具是Apache自带的,所以我们要先安装htpasswd

[root@Linuxhao3 vhosts]# yum install -y httpd
# which htpasswd   //查看htpasswd路径/usr/bin/htpassw

接着创建2个用户,并生成2个密码文件 aming & aming2

[root@Linuxhao3 vhosts]# htpasswd -c /usr/local/nginx/conf/.htpasswd aming
New password:
Re-type new password:
Adding password for user aming
[root@Linuxhao3 vhosts]# cat /usr/local/nginx/conf/.htpasswd
[root@Linuxhao3 vhosts]# htpasswd /usr/local/nginx/conf/.htpasswd aming2 创建二个用户的用法

wKiom1XtgO3yrpctAADdQO7sCv8629.jpg

如下图:

wKioL1XthaHQlTreAANzox0Xf3U452.jpg

我们重新加载下nginx

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t

[root@Linuxhao3 vhosts]# /etc/init.d/nginx reload

[root@Linuxhao3 vhosts]# curl -x127.0.01:80 www.111.com/admin.php  测试,401则要登陆密码

[root@Linuxhao3 vhosts]# curl -x127.0.01:80 -uaming:4640185 www.111.com/admin.php  输入账户密码 

显示</tr> </table> </body>
</html>,表示成功。

在刷新页面就可以看到登陆,提示了。

另注:如果只是对目录,这个目录必须是网站的根目录下的目录,例:/data/www/abc/。而且也不用写解析php的代码。如下:

location ~ /abc/ {              
auth_basic "testlinux auth";
auth_basic_user_file /usr/local/nginx/conf/.htpasswd;没有php不用加后面的解析
}

------------------------------------------------------------------------------------------------


3、nginx域名跳转

需求:要把访问域名 www.aaa.com(或www.bbb.com) 的域名转发到 www.test.com 上。

实现:找到本机 C:\Windows\System32\drivers\etc下的hosts文件,修改下面内容后保存退出。

192.168.0.109 www.tpp.com www.aaa.com www.bbb.com

[root@Linuxhao3 vhosts]# vim /usr/local/nginx/conf/vhosts/111.conf

server
{
    listen 80 ;
    server_name www.111.com www.aaa.com www.bbb.com;
    if ($host != 'www.111.com')
    {
       rewrite ^/(.*)$ http://www.111.com/$1 permanent;
    }

    index index.html index.htm index.php;
    root /data/www;

保存:wq退出

                            

如图:

wKiom1XtjjCiMU9kAAE3cmlRDhM841.jpg

保存退出后,重新加载nginx

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t

[root@Linuxhao3 vhosts]# /etc/init.d/nginx reload

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

测试下:

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.bbb.com/dfjds  -I

HTTP/1.1 301 Moved Permanently       //301状态
下面我们在浏览器输入www.aaa.com或者www.bbb.com时,会自动跳转到www.111.com去。


rewrite 指令最后一项参数flag标记说明:

last:本条规则匹配完成后,继续向下匹配新的 location URI 规则

break:本条规则匹配完成即终止匹配,不再匹配后面的任何规则。

redirect:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址。

permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址

说明使用last和break实现URI重写,浏览器地址栏不变;而且两者有细微差别,使用alias指令必须用

last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会

对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。



--------------------------------------------------------------------------------------


4、nginx不记录指定文件类型日志

日志文件默认会每次都会把很多图片以及一些css,js等文件记录下来,这让日志文件会变得很大,下面我们对日志进行设定,日志不去记录这些文件。我们配置虚拟主机文件

[root@Linuxhao3 vhosts]# vim ../nginx.conf  修改字段里带颜色的(表示格式的命名)地方=[root@Linuxhao3 conf]# vim /usr/local/nginx/conf/nginx.conf

log_format aming '$remote_addr $http_x_forwarded_for [$time_local]'
    '$host "$request_uri" $status'
    '"$http_referer" "$http_user_agent"';

保存退出



[root@Linuxhao3 conf]# cd /usr/local/nginx/conf/vhosts/
[root@Linuxhao3 conf]# vim 111.conf       #添加如下的location方式,在第一个location下面加入:

    root /data/www;       这下面也写入:  日志+存放路劲+格式,  日志的名字可以1.log
    access_log /tmp/access.log aming;

保存,重新加载,检测  重新刷新,就可以看到纪录的日志。也访问一哈图片

[root@Linuxhao3 vhosts]# cat /tmp/access.log

会看到增加更多的日志。以 .png .jgp 等等字眼的纪录



继续添加 vim 111.conf 

#添加如下的location方式,在第一个location下面加入:
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
   access_log off;
}
location ~ \.(js|css)
{
   access_log off;
}
location ~ (static|cache)
{
    access_log off;
}

保存退出

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.111.com/kldjsfjf -I      结果为404

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.111.com/kldjsfjdsdfsdf -I  结果为404

就生成日志,错误日志!

[root@Linuxhao3 vhosts]# ls /tmp/access.log

[root@Linuxhao3 vhosts]# cat /tmp/access.log

127.0.0.1 - [24/Feb/2017:23:54:32 +0800]www.111.com "/kldjsfjf" 404"-" "curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"
127.0.0.1 - [24/Feb/2017:23:55:09 +0800]www.111.com "/kldjsfjdsdfsdf" 404"-" "curl/7.19.7 (i386-redhat-linux-gnu) libcurl/7.19.7 NSS/3.19.1 Basic ECC zlib/1.2.3 libidn/1.18 libssh2/1.4.2"

这是curl 访问生成的,错误日志内容。

再到刷新页面,再看

[root@Linuxhao3 vhosts]# cat /tmp/access.log

会看到增加更多的日志。以 .png .jgp 等等字眼的纪录

[root@Linuxhao3 vhosts]# > /tmp/access.log  清空日志。

[root@Linuxhao3 vhosts]# cat /tmp/access.log

刷新一下页面,再看

[root@Linuxhao3 vhosts]# cat /tmp/access.log




wKioL1Xu6LDBuvoQAAJ-ZA8ob30472.jpg


不记录指定文件类型日志,成功。

----------------------------------------------------------------------------------------------------------------------------------------------------------------------


5、nginx日志切割


首先先查主配置文件中定义的日志格式 [root@Linuxhao3 ~]#  cat /usr/local/nginx/conf/nginx.conf

直接写脚本

[root@Linuxhao3 ~]# vim /usr/local/sbin/nginx_logrotate.sh

#!/bin/bash
d=`date -d "-1 day" +%F`        //今天减昨天的日志
[ -d /tmp/nginx_log ] || mkdir /tmp/nginx_log      //相当于if逻辑判断 -d为判断文件是否存在 ||如果不存在就执行创建文件
mv /tmp/access.log /tmp/nginx_log/$d.log         // 移动重命名
/etc/init.d/nginx reload > /dev/null               //重新加载/tmp/access.log文件  重定向于、dev、unll
cd /tmp/nginx_log/          压缩日志,先进去
gzip -f $d.log                     会产生同民覆盖

按保存退出

[root@Linuxhao3 ~]# sh -x /usr/local/sbin/nginx_logrotate.sh  ##执行脚本查看过程

++ date -d '-1 day' +%F
+ d=2017-02-24
+ '[' -d /tmp/nginx_log ']'
+ mv /tmp/access.log /tmp/nginx_log/2017-02-24.log
+ /etc/init.d/nginx reload
+ cd /tmp/nginx_log/
+ gzip -f 2017-02-24.log

[root@Linuxhao3 ~]#

[root@Linuxhao3 ~]# cat /tmp/access.log
[root@Linuxhao3 ~]#  ls /tmp/nginx_log
2017-02-24.log.gz


-----------------------------------------------------------------------------------------------------------------------------------------------------

6、nginx配置静态文件过期时间---静态文件缓存

配置静态文件缓存,像图片、css、js等静态文件,我们设置过期时间,过期后会重新加载。配置虚拟主机文件,直接在之前配置不记录日志的地方更加一句过期时间命令就行了

[root@Linuxhao3 ~]# cd /usr/local/nginx/conf/vhosts

[root@Linuxhao3 vhosts]# vim 111.conf

编辑配置文件:location ~ .*\.模块  ,添加带颜色的部分即可。

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
   access_log off;
   expires 15d;         //15天后过期
}
location ~ \.(js|css)
{
   access_log off;
   expires 2h;          //2小时后过期
}
location ~ (static|cache)
{
   access_log off;
}

:wq保存退出

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

刷新页面,就可以看到:


[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 'http://www.111.com/static/image/common/rleft.gif' -I   也可以这样查看为准!


[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 'http://www.111.com/static/image/common/rleft.gif' -I   也可以这样查看为准!

设置缓存成功!


------------------------------------------------------------------------------------------------------------------------------------------------------------------------


6、nginx配置防盗链

继续编辑 [root@Linuxhao3 vhosts]# vim 111.conf  里面的location ~ .*\.模块

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|mp3|mp4|flv|rar|zip|gz|bz2)$
{
   access_log off;
   expires 15d; 

   valid_referers none blocked  *.111.com  *.aaa.com  *.bbb.com;     #可用的reference
    if ($invalid_referer)
    {
            return 403;
     }      

}
location ~ \.(js|css)
{
   access_log off;
   expires 2h;      
}
location ~ (static|cache)
{
   access_log off;
}

:wq保存退出

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t

[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

下面可以测试了

curl -e  "http://www.baidu.com/111" -x127.0.0.1:80  'http://www.111.com/data/attachment/forum/201702/24/091211gnuw7002ehdhp0p3.jpg' -I  

HTTP/1.1 403 Forbidden

curl测试指定referer, 测试图片可用否-e选项测试,必须要加 "http://ww

# curl -x127.0.0.1:80 'http://www.111.com/data/attachment/forum/201702/24/091211gnuw7002ehdhp0p3.jpg' -I

HTTP/1.1 200 OK

# curl -e "http://www.bbb.com/111" -x127.0.0.1:80 'http://www.111.com/data/attachment/forum/201702/24/091211gnuw7002ehdhp0p3.jpg' -I
HTTP/1.1 200 OK



------------------------------------------------------------------------------------------


6、nginx访问控制

情景一:有时候查看日志的时候发现有IP攻击网站,那么我们就可以禁掉该IP地址。
这里我们就要配置全局的黑名单,会一条一条的匹配,当被匹配到名单后就立即执行,后面的所有名单就不管了。
配置虚拟主机文件

情景二:也有时候设置只对某些IP才能访问特定网页,比如管理中心网址只有管理员的IP才能访问。
因为我们之前对管理中心网址进行了用户验证的配置,我们可以取消用户验证,而是来设置访问IP的白名单,安全性能比用户验证更高。下面我们直接对location模块中admin.php进行设置



[root@Linuxhao3 vhosts]# vim 111.conf  继续在这里面编辑,在在location模块定义:

注销 # auth_basic 的行,插入:白名单法则:

例如:

    location ~ .*admin\.php$ {
        auth_basic "aminglinux auth";   (删掉:表示取消用户认证)
        auth_basic_user_file /usr/local/nginx/conf/.htpasswd;      #(需要注销掉这俩行、删掉)

        include fastcgi_params;
        fastcgi_pass unix:/tmp/www.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/www$fastcgi_script_name;
    }


并插入:


       allow 127.0.0.1;
       deny all;

:wq保存退出
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.111.com/ admin.php -I
HTTP/1.1 200 状态200的

[root@Linuxhao3 vhosts]# curl -x192.168.1.108:80 www.111.com/admin.php -I
HTTP/1.1 403 状态403的

结果只能为403,禁止就是它这种没加入的名单。

[root@Linuxhao3 vhosts]# curl -x192.168.1.108:80 www.111.com/forum.php -I

HTTP/1.1 200  状态200的

但是forum。php 是200的

在浏览器上 http://www.111.com/admin.php  结果状态码为403的,表示设置正确的。


------------------------------------------------------------------------

[root@Linuxhao3 vhosts]# vim 111.conf  继续在这里面编辑,在在location模块前面定义,全局配置

在server里面最后

黑名单法则:

root /data/www;后面:插入黑名单

deny 127.0.0.1;

deny 1.1.1.1;     

这表示只拒绝127.0.0.1的ip地址,其他的全部可以接受。

也可以改成

(deny 192.168.1.0/24;  #表示这区间所有的网段都拒绝掉! #2黒名单只需写一个deny不需要allow  ##1白名需要写 deny 和allow 不分先后顺序。)

:wq保存退出
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload
[root@Linuxhao3 vhosts]#  curl -x192.168.1.108:80 www.111.com/forum.php -I
HTTP/1.1 200 OK

[root@Linuxhao3 vhosts]#  curl -x127.0.0.1:80 www.111.com/forum.php -I
HTTP/1.1 403 Forbidden

[root@YQ001 vhosts]# curl -x192.168.1.125:80  http://www.111.com/forum.php -I

随便那个网址都是除127都是200的, server   location ~ .*admin\.php$    模块的写法特点

------------------------------------------------------------------------------------------------------------------------------------------


7、nginx禁止指定user_Agent

有时候网址访问量很大,很费资源,我们可以禁掉一些不重要的搜索。禁掉baidu,虽然百度能够正常搜索到网站,……

配置虚拟主机文件:vim 111.cof

[root@Linuxhao3 ~]#  cd /usr/local/nginx/conf/vhosts/

[root@Linuxhao3 vhosts]# vim 111.conf  编辑文件,

在server里面最后

root /data/www;后面:

if ($http_user_agent ~* 'biying|baidu|youdao|360|sogou|aaaaaa')        //"~"后面紧跟"*"表示不区分大小写
{
       return 403;
}

:wq保存退出
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

[root@Linuxhao3 vhosts]# curl -x192.168.1.108:80 www.111.com/forum.php -I
HTTP/1.1 200 OK

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.111.com/forum.php -I
HTTP/1.1 200 OK

[root@Linuxhao3 vhosts]# curl -A "jkdbaIdujfsljdfisjdflksdfds" -x127.0.0.1:80 www.111.com/forum.php -I
HTTP/1.1 403 Forbidden(需要的结果,因为包含百度在里面,模拟user_Agent测法)

[root@Linuxhao3 vhosts]# curl -A "jfsjkhfjsaaaaAAaisjdflksdfds" -x127.0.0.1:80 www.111.com/forum.php -I
HTTP/1.1 403 Forbidden(需要的结果,7个a在里面,

[root@Linuxhao3 vhosts]# curl -A "jfsjkhfjsyOudaoflksdfds" -x127.0.0.1:80 www.111.com/forum.php -I
HTTP/1.1 403 Forbidden(需要的结果,youdao在里面,所以配置成功。)


---------------------------------------------------------------------------------------------------------------------------------

8、nginx代理详解

我们不能访问Google,但可以在香港或者国外服务器上做个nginx代理,然后我们通过代理访问,(不过前提是该服务器能够访问Google)。

同样的道理,有些地方不能访问百度,而我们可以访问,故我们用百度来做个nginx代理实验。

首先查看下百度的真实的网站IP yum install bind*安装

[root@Linuxhao3 ~]#  cd /usr/local/nginx/conf/vhosts/

[root@Linuxhao3 ~]# ls 

[root@Linuxhao3 ~] ping www.baidu.com   #可以看到ip     和ifconfig自己的ip

 [root@Linuxhao3 vhosts]# vim proxy.conf    写入一下内容:

server {
    listen 80;
    server_name www.baidu.com;


    location / {
        proxy_pass http://119.75.218.70/;
    }
}


:wq保存退出
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.baidu.com   

……

显示    </tr> </table> </body> </html>,表示nginx代理成功。


当我们在上面测试出百度网站有两个真实的IP,下面我们就可以用多个IP解析到百度,实现负载均衡。

[root@Linuxhao3 vhosts]# yum install -y bind*  探测域名解析到的ip用的工具包

[root@Linuxhao3 vhosts]# dig www.baidu.com

查看到 百度还有个ip为

显示处:在与你ping到的ip得到的地址相邻

俩个ip会显示在一起俩行

;; ANSWER SECTION:
www.baidu.com. 35 IN CNAME www.a.shifen.com.
www.a.shifen.com. 388 IN A 119.75.217.109
www.a.shifen.com. 388 IN A 119.75.218.70

----------------------------------------------

当有多个域名时候

[root@Linuxhao3 vhosts]# vim proxy.conf

upstream aming{
  server 119.75.218.70:80;
  server 119.75.217.109:80;
}
server {
    listen 80;
    server_name www.baidu.com;


    location / {
        proxy_pass http://aming/;
        proxy_set_header Host $host;
        #proxy_set_header X-Real-IP $remote_addr;
    }
}

:wq保存退出
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -t
[root@Linuxhao3 vhosts]# /usr/local/nginx/sbin/nginx -s reload

[root@Linuxhao3 vhosts]# curl -x127.0.0.1:80 www.baidu.com 

]# curl -x127.0.0.1:80 www.baidu.com -I
HTTP/1.1 200 OK

……  gif> </p> </div> </div> </div> </body> </html>  表示代理成功。

配置不正确表示502!

---------------------------------------------------------------------------------------------------------------------------













nginx针对请求的uri来代理

场景:1台nginx去代理4台apache
需求:根据不同的请求uri 代理到不同的apache

nginx的配置文件为:

  1.     upstream aa.com {         
  2.                       server 192.168.0.121;
  3.                       server 192.168.0.122;  
  4.      }
  5.     upstream bb.com {  
  6.                        server 192.168.0.123;
  7.                        server 192.168.0.124;
  8.         }
  9.     server {
  10.         listen       80;
  11.         server_name  www.abc.com;
  12.         location ~ aa.php
  13.         {
  14.             proxy_pass http://aa.com/;
  15.             proxy_set_header Host   $host;
  16.             proxy_set_header X-Real-IP      $remote_addr;
  17.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18.         }
  19.          location ~ bb.php
  20.         {
  21.               proxy_pass http://bb.com/;
  22.               proxy_set_header Host   $host;
  23.               proxy_set_header X-Real-IP      $remote_addr;
  24.               proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25.           }
  26. }



---------------------------------------------------------------------------------------

Nginx的rewrite应用 if应用


Rewrite主要的功能是实现URL重写,Nginx 的 Rewrite 规则采用 PCRE Perl 兼容正则表达式的语法进行规则匹配,如相使用 Nginx 的 Rewrite 功能,在编译 Nginx 前要编译安装 PCRE 库。


一,Nginx使用if进行条件匹配

Nginx可以用if进行条件匹配,语法规则类似C

if (条件){...} ( 可用于: server,location )  ## 检查一个条件是否符合,如果条件符合,则执行大括号内的语句。不支持嵌套,不支持多条件 && || 

例如:if ($http_user_agent ~ MSIE) {rewrite  ^(.*)$  /msie/$1  break;}

1、正则表达式匹配,其中:

~  为区分大小写匹配 
~* 为不区分大小写匹配 
!~和!~*分别为区分大小写不匹配及不区分大小写不匹配

2、文件及目录匹配,其中:

-f和!-f用来判断是否存在文件 
-d和!-d用来判断是否存在目录 
-e和!-e用来判断是否存在文件或目录 
-x和!-x用来判断文件是否可执行

例如:if (!-f $request_filename) {proxy_pass  http://127.0.0.1;}

Wordpress的重定向规则:

if (!-e $request_filename) {rewrite ^/(index|atom|rsd)\.xml$ http://feed.shunz.net last;rewrite ^([_0-9a-zA-Z-]+)?(/wp-.*) $2 last;rewrite ^([_0-9a-zA-Z-]+)?(/.*\.php)$ $2 last;rewrite ^ /index.php last;}


return ( 可用于: server,location,if )  ## 用于结束规则的执行并反回状态码给客户端。  状态码可以是 :204/400/402~406/408/410/411/413/416/500~504  

如:location ~ .*\.(sh|bash)?$ {  
      return 403;  
    }  
## 访问的 URL 以 .sh .bash 结尾的,则返回 403 。

204  No Content  
400  Bad Request  
402  Payment Required  
403  Forbidden  
404  Not Found  
405  Method Not Allowed  
406  Not Acceptable  
408  Request Timeout  
410  Gone  
411  Length Required  
413  Request Entity Too Large  
416  Requested Range Not Satisfiable  
500  Internal Server Error  
501  Not Implemented  
502  Bad Gateway  
503  Service Unavailable  
504  Gateway Timeout 
---------------------------------------------

二,Nginx使用rewrite

rewrite ( 可用于: server,location,if ) ## 重写 URL ,或修改字符串。重写 URL 只对相对路径有效,如想对主机名,要使用 if 语句。 


例1:
if ($host ~* www\.(.*)) {  
      set $host_without_www $1;  
      rewrite ^(.*)$ http://$host_without_www$1 permanent;  
}  
## 如果替换串以 http:// 开头,将会采用 301 或 302 跳转进行 URL 重定向。 

例2:
rewrite ^/feed/$ http://feed.shunz.net last;


Nginx的Rewrite规则与Apache几乎完全一致,所不同的是最后的flag标记,Nginx的rewrite指令后支持的标记有last,break,redirect,permanent

last 相当于Apache里的[L]标记,表示完成rewrite,不再匹配后面的规则 
break ( 可用于: server,location,if ) ## 本条规则匹配完成后,终止匹配,不再匹配后面的规则

如:rewrite ^/b/(.*)\.html /play.php?video=$1 break; 
redirect 返回302临时重定向,浏览器会显示跳转后的URL地址
permanent 返回301永久重定向,浏览器会显示跳转后的URL地址

last/break用来实现URL重写,浏览器地址栏的URL不变,但在服务器端访问的路径发生了变化。
redirect/permanent实现URL跳转,浏览器地址栏URL会显示跳转后的URL。
使用 alias 指令时必须用 last 标记 ,使用 proxy_pass 指令时要用 break 表示。last 标记在本条 rewrite 规则执行完毕后,会对其所在 server{....}标签重新发起请求,而 break 标记则在本条规则匹配完成后,终止匹配。  

如:location /cms/ {  
      proxy_pass http://test.abc.com;  
      rewrite "^/cms/(.*)\.html$" /cms/index.html break;  
}  

## 这条规则如果使用 last 会导致死循环。  
## 一般在根 location 中(即 location / {....})或直接在 server 标签编写 rewrite 规则,推荐使用 last 标记,  
       在非根 location 中 (即 location /cms/ {...}),则使用 break 标记。 


Nginx $document_uri参数的使用

$document_uri  表示访问的url 现在我的需求是,访问 www.abc.com  请求到 www.abc.com/abc/

在nginx配置文件中加入


   if ($document_uri !~ 'abc')
    {
            rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
    }


而不是单独加一句  rewrite ^/(.*)$ http://www.abc.com/abc/$1 permanent;
如果只加rewrite 规则,而不限定条件,那么会造成死循环。  会访问到   http://www.abc.com/abc/abc/abc/abc/....


-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

nginx代理--根据访问的目录来区分后端的web


我的需求: 当请求的目录是 /aaa/ 则把请求发送到机器a,当请求的目录为/bbb/则把请求发送到机器b,除了目录/aaa/与目录/bbb/外,其他的请求发送到机器b

我的配置文件内容为:

  1. upstream aaa.com
  2. {
  3.             server 192.168.111.6;
  4. }
  5. upstream bbb.com
  6. {
  7.             server 192.168.111.20;
  8. }
  9. server {
  10.         listen 80;
  11.         server_name li.com;
  12.         location /aaa/
  13.         {
  14.             proxy_pass http://aaa.com/aaa/;
  15.             proxy_set_header Host   $host;
  16.             proxy_set_header X-Real-IP      $remote_addr;
  17.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  18.         }
  19.         location /bbb/
  20.         {
  21.             proxy_pass http://bbb.com/bbb/;
  22.             proxy_set_header Host   $host;
  23.             proxy_set_header X-Real-IP      $remote_addr;
  24.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  25.         }
  26.         location /
  27.         {
  28.             proxy_pass http://bbb.com/;
  29.             proxy_set_header Host   $host;
  30.             proxy_set_header X-Real-IP      $remote_addr;
  31.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  32.         }
  33. }
说明:
1 以上配置文件中的 aaa.com 以及 bbb.com 都是自定义的,随便写。
2 upstream 中的server 可以写多个,例如

upstream aaa.com 
{
            server 192.168.111.6;
            server  192.168.111.4;
            server  192.168.111.5;
}

3 proxy_pass  http://aaa.com/aaa/   这里必须要加这个目录,不然就访问到根目录了。
4 实际上,上述配置文件中, localtion /bbb/ 部分是可以省略掉的,因为后边的 location /  已经包含了/bbb/,所以即使我们不去定义  localtion /bbb/ 也是会访问到 bbb.com 的。



----------------------------------------------------------------------






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值