上篇文章介绍了基于LNMP搭建discuz!论坛:http://msiyuetian.blog.51cto.com/8637744/1691635
下面我们接着对nginx进行基本的配置
1、nginx的用户认证
需求:对管理中心登入界面进行二次验证,网址为http://www.test.com/admin.php,即对访问admin.php文件进行验证。
(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
(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;
}
如下图:
我们重新加载下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)验证
我们再次访问管理中心时候,就会提示要进行认证。如下图:
验证成功后,我们就可以进入管理中心的登入页面了。
注:如果没有跳出验证界面,可能就是我们的浏览器有缓存,我们清理下就行了。或者你也可以用curl来进行测试:
[root@tpp ~]# curl -x127.0.0.1:80 -utpp:123456 www.test.com/admin.php
当出现了网页代码就表示成功了,如下图:
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;
}
如图:
保存退出后,重新加载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 如下图:
接着配置虚拟主机文件
[root@tpp ~]# cd /usr/local/nginx/conf/vhosts/
[root@tpp vhosts]# vim test.conf //添加下面一行
access_log /tmp/access.log combined_realip;
保存退出后,重新加载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
接着创建一个切割日志的脚本
[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 //压缩日志文件,不保留原文件
保存退出后,我们来执行下脚本
[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;
}
如图:
保存退出后,重新加载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;
}
如图:
保存退出后,重新加载nginx
[root@tpp ~]# /etc/init.d/nginx reload
下面我们来测试下,刷新下论坛网页,按F12,查看下
或者我们直接用curl测试上面的URL
[root@tpp vhosts]# curl -x127.0.0.1:80 http://www.test.com/static/js/common.js?e9v -I
如图:
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;
}
}
如图:
保存退出后,重新加载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
(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
(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
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;
如图:
保存退出后,重新加载nginx
[root@tpp ~]# /etc/init.d/nginx reload
测试:
本机地址测试下(结果:能访问)
[root@tpp vhosts]# curl -x192.168.0.109:80 www.test.com/forum.php -I
如图:
127.0.0.1测试下(结果:禁止访问)
[root@tpp vhosts]# curl -x127.0.0.1:80 www.test.com/forum.php -I
如图:
情景二:也有时候设置只对某些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;
保存退出后,重新加载nginx
[root@tpp ~]# /etc/init.d/nginx reload
测试下:
(1)白名单访问管理中心网址,结果:能访问
[root@tpp vhosts]# curl -x127.0.0.1:80 www.test.com/admin.php -I
(2)其他的IP访问管理中心网址,结果:不能访问
[root@tpp vhosts]# curl -x192.168.0.109:80 www.test.com/admin.php -I
(3)其他的IP访问网址首页,结果:能访问
[root@tpp vhosts]# curl -x192.168.0.109:80 www.test.com/forum.php -I
从如上几个测试可知,管理中心的网址只有白名单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;
}
保存退出后,重新加载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
含有baidu、youdao、1111则禁止访问:
[root@tpp vhosts]# curl -A "qeasdrbaiduftgyhuj" -x192.168.0.109:80 www.test.com/forum.php -I
9、nginx的代理功能
我们不能访问Google,但可以在香港或者国外服务器上做个nginx代理,然后我们通过代理访问,不过前提是该服务器能够访问Google。同样的道理,有些地方不能访问百度,而我们可以访问,故我们用百度来做个nginx代理实验。
首先查看下百度的真实的网站IP
[root@tpp ~]# dig www.baidu.com //若没有该命令,可以yum install -y bind*安装
如下图可以看到两个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
我们在上面测试出百度网站有两个真实的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;
}
}
如图
测试下
[root@tpp vhosts]# curl -x127.0.0.1:80 www.baidu.com -I