第十二章 LNMP架构(中)

一、默认虚拟主机
二、Nginx用户认证
三、Nginx域名重定向
四、Nginx访问日志
五、Nginx日志切割
六、静态文件不记录日志和过期时间
七、Nginx防盗链
八、Nginx访问控制
九、Nginx解析php相关配置
十、Nginx代理
十一、扩展

一、默认虚拟主机

默认虚拟主机一般是配置文件中的第一个虚拟主机。也可以通过在虚拟主机配置文件中设置default_server,指定为默认虚拟主机。

默认配置文件中只有一个虚拟主机,所以默认的虚拟主机就是该虚拟主机。

1.删除/usr/local/nginx/conf/nginx.conf文件中http{}配置里的server{} 
然后在http{}配置的最后添加一行:include vhost/*.conf

编辑后:

:nginx配置文件中,一条配置必须以分号 ; 结束,否则都视为一条配置;

2. 创建虚拟主机配置文件的存放目录vhost ,和虚拟主机配置文件

2.1 创建虚拟主机配置文件的存放目录vhost

[root@Linux01 ~]# mkdir /usr/local/nginx/conf/vhost
[root@Linux01 ~]# ls -dl /usr/local/nginx/conf/vhost/
drwxr-xr-x. 2 root root 6 12月 11 22:25 /usr/local/nginx/conf/vhost/

2.2 创建虚拟主机配置文件,并写入配置内容

注:一个server{} 就是一个虚拟主机;
可以在一个配置文件中写多个虚拟主机;
也可以给每一个虚拟主机创建单独的配置文件;
nginx的server_name与apache不同,nginx可以直接定义多个server_name;
当server_name后面带有default_server字段时,就代表这个虚拟主机就是默认虚拟主机;
否则跟apache相同,第一个虚拟主机为默认虚拟主机。


3. 检查配置文件是否有语法错误,重启nginx服务

4. 测试访问

在/data/wwwroot/目录下创建虚拟主机的根目录和一个测试页文件

访问:

没有定义过的server_name,只要是指定localhost的,都会指向到默认虚拟主机。说明默认虚拟主机指定成功。

二、Nginx用户认证

有时候为了安全需要,需要对用户的访问进行验证。

这里以aaa.com.conf为例

配置方式:

1.在server_name 是www.aaa.com的虚拟主机配置下面添加以下的配置

location / { auth_basic "Auth"; auth_basic_user_file /usr/local/nginx/conf/htpasswd; }

:auth_basic_user_file 的路径一定要填正确,否则报403错误

2. 生成用于验证的用户和密码 
这里也需要用到apache的htpasswd命令 
如果没有这个命令可以yum安装httpd可以了。

[root@Linux01 vhost]# yum install -y httpd

[root@Linux01 vhost]# htpasswd -c /usr/local/nginx/conf/htpasswd dwy

:htpasswd命令的-c选项,只有在第一次创建用户认证的密码文件时需要使用, ;如果再次添加用户和密码时使用了-c选项,则会覆盖掉之前的所有内容。

3. 检查语法错误,重载配置文件;测试访问

浏览器测试:

针对目录的用户认证:

①修改aaa.com.conf配置文件

:location匹配的目录不再是根目录,而是/admin/目录 ;这里的根目录指的是网站的根目录:/data/wwwroot/www.aaa.com/

检查语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

③测试访问

创建/data/wwwroot/www.aaa.com/admin目录,并在目录下创建一个索引页面文件

[root@Linux01 vhost]# mkdir /data/wwwroot/www.aaa.com/admin/

[root@Linux01 vhost]# echo "aaa.com admin test" > /data/wwwroot/www.aaa.com/admin/index.html

curl测试访问:

浏览器测试访问:

针对文件的用户认证:

①修改aaa.com.conf配置文件

检查语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

③测试访问

浏览器测试:

三、Nginx域名重定向
以aaa.com.conf中的www.aaa.com为例:
①添加多个域名,配置如下:

配置解释:
#域名重定向的配置
    if ($host != 'www.aaa.com' )

    {
        rewrite  ^/(.*)$  http://www.aaa.com/$1  permanent;
    }

在nginx配置文件中可以使用if判断;
这个配置的大概意思是当 $host 不是www.aaa.com的时候;
执行rewrite 将域名重定向到http://www.aaa.com;
$host就是访问请求的域名,也就是server_name;
^/(.*)$  这个可以匹配出域名后面的URL地址;
$1 就是调用前面(.*)匹配到的URI,类似sed 这样就可以进行更精确的重定向了;
最后的 permanent 表示的是永久重定向 状态码为 301;
如果改为 redirect 表示临时重定向,状态码302。

检查语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

③测试

四、Nginx访问日志

1.Nginx默认的日志格式在nginx.conf里面配置。

[root@Linux01 vhost]# vim /usr/local/nginx/conf/nginx.conf
搜索log_format

注:可以自行调整各个变量的位置
#他们分别代表的含义如下:
log_format              #定义日志格式的函数
combined_realip         #定义日志格式名称,可随意设定
常见日志字段说明:

$remote_addr

客户端IP(公网IP)

$http_x_forwarded_for

代理服务器的IP

$time_local

服务器本地时间

$host

访问主机名(域名)

$request_uri

访问的url地址

$status

状态码

$http_referer

referer

$http_user_agent

user_agent

2. 除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中增加配置行

以aaa.com.conf的www.aaa.com为例:

//引用主配置文件中的combined_realip日志格式

配置文件的内容最后一行内容就是定义虚拟主机的访问日志:

access_log                             #定义访问日志功能

/tmp/access_aaa.com.log      #定义访问日志文件的存放路径

combined_realip                    #指定nginx.conf文件中定义的日志格式名称

3. 测试语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

4. 访问测试日志记录

五、Nginx日志切割

nginx没有自带的日志切割工具,产生的访问日志文件一直就是一个,不会自动进行切割,如果访问量很大的话,将会导致日志文件容易非常大,不便于管理。可以使用shell脚本结合crontab命令非常方便的进行切割。

1.自定义日志切割脚本

脚本内容如下,一般脚本都放在/usr/local/sbin/目录下:

[root@Linux01 vhost]# vim /usr/local/sbin/nginx_log_rotate.sh

#! /bin/bash
d=`date -d "-1 day" +%Y%m%d` 
logdir="/tmp"                         //nginx的日志存放路径
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
    mv $log $log-$d
    find -mtime +30 -type f -name "*.log" -exec rm -f {} \;
done
/bin/kill -HUP `cat $nginx_pid`

2. 脚本测试

[root@Linux01 vhost]# sh -x /usr/local/sbin/nginx_log_rotate.sh 

3. 任务计划

编写完日志切割脚本后,使用crontab -e添加一条任务计划 
每天0点0分执行这个日志切割脚本.

[root@Linux01 vhost]# crontab -e

no crontab for root - using an empty one(可删除)

0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

[root@Linux01 vhost]# crontab -l       //检查

0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh

六、静态文件不记录日志和过期时间

有些静态文件的访问没有必要记录到日志访问记录里。这可以通过修改配置文件来排除相应的记录。

配置方式:

1. 编辑虚拟主机配置文件, 在虚拟主机www.aaa.com的配置中添加以下内容

 location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$       ////匹配以“.”+“gif或jpg或jpeg或png”结尾的访问
        {
              expires      7d;                                  ////设定文件缓存到浏览器的过期时间
              access_log off;                                ////关闭日志记录
        }
    location ~ .*\.(js|css)$                                ////匹配以“.”+“js或css”结尾的访问
        {
              expires      12h;
              access_log off;
        }

2. 测试语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

3. 访问测试

在/data/wwwroot/www.aaa.com/目录下创建两个相关的测试文件

[root@Linux01 vhost]# echo 'dwy2018' > /data/wwwroot/www.aaa.com/test.jpg
[root@Linux01 vhost]# echo 'dwy201820182018' > /data/wwwroot/www.aaa.com/test.js

查看日志:只记录了网页访问信息,没有记录.jpg和.js的访问记录

七、Nginx防盗链

防盗链可以和静态文件结合起来配置。 需要修改前面添加的静态文件的配置。

配置方式:

1. 修改aaa.com.conf文件的内容:

防盗链配置解释:

valid_referers          配置referer白名单
none                       代表没有referer
blocked                  代表有referer但是被防火墙或者是代理给去除了
server_names        代表这个虚拟主机的所有server_name
*.aaa.com              #这个可以是正则匹配的字段, 或者指定的域名

当访问请求不包含在白名单里面时:
invalid_referer的值为 1 ,就会执行if语句,

当访问请求包含在白名单里面时,
invalid_referer的值为 0 就不会执行 if 语句。

2. 测试语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

3. 测试

八、Nginx访问控制

nginx可以针对目录的访问进行控制(以www.aaa.com的admin目录为例)

需求:访问/admin/目录的请求,只允许某几个IP访问,

在虚拟主机www.aaa.com的配置里添加如下内容:

location /admin/

{ allow 127.0.0.1;                                      #规则,允许ip 127.0.0.1访问,这里的ip就是访问日志里的$remote_addr

allow 192.168.239.128;

deny all; }                                               #规则,拒绝所有

注:也可以配置为allow all;然后deny某些ip

与Apache不同,匹配规则是从上往下匹配,当匹配到一个规则就不再往下匹配了,没有order

[root@Linux01 vhost]# vim aaa.com.conf 

2. 测试语法错误,重载配置文件

[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful
[root@Linux01 vhost]# /usr/local/nginx/sbin/nginx -s reload

3. 测试

在配置文件中,移除192.168.239.128这个IP

[root@Linux01 vhost]# cat /tmp/access_aaa.com.log    查看日志

nginx也可以通过正则表达式,对某些类型的文件访问进行控制(以php文件为例)

①在虚拟主机www.aaa.com的配置里添加如下内容:

location ~ .*admin/.*\.php$           //这样可以拒绝所有admin目录下以.php结尾文件的访问请求

{ deny all; }

②重载

③测试

此外,nginx也可以根据user_agent限制(以限制Spider/3.0、YoudaoBot、Tomato为例)

①在虚拟主机www.aaa.com的配置里添加如下内容:

if ($http_user_agent ~ 'Spider/3.0|YoudaoBot|Tomato')     #如此可以拒绝所有user_agent为Spider/3.0、YoudaoBot、Tomato的访问请求。并且区分大小写;也可以用 ~* 不区分大小写
{
    return 403;                                                                  #deny all和return 403效果一样
}

②重载、测试

③查看日志:在被禁止的列表中的user_agent,无法访问;不在列表中的可以访问。

九、Nginx解析php相关配置

之前配置的虚拟主机还没有办法进行PHP的解析。需要对配置文件进行修改。

1.在虚拟主机www.aaa.com 的配置最后面的access_log前一行添加下面的内容:

 location ~ \.php$                   //location匹配所有document_uri以 .php 结尾的访问请求
        {
            include fastcgi_params;      //引用fastcgi_params常量文件
            fastcgi_pass unix:/tmp/php-fcgi.sock;      //指定PHP的sock文件路径; #如果php-fpm.conf配置listen是ip:port,这里也需要配置为相同的ip:port ;这里配置错误会出现502报错
            fastcgi_index index.php;      //指定php的索引页
            fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.aaa.com$fastcgi_script_name;   //指定PHP程序的请求路径, $ 符号前面的路径需要和虚拟主机的root路径相同 ;这个路径有问题会出现404报错
        }  

2. 创建测试的php文件 

[root@Linux01 www.aaa.com]# vim test.php

<?php
echo "test php 解析";

重载前:(访问到的是源代码,说明没有解析。用浏览器访问,会把源代码下载下来

重载、测试:(可以正常解析php文件

注意:不能解析php时,可以访问,返回状态码也是200,只是访问到的源代码;

php配置常见问题参考http://note.youdao.com/noteshare?id=140300f1be859e0561bad1795456eb82&sub=0FA2CAAE1D4940AA89F3642058AD784E

配置php-fpm监听 ip:port

fastcgi_pass 用来指定php-fpm监听的地址或者socket

1. 修改/usr/local/php-fpm/etc/php-fpm.conf配置文件:

将listen = /tmp/php-fcgi.sock 修改为 listen = 127.0.0.1:9000 ,这里的ip需要根据自己的环境来填写

2. 再修改aaa.com.conf中虚拟主机www.aaa.com的配置

将fastcgi_pass unix:/tmp/php-fcgi.sock; 修改为fastcgi_pass 127.0.0.1:9000;

虚拟主机配置文件里的配置要与php-fpm中的配置一样才行。

十、Nginx代理

代理服务服务器实现。

1. 配置代理服务器之前的测试

2. 配置代理服务器

①这里我们先用ping命令查看一下baidu.com的ip地址

②在/usr/local/nginx/conf/vhost/目录下添加一个配置文件 proxy.conf,并添加以下内容写入代理服务器的配置

server
{
    listen 80;
    server_name www.baidu.com;         #这里写代理服务器的域名

    location /
    {
        proxy_pass      http://115.239.210.27/;  #这里的IP写web服务器的ip
        proxy_set_header Host   $host;          #设定header信息的Host变量
        proxy_set_header X-Real-IP      $remote_addr;  #设定header信息的remote_addr变量
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; #设定header信息的X-Forwarded-For变量
    }
}

③重载、测试

十一、扩展

nginx.conf 配置详解 :
https://coding.net/u/aminglinux/p/nginx/git/tree/master/3z
nginx rewrite四种flag :
http://unixman.blog.51cto.com/10163040/1711943
https://coding.net/u/aminglinux/p/nginx/git/blob/master/rewrite/break.md
502问题汇总 :http://ask.apelearn.com/question/9109
location优先级 :https://coding.net/u/aminglinux/p/nginx/git/blob/master/location/priority.md

猜你喜欢

转载自blog.csdn.net/dwy2018/article/details/84949136
今日推荐