任务列表:
12.7 默认虚拟主机
12.8 Nginx用户认证
12.9 Nginx域名重定向
12.10 Nginx访问日志
12.11 Nginx日志切割
12.12 静态文件不记录日志和过期时间
12.13 Nginx防盗链
12.14 Nginx访问控制
12.15 Nginx解析php相关配置
12.16 Nginx代理
扩展
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
预习笔记
Nginx虚拟主机
在Nginx中也有默认虚拟主机,跟httpd类似,但和httpd不相同的地方是,它可以在配置中标记默认虚拟主机,如果没有这个标记,第一个被Nginx加载的虚拟主机就是默认主机。
编辑nginx.conf主配置文件
vim /usr/local/nginx/conf/nginx.conf
在配置中增加 include vhost/*.conf;
创建vhost目录,并新建aaa.com.conf默认虚拟主机配置内容
mkdir /usr/local/nginx/conf/vhost
aaa.com.conf 配置文件内容如下
server
{
listen 80 default_server; //default_server标记该配置为默认虚拟主机服务
server_name aaa.com;//指定主机名 aaa.com
index index.html index.htm index.php; //指定索引页
root /data/wwwroot/default; //指定虚拟主机网站目录
}
创建网站目录
mkdir -p /data/wwwroot/default
创建index.html文件并写入内容
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试
指定任何域名都会指向默认虚拟主机
Nginx用户认证
创建新的虚拟主机配置并写入以下内容
vim /usr/local/nginx/conf/vhost/test.com.conf
server
{
listen 80;
server_name test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
location /
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
由于nginx没有自带创建密码文件的工具,因此需要借助httpd工具;假如没有,使用yum install -y httpd安装
创建密码文件
htpasswd -c /usr/local/nginx/conf/htpasswd test
第一创建时需要加-c选项,增加新的用户名不需要加-c,如果加了,将会覆盖之前创建的文件。
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试
对目录或者页面进行访问认证,对配置文件进行更改:
server
{
listen 80;
server_name test.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
location /admin/ //设定访问/admin/目录需要认证
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试
总结:
location /:针对整个目录做认证
也可以针对某一个目录或url做认证,比如:
location /admin/:针对admin目录做认证
location ~ admin.php:针对url做认证
auth_basic_user_file:定义用户认证文件
Nginx域名重定向
当我们站点有多个域名的时候,权重降低了,但是之前的域名已经被一部分人所依赖了,也不可能去通知大家新的站点,所以我们就会选择一个主域名其它的直接跳到主域名!
将以下内容写入虚拟主机配置文件中
vim /usr/local/nginx/conf/vhost/test.com.conf
server
{
listen 80;
server_name test.com test2.com test3.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com') {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
}
permanent:永久跳转,状态码为301
redirect:临时跳转,状态码为302
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试,使用配置中写入的域名,跳转成功
Nginx日志
在nginx主配置文件定义日志的,其中combined_realip为日志格式的名称
vim /usr/local/nginx/conf/nginx.conf
配置文件中 combined_realip为日志格式的名称,我们把它改个名字,定义为test
释义
$remote_addr 客户端ip(公网ip)
$http_x_forwarded_for 代理服务器的ip
$time_local 服务器本地时间
$host 访问主机名(域名)
$request_uri 访问的url地址
$status 状态码
$http_referer referer
$http_user_agent user_agent
修改虚拟主机配置文件,定义日志目录和格式、名称;
server
{
listen 80;
server_name test.com test2.com test3.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com') {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
access_log /tmp/test.com.log test; //定义日志格式 和目录
}
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
查看日志文件
Nginx日志切割
由于Nginx没有自带的日志切割工具,因此我们需要通过脚本来完成需求
编辑脚本 vim /usr/local/sbin/nginx_logrotate.sh
内容如下
#! /bin/bash
d=`date -d "-1 day" +%Y%m%d` //生成昨天的日期
logdir="/tmp/" //指明日志存放的位置
nginx_pid="/usr/local/nginx/logs/nginx.pid" //将nginx的pid值赋予给nginx_pid
cd $logdir //进入日志所在目录
for log in `ls *.log` for //使用for循环,将 .log结尾文件改名
do
mv $log $log-$ddone
/bin/kill -HUP `cat $nginx_pid` //重启服务,并生成新的日志文件
测试脚本
sh -x /usr/local/sbin/nginx_logrotate.sh
日志清理
也可以在脚本中加入这样一条,自动清理日志
find /tmp/ -name .log- -type f -mtime +30 |xargs rm
创建定时任务,定时进行日志切割
crontab -e
静态文件不记录日志和过期时间
虚拟主机配置文件location~可以指定对应的静态文件,expires配置过期时间,而access_log 配置为off就可以不记录访问日志了
server
{
listen 80;
server_name test.com test2.com test3.com;
index index.html index.htm index.php;
root /data/wwwroot/test.com;
if ($host != 'test.com') {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ //匹配.gif等格式的静态文件不计入日志
{
expires 7d; //有效期7天
access_log off; //不记录日志
}
location ~ .*\.(js|css)$ //匹配js或者css文件
{
expires 12h; //有效期12小时
access_log off;
}
access_log /tmp/test.com.log ying;
}
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试,访问jpg和css都没有被记录,其他格式的记录成功
缓存保留时间也与配置中一致
Nginx防盗链
在虚拟主机配置中写入以下代码
location ~* ^.*(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$
{
expires 7d;
valid_referers none blocked server_names *.test.com;
if ($invalid_referer)
{
return 403;
}
access_log off;
}
~* 表示不区分大小写
valid_referers none blocked server_names *.test.com; //定义白名单
不匹配白名单的,定义返回403
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试,白名单refer访问成功,其他refer提示403错误
Nginx访问控制
需求:某些目录只允许某些IP可以访问
在虚拟主机配置中写入以下内容
location /admin/ //在admin目录下操作
{
#allow 127.0.0.1;
allow 192.168.190.103;
deny all;
}
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试,被允许的IP可以正常访问
针对目录下的某类文件
这里主要是为了防止上传php文件,以免造成木马文件,影响安全
在虚拟主机配置文件中写入以下内容
location ~ .*(upload|image)/.*\.php$
{
deny all;
}
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试,访问php被拒绝,访问txt允许
根据user-agent限制
禁止相关的user-agent,访问网站;
if ($http_user_agent ~ ‘Spider/3.0|YoudaoBot|Tomato’)
{
return 403;
}
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试,curl -A “AAAAA” 指定user-agent
Nginx解析php的配置
创建一个php文件
vim /data/wwwroot/test.com/index.php
在虚拟主机配置增加PHP解析的配置
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
# fastcgi_pass 127.0.0.1:9000
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
}
其中fastcgi_pass用来指定php-fpm的地址,如果php-fpm监听的是一个tcp:port的地址(比如127.0.0.1:9000),那么也需要在这里改成fastcgi_pass 127.0.0.1:9000。这个地址一定要和php-fpm服务监听的地址匹配,否是会报502错误.还有一个地方要注意fastcgi_param SCRIPT_FILENAME 后面跟的路径为该站点的根目录,和前面定义的root那个路径保持一致,如果这里配置不对,访问PHP页面会出现404;还有一种502的现象,如果内存中出现大量的php-fpm进程占据了内存,也会同样导致此问题!
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
Nginx代理
Nginx代理是一种反向代理。反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
假如这家公司有很多台服务器,为了节省成本,不能为所有的服务器都分配公网IP,而如果一个没有公网的IP的复为其要提供web服务,就可以通过代理来实现
在虚拟主机配置文件中新建一个配置文件
vim proxy.conf
在配置中写入一下内容
server
{
listen 80;
server_name ask.apelearn.com;
location /
{
proxy_pass http://47.104.7.242/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
因为是代理服务器所以不需要访问本地服务器的任何文件,ask.apelearn.com; 定义一个域名;
proxy_pass http://47.104.7.242/;真实WEB服务器的IP地址。
$host;就是server_name
/usr/local/nginx/sbin/nginx -t 检查配置文件语法是否正确
/usr/local/nginx/sbin/nginx -s reload 重新加载配置文件
测试