buser 发表于 2018-11-11 11:26:33

Nginx的基本配置

  上篇文章介绍了基于LNMP搭建discuz!论坛:http://msiyuetian.blog.51cto.com/8637744/1691635
  下面我们接着对nginx进行基本的配置
  1、nginx的用户认证
  需求:对管理中心登入界面进行二次验证,网址为http://www.test.com/admin.php,即对访问admin.php文件进行验证。

  (1)用户认证需要用到htpasswd工具来生成密码文件,这个工具是Apache的,所以我们要先安装Apache。
# yum install -y httpd  # which htpasswd         //查看htpasswd路径
  /usr/bin/htpasswd
  接着创建tpp用户,并生成一个密码文件
# /usr/bin/htpasswd -c /usr/local/nginx/conf/.htpasswd tpp
  
  (2)配置虚拟主机文件
# 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
# /etc/init.d/nginx>  注:如果只是对目录,这个目录必须是网站的根目录下的目录,例:/data/www/abc/。而且也不用写解析php的代码。如下:
location ~ /abc/ {  auth_basic "testlinux auth";
  auth_basic_user_file /usr/local/nginx/conf/.htpasswd;
  }
  (3)验证
  我们再次访问管理中心时候,就会提示要进行认证。如下图:

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

  注:如果没有跳出验证界面,可能就是我们的浏览器有缓存,我们清理下就行了。或者你也可以用curl来进行测试:
# 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  配置虚拟主机文件
# 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
# /etc/init.d/nginx>  测试下:
# 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去。
  rewrite 指令最后一项参数flag标记说明:
  last:本条规则匹配完成后,继续向下匹配新的 location URI 规则
  break:本条规则匹配完成即终止匹配,不再匹配后面的任何规则。
  redirect:返回302临时重定向,浏览器地址栏会显示跳转后的URL地址。
  permanent:返回301永久重定向,浏览器地址栏会显示跳转后的URL地址。
  说明:使用last和break实现URI重写,浏览器地址栏不变;而且两者有细微差别,使用alias指令必须用
  last标记;使用proxy_pass指令时,需要使用break标记。Last标记在本条rewrite规则执行完毕后,会
  对其所在server{......}标签重新发起请求,而break标记则在本条规则匹配完成后,终止匹配。
  
  3、nginx日志切割
  首先先查主配置文件中定义的日志格式
# cat /usr/local/nginx/conf/nginx.conf  可以看到日志定义的格式为:log_format 名字为:combined_realip 如下图:

  接着配置虚拟主机文件
# cd /usr/local/nginx/conf/vhosts/  # vim test.conf                  //添加下面一行
  access_log /tmp/access.log combined_realip;

  保存退出后,重新加载nginx
# /etc/init.d/nginx>  刷新论坛,然后我们看看是否生成了日志文件
# ls /tmp/access.log  /tmp/access.log
  # cat /tmp/access.log
接着创建一个切割日志的脚本
# 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>  cd /tmp/nginx_log/
  gzip -f $d.log                                     //压缩日志文件,不保留原文件

  保存退出后,我们来执行下脚本
# 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>  + cd /tmp/nginx_log/
  + gzip -f 2015-09-08.log
  # ls /tmp/nginx_log/
  2015-09-08.log.gz                           //生成了以时间为命名的日志文件
  # ls /tmp/access.log
  /tmp/access.log                           //重新生成了新的access.log文件
  然后我们把/usr/local/sbin/logrotate.sh加入到执行计划里面去,让其每天凌晨1点执行一次。
  首先给这个shell文件添加可执行的权限
# chmod a+x /usr/local/sbin/logrotate.sh  然后加入到任务计划中
# crontab -e  00 01 * * * /usr/local/sbin/logrotate.sh
  退出保存后重启下crond服务
# service crond restart  4、nginx不记录指定文件类型日志
  日志文件默认会每次都会把很多图片以及一些css,js等文件记录下来,这让日志文件会变得很大,下面我们对日志进行设定,日志不去记录这些文件。我们配置虚拟主机文件
# cd /usr/local/nginx/conf/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
# /etc/init.d/nginx>
  刷新论坛,然后我们可以去日志文件看看是否记录了这些文件。
  5、配置静态文件过期时间
  配置静态文件缓存,像图片、css、js等静态文件,我们设置过期时间,过期后会重新加载。配置虚拟主机文件,直接在之前配置不记录日志的地方更加一句过期时间命令就行了。
# cd /usr/local/nginx/conf/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
# /etc/init.d/nginx>
  下面我们来测试下,刷新下论坛网页,按F12,查看下

  或者我们直接用curl测试上面的URL
# curl -x127.0.0.1:80 http://www.test.com/static/js/common.js?e9v -I  如图:

  6、nginx配置防盗链
# cd /usr/local/nginx/conf/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
# /etc/init.d/nginx reload  我们在网页上找一张图片进行测试
  (1)测试能不能访问(结果:能访问)
# curl -I -x127.0.0.1:80 http://www.test.com/static/image/common/logo_88_31.gif
  (2)测试能不能上传到百度去(结果:禁止)
# curl -e "http://www.baidu.com" -I -x127.0.0.1:80 http://www.test.com/static/image/common/logo_88_31.gif
  (3)测试白名单网站(结果:能上传)
# 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地址。
  这里我们就要配置全局的黑名单,会一条一条的匹配,当被匹配到名单后就立即执行,后面的所有名单就不管了。
  配置虚拟主机文件
# cd /usr/local/nginx/conf/vhosts/  # vim test.conf                  //在location模块之前定义
  deny 127.0.0.1;
  deny 1.1.1.1;
  如图:

  保存退出后,重新加载nginx
# /etc/init.d/nginx reload  测试:
  本机地址测试下(结果:能访问)
  # curl -x192.168.0.109:80 www.test.com/forum.php -I
  如图:

  127.0.0.1测试下(结果:禁止访问)
  # curl -x127.0.0.1:80 www.test.com/forum.php -I
  如图:

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

  保存退出后,重新加载nginx
# /etc/init.d/nginx reload  测试下:
  (1)白名单访问管理中心网址,结果:能访问
# curl -x127.0.0.1:80 www.test.com/admin.php -I
  (2)其他的IP访问管理中心网址,结果:不能访问
# curl -x192.168.0.109:80 www.test.com/admin.php -I
  (3)其他的IP访问网址首页,结果:能访问
# 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,虽然百度能够正常搜索到网站,但是百度的搜索引擎爬虫抓不到网址的数据。
  配置虚拟主机文件:
# cd /usr/local/nginx/conf/vhosts/  # vim test.conf                  //添加以下
  if ($http_user_agent ~* 'baidu|youdao|1111')      //"~"后面紧跟"*"表示不区分大小写
  {
  return 403;
  }

  保存退出后,重新加载nginx
# /etc/init.d/nginx reload  测试下
  不含baidu、youdao、1111是通的:
# curl -A "qeasdrftgyhuj" -x192.168.0.109:80 www.test.com/forum.php -I
  含有baidu、youdao、1111则禁止访问:
# curl -A "qeasdrbaiduftgyhuj" -x192.168.0.109:80 www.test.com/forum.php -I
  9、nginx的代理功能
  我们不能访问Google,但可以在香港或者国外服务器上做个nginx代理,然后我们通过代理访问,不过前提是该服务器能够访问Google。同样的道理,有些地方不能访问百度,而我们可以访问,故我们用百度来做个nginx代理实验。
  首先查看下百度的真实的网站IP
# dig www.baidu.com   //若没有该命令,可以yum install -y bind*安装
  如下图可以看到两个IP:115.239.211.112和115.239.210.27
  下面我们新建虚拟主机
# cd /usr/local/nginx/conf/vhosts/  # vim proxy.conf
  server {
  listen 80;
  server_name www.baidu.com;
  location / {
  proxy_pass http://115.239.211.112/;
  }
  }
  保存退出后,重新加载nginx
# /etc/init.d/nginx>  测试下(把百度的IP解析到本机IP,然后再访问百度)
# curl -x127.0.0.1:80 www.baidu.com -I
  我们在上面测试出百度网站有两个真实的IP,下面我们就可以用多个IP解析到百度,实现负载均衡。
  修改虚拟主机配置文件
# 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;
  }
  }
  如图

  测试下
# curl -x127.0.0.1:80 www.baidu.com -I


页: [1]
查看完整版本: Nginx的基本配置