Nginx的基本配置


上篇文章介绍了基于LNMP搭建discuz!论坛:http://msiyuetian.blog.51cto.com/8637744/1691635

下面我们接着对nginx进行基本的配置


1、nginx的用户认证

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

wKiom1XtervipFv_AABfMg3HByg222.jpg


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

[root@tpp ~]# yum install -y httpd
[root@tpp ~]# which htpasswd         //查看htpasswd路径
/usr/bin/htpasswd

接着创建tpp用户,并生成一个密码文件

[root@tpp ~]# /usr/bin/htpasswd -c /usr/local/nginx/conf/.htpasswd tpp

wKiom1XtgO3yrpctAADdQO7sCv8629.jpg


(2)配置虚拟主机文件

[root@tpp ~]# vim /usr/local/nginx/conf/vhosts/test.conf      //添加如下代码
location ~ .*admin\.php$ {              
 auth_basic "testlinux 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;
 }

如下图:

wKioL1XthaHQlTreAANzox0Xf3U452.jpg

我们重新加载下nginx

[root@tpp ~]# /etc/init.d/nginx reload

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

location ~ /abc/ {              
 auth_basic "testlinux auth";
 auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
 }


(3)验证

我们再次访问管理中心时候,就会提示要进行认证。如下图:

wKioL1Xth5GiQi05AAGcF_gWjO4410.jpg

验证成功后,我们就可以进入管理中心的登入页面了。

wKiom1XthWiQDtomAAD4Fa1SVt8016.jpg

注:如果没有跳出验证界面,可能就是我们的浏览器有缓存,我们清理下就行了。或者你也可以用curl来进行测试:

[root@tpp ~]# curl -x127.0.0.1:80 -utpp:123456 www.test.com/admin.php

当出现了网页代码就表示成功了,如下图:

wKiom1XthrSiVcv8AAMvOXEO6CU921.jpg



2、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@tpp ~]# vim /usr/local/nginx/conf/vhosts/test.conf             //修改如下代码

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

如图:

wKiom1XtjjCiMU9kAAE3cmlRDhM841.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload

测试下:

[root@tpp ~]# curl -x127.0.0.1:80 www.aaa.com -I
HTTP/1.1 301 Moved Permanently       //301状态
Server: nginx/1.4.4
Date: Mon, 07 Sep 2015 21:08:28 GMT
Content-Type: text/html
Content-Length: 184
Connection: keep-alive
Location: http://www.test.com/      //成功跳转

下面我们在浏览器输入www.aaa.com或者www.bbb.com时,会自动跳转到www.test.com去。



3、nginx日志切割

首先先查主配置文件中定义的日志格式

[root@tpp ~]# cat /usr/local/nginx/conf/nginx.conf

可以看到日志定义的格式为:log_format 名字为:combined_realip 如下图:

wKioL1Xu2xjzoPhDAAL7Gfm7DE0627.jpg

接着配置虚拟主机文件

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf                  //添加下面一行
access_log /tmp/access.log combined_realip;

wKioL1Xu3T_jX9pJAAH9D7p6-eY763.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload

刷新论坛,然后我们看看是否生成了日志文件

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

wKioL1Xu3hfw-UXnAAGunD9wDko061.jpg接着创建一个切割日志的脚本

[root@tpp ~]# vim /usr/local/sbin/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文件
cd /tmp/nginx_log/
gzip -f $d.log                                     //压缩日志文件,不保留原文件

wKioL1Xu4Dvzt8TWAAD7a9Ce4w4654.jpg

保存退出后,我们来执行下脚本

[root@tpp vhosts]# sh -x /usr/local/sbin/logrotate.sh
++ date -d '-1 day' +%F
+ d=2015-09-08
+ '[' -d /tmp/nginx_log ']'
+ mkdir /tmp/nginx_log
+ mv /tmp/access.log /tmp/nginx_log/2015-09-08.log
+ /etc/init.d/nginx reload
+ cd /tmp/nginx_log/
+ gzip -f 2015-09-08.log
[root@tpp vhosts]# ls /tmp/nginx_log/
2015-09-08.log.gz                           //生成了以时间为命名的日志文件
[root@tpp vhosts]# ls /tmp/access.log
/tmp/access.log                             //重新生成了新的access.log文件


然后我们把/usr/local/sbin/logrotate.sh加入到执行计划里面去,让其每天凌晨1点执行一次。

首先给这个shell文件添加可执行的权限

[root@tpp vhosts]# chmod a+x /usr/local/sbin/logrotate.sh

然后加入到任务计划中

[root@tpp vhosts]# crontab -e
00 01 * * * /usr/local/sbin/logrotate.sh

退出保存后重启下crond服务

[root@tpp vhosts]# service crond restart




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

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

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf                  //添加如下的location方式
location ~ .*\.(gif|jpg|jpeg|pen|bmp|swf)$
{
  access_log off;
}
location ~ \.(js|css)
{
  access_log off;
}
location ~ (static|cache)
{
   access_log off;
}

如图:

wKioL1Xu6LDBuvoQAAJ-ZA8ob30472.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload

刷新论坛,然后我们可以去日志文件看看是否记录了这些文件。



5、配置静态文件过期时间

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

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf
location ~ .*\.(gif|jpg|jpeg|pen|bmp|swf)$
{
  access_log off;
  expires 15d;        //15天后过期
}
location ~ \.(js|css)
{
  access_log off;
  expires 2h;          //2小时后过期
}
location ~ (static|cache)
{
  access_log off;
}

如图:

wKiom1Xu6OXgwX7GAADv4yg4XCw059.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload

下面我们来测试下,刷新下论坛网页,按F12,查看下

wKioL1Xu7F-BO4kqAAE_UO-CiPo704.jpg

或者我们直接用curl测试上面的URL

[root@tpp vhosts]# curl -x127.0.0.1:80 http://www.test.com/static/js/common.js?e9v -I

如图:

wKiom1Xu6t_RwRUyAAIQMYeLOlQ069.jpg




6、nginx配置防盗链

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf                      //我们在之前的基础上加上如下标红命令
location ~ .*\.(gif|jpg|jpeg|pen|bmp|swf|mp3|mp4|flv|rar|zip|gz|bz2)$
{
   access_log off;
   expires 15d;
   valid_referers none blocked *.test.com *.aaa.com *.bbb.com;
   if ($invalid_referer)
   {
       return 403;
    }

}

如图:

wKiom1XvB4HhvUCtAAE9RW0KM8s938.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload


我们在网页上找一张图片进行测试

(1)测试能不能访问(结果:能访问)

[root@tpp vhosts]# curl -I -x127.0.0.1:80 http://www.test.com/static/image/common/logo_88_31.gif

wKiom1XvCU-jRIFDAAFO_dWmH2o717.jpg

(2)测试能不能上传到百度去(结果:禁止)

[root@tpp vhosts]# curl -e "http://www.baidu.com" -I -x127.0.0.1:80 http://www.test.com/static/image/common/logo_88_31.gif

wKiom1XvCU_A_z00AAFJiOsXkAU659.jpg

(3)测试白名单网站(结果:能上传)

[root@tpp vhosts]# curl -e "http://www.test.com" -I -x127.0.0.1:80 http://www.test.com/static/image/common/logo_88_31.gif

wKioL1XvDADC6qDqAAE96IwRzoo326.jpg



7、nginx访问控制

情景一:有时候查看日志的时候发现有IP攻击网站,那么我们就可以禁掉该IP地址。

这里我们就要配置全局的黑名单,会一条一条的匹配,当被匹配到名单后就立即执行,后面的所有名单就不管了。

配置虚拟主机文件

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf                    //在location模块之前定义
deny 127.0.0.1;
deny 1.1.1.1;

如图:

wKioL1XwFxPQ0jn_AADa1ERDq5I320.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload

测试:

本机地址测试下(结果:能访问)

[root@tpp vhosts]# curl -x192.168.0.109:80 www.test.com/forum.php -I

如图:

wKiom1XwFpLQx1rTAAEPbIiMLxw620.jpg

127.0.0.1测试下(结果:禁止访问)

[root@tpp vhosts]# curl -x127.0.0.1:80 www.test.com/forum.php -I

如图:

wKioL1XwGM7juc5XAAC9r0op_p0106.jpg

情景二:也有时候设置只对某些IP才能访问特定网页,比如管理中心网址只有管理员的IP才能访问。

因为我们之前对管理中心网址进行了用户验证的配置,我们可以取消用户验证,而是来设置访问IP的白名单,安全性能比用户验证更高。下面我们直接对location模块中admin.php进行设置

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf                 //添加白名单
 allow 127.0.0.1;
 deny all;

wKioL1XwHc7ypgReAAF21GTJhtw205.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload


测试下:

(1)白名单访问管理中心网址,结果:能访问

[root@tpp vhosts]# curl -x127.0.0.1:80 www.test.com/admin.php -I

wKioL1XwHPvzoQREAADlwEju5qk092.jpg

(2)其他的IP访问管理中心网址,结果:不能访问

[root@tpp vhosts]# curl -x192.168.0.109:80 www.test.com/admin.php -I

wKiom1XwGtyz-5lMAADovb9VYl4456.jpg

(3)其他的IP访问网址首页,结果:能访问

[root@tpp vhosts]# curl -x192.168.0.109:80 www.test.com/forum.php -I

wKioL1XwHRaAI1EyAADDoN1-K2M240.jpg

从如上几个测试可知,管理中心的网址只有白名单IP才能访问,其他的IP都不能访问。

我们也可以对一个目录进行访问控制,直接添加location模块就行

location ~ /abc/ {
 allow 127.0.0.1;
 deny all;
}




8、nginx禁止指定user_agent

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

配置虚拟主机文件:

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf                    //添加以下
if ($http_user_agent ~* 'baidu|youdao|1111')        //"~"后面紧跟"*"表示不区分大小写
{
  return 403;
}

wKiom1XwINTxzxM3AACyUjSPeSw918.jpg

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload


测试下

不含baidu、youdao、1111是通的:

[root@tpp vhosts]# curl -A "qeasdrftgyhuj" -x192.168.0.109:80 www.test.com/forum.php -I

wKiom1XwIfayGd47AAFA81hm1TE906.jpg

含有baidu、youdao、1111则禁止访问:

[root@tpp vhosts]# curl -A "qeasdrbaiduftgyhuj" -x192.168.0.109:80 www.test.com/forum.php -I

wKiom1XwIgWwRN2hAAEUY6-z4uk751.jpg




9、nginx的代理功能

我们不能访问Google,但可以在香港或者国外服务器上做个nginx代理,然后我们通过代理访问,不过前提是该服务器能够访问Google。同样的道理,有些地方不能访问百度,而我们可以访问,故我们用百度来做个nginx代理实验。

首先查看下百度的真实的网站IP

[root@tpp ~]# dig www.baidu.com     //若没有该命令,可以yum install -y bind*安装

wKioL1XwKfXyyQMWAADd9T1714E571.jpg

如下图可以看到两个IP:115.239.211.112和115.239.210.27

下面我们新建虚拟主机

[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim proxy.conf      
server {
   listen 80;            
   server_name www.baidu.com;
   location / {
       proxy_pass http://115.239.211.112/;      
   }
}

保存退出后,重新加载nginx

[root@tpp ~]# /etc/init.d/nginx reload

测试下(把百度的IP解析到本机IP,然后再访问百度)

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

wKioL1XwLHPDjZ3nAAMjcCN-fns960.jpg

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

修改虚拟主机配置文件

[root@tpp vhosts]# vim proxy.conf
upstream tpp{                           //tpp为自定义的名字
   server 115.239.211.112:80;
   server 115.239.210.27:80;
}
server {
   listen 80;
   server_name www.baidu.com;
   location / {
       proxy_pass http://tpp/;
       proxy_set_header Host $host;
   }
}

如图

wKiom1XwLGnTHeN2AADwxIvPpNM913.jpg

测试下

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

wKiom1XwLJTide3DAAM_qwrxChQ298.jpg






你可能感兴趣的:(nginx)