一、默认虚拟主机
二、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
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中的配置一样才行。
代理服务服务器实现。
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