任务列表:
12.7 Nginx默认虚拟主机
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代理php
扩展
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访问日志+日志切割+静态文件不记录和过时时间设置:https://www.okay686.cn/524.htmlcss
5.15笔记html
LAMP 以模块的形式存在linux
LNMP 以服务的形式nginx
市场占有率https://w3techs.com/technologies/overview/web_server/all https://news.netcraft.com/archives/2018git
正向代理\反向代理https://coding.net/u/aminglinux/p/nginx/gitgithub
为何基于事件驱动的服务器能实现高并发?https://github.com/aminglinux/nginx/blob/master/4z/IO.mdweb
1、默认虚拟主机apache
在Nginx中也有默认虚拟主机,跟httpd相似,第一个被Nginx加载的虚拟主机就是默认主机,但和httpd不相同的地方是,它还有一个配置用来标记默认虚拟主机,也就是说,若是没有这个标记,第一个虚拟主机为默认虚拟主机。vim
编辑nginx.conf主配置文件
vim /usr/local/nginx/conf/nginx.conf
在配置文件中httpd段插入 include vhost/*.conf; 把默认的虚拟主机删除
建立vhost目录,并新建aaa.com.conf默认虚拟主机配置内容
vhost目录:在conf目录下建立一个vhost子目录
建立vhost目录,并新建aaa.com.conf默认虚拟主机配置内容
server { listen 80 default_server; default_server默认虚拟主机 server_name aaa.com; index index.html index.htm index.php; root /data/wwwroot/default; location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwroot/default$fastcgi_script_name; 注意此处default与上面一致 } }
建立默认虚拟主机的网站目录/data/wwwroot/default,创建index.html文件,写入一些内容
检测语法,从新加载配置文件;测试相关网站;任意的域名,都会指向默认主机的网站名
/usr/local/nginx/sbin/nginx -t 检测语法
/usr/local/nginx/sbin/nginx -s reload 从新加载
无论访问什么域名,只要解析过来,指向到服务器,都能访问到aaa.com这个站点,即默认的虚拟主机
如何去定义一个默认虚拟主机
1.放在第一个位置,如何区分第一个位置:作一个vhost:能够把第一个的名字改成00.conf,以名字区分
2.加上特殊的标记为default_server
也能够在nginx.conf中最后一行加include vhost/*.conf;就是包含了默认主机的配置,也能够把默认主机配置内容放置到下面,效果是同样的;
2、Nginx用户认证
建立虚拟主机:test.com.conf
cd /usr/local/nginx/conf/vhost/
vim test.com.conf
auth_basic "Auth"; 定义用户认证的名字
auth_basic_user_file /usr/local/nginx/conf/htpasswd; 用户名密码文件
location /:针对整个目录作认证 也能够针对某一个目录或url作认证,好比: location /admin/:针对admin目录作认证 location ~ admin.php:针对某个请求的url作认证 auth_basic_user_file:用户认证文件路径
## 添加如下内容,要记得添加在 location ~ \.php$ 上面 location ~ admin.php { auth_basic "Auth"; auth_basic_user_file /usr/local/nginx/conf/htpasswd; # 密码文件路径 }
建立用户;
因为nginx没有自带建立用户的工具,所以须要借助httpd工具:htpasswd;假如没有,则用此命令 yum install -y httpd;由于本机已经安装,所以直接执行
/usr/local/apache2.4/bin/htpasswd -c /usr/local/nginx/conf/htpasswd tobe1 建立用户tobe1, -c会覆盖以前建立的用户文件 /usr/local/apache2.4/bin/htpasswd /usr/local/nginx/conf/htpasswd tobe2 建立第二个用户,不加-c cat /usr/local/nginx/conf/htpasswd 此时有两个密码文件生成
测试前须要检查语法错误,以及从新加载配置文件
/usr/local/nginx/sbin/nginx -t /usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test.com 出现401码,须要用户认证
用户认证测试主机
有时候咱们须要对某个访问目录或者页面进行认证,而不是全站。因此咱们须要对配置文件进行更改:
针对目录:
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test.com 此时正常访问
curl -x127.0.0.1:80 test.com/admin/ 访问admin报错401
建立admin目录,并在目录下建立index.html,写入内容
curl -utobe1:tobe -x127.0.0.1:80 test.com/admin/ 加上用户正常访问
针对某个请求的url作认证
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test.com/admin/ 此时不须要用户认证
curl -x127.0.0.1:80 test.com/admin.php 此时须要用户认证
3、Nginx域名重定向
在Nginx配置中,server_name后面能够跟多个域名,permanent为永久重定向,至关于httpd的R=301.另外还有一个经常使用的redirect,至关于httpd的R=302。
cd /usr/local/nginx/conf/vhost/
vim test.com.conf
test.com为主域名,当访问test2.com和test3.com时,跳转到test.com使用rewrite实现,
if ($host != 'test.com' ) { 若是域名不是test.com
rewrite ^/(.*)$ http://test.com/$1 permanent; 跳转到test.com,$1表明^/(.*)$
}
permanent:永久跳转,也就是301
redirect:临时跳转,302
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test2.com/index.html -I 访问test2.com会重定向到test.com
curl -x127.0.0.1:80 test2.com/admin/index.html -I 也会重定向到test.com
curl -x127.0.0.1:80 test4.com/admin/index.html -I
curl -x127.0.0.1:80 test4.com/admin/index.html -I 返回404,会重定向到默认虚拟主机aaa.com.conf
4、Nginx访问日志
名词 |
释义 |
$remote_addr |
客户端ip(公网ip) |
$http_x_forwarded_for |
代理服务器的ip |
$time_local |
服务器本地时间 |
$host |
访问主机名(域名) |
$request_uri |
访问的url地址 |
$status |
状态码 |
$http_referer |
referer |
$http_user_agent |
user_agent |
日志格式:
在nginx主配置文件定义日志的,其中combined_realip为日志的名称,这个名称能够自定义,好比这里自定义为tobe
vim /usr/local/nginx/conf/nginx.conf //搜索log_format
红框中的名称能够修改为任意名称,能够自定义
除了在主配置文件nginx.conf里定义日志格式外,还须要在虚拟主机配置文件中增长 access_log /tmp/test.com.log tobe;
vim /usr/local/nginx/conf/vhost/test.com.conf
检测、加载配置后,进行测试;
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
cat /tmp/test.com.log 查看日志
5、Nginx日志切割
因为Nginx不像Apache有本身的切割工具,所以咱们须要写个脚本完成需求
脚本放到/usr/local/sbin/目录下,写入以下内容
vim /usr/local/sbin/nginx_log_rotate.sh
#! /bin/bash d=`date -d "-1 day" +%Y%m%d` logdir="/tmp/" ## 假设nginx的日志存放路径为/tmp/ nginx_pid="/usr/local/nginx/logs/nginx.pid" cd $logdir for log in `ls *.log` do mv $log $log-$d done /bin/kill -HUP `cat $nginx_pid`
脚本语句解释:
date -d "-1 day" +%Y%m%d 生成昨天的日期
nginx_pid=”/usr/local/nginx/logs/nginx.pid”; 是为了最后一行而设定的。
/bin/kill -HUP cat $nginx_pid
最后一行的意思和以前使用的 -s reload 是一个意思 重载nginx.pid,而后就会再次生成一个新的日志文件。不然不生成日志文件
for循环,把ls列举的log文件,以日期格式重命名
for log in `ls *.log` do mv $log $log-$d done /bin/kill -HUP `cat $nginx_pid`
sh -x 执行脚本 -x查看执行过程
查看生成的test.com日志
日志清理
删除超过一个月的日志(也能够写在脚本里面),志只保留一个月,还须要往crontab里添加如下这一行,每月的1号就删除一次旧的日志文件
find /tmp/ -name *.log-* -type f -mtime +30 |xargs rm
* * 1 * * /usr/bin/find /usr/local/php-fpm/var/log/ -name *.log.* -type f -mtime +30 |xargs rm
建立执行脚本的计划:好比:天天0时0分进行切割
crontab -e
0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh 天天的0时0分执行此脚本
6、静态文件不记录日志和过时时间
虚拟主机配置文件location~能够指定对应的静态文件,expires配置过时时间,而access_log 配置为off就能够不记录访问日志了
配置文件
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; }
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
cd /data/wwwroot/test.com/ 在该目录下建立gif和css文件进行测试
访问1.gif、2.js、index.html只有index.html记录日志,gif和js结尾的不记录
curl -x127.0.0.1:80 test.com/1.gif
curl -x127.0.0.1:80 test.com/2.js
curl -x127.0.0.1:80 test.com/index.html
经过expires设置过时时间,过时时间以下图
7、Nginx防盗链
编辑配置文件vim /usr/local/nginx/conf/vhost/test.com.conf
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; //不符合,无效的引用者,则返回403; } access_log off; }
检查语句,并加载配置文件,进行测试,针对有效referer和无效referer的对比
curl -e "http://www.baidu.com/1.txt" -x127.0.0.1:80 test.com/1.gif -I 无效referer,返回403
curl -e "http://www.test.com/1.txt" -x127.0.0.1:80 test.com/1.gif -I 白名单的referer,正常
8、Nginx访问控制
1. 针对某个目录设置
需求:访问/admin/目录的请求,只容许某几个IP访问,须要将某些页面加密处理,配置以下:
location /admin/ { allow 127.0.0.1; allow 192.168.83.3; deny all; }
测试,经过容许192.168.83.3和禁止127.0.0.1来作实验,这两个IP主机都能链接到
编辑完成后,检查,加载
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test.com/admin/ -I
curl -x192.168.83.3:80 test.com/admin/ -I 两个IP主机都能链接到
把allow 192.168.83.3注释,在访问,报错403
2. 匹配正则,根据正则去控制
主要是为了防止上传php文件,以避免形成木马文件,影响安全;
把能上传文件的目录禁掉解析php,只要匹配upload,以php结尾的都禁掉
vim /usr/local/nginx/conf/vhost/test.com.conf
location ~ .*(upload|image)/.*\.php$ //匹配.php文件 { deny all; //禁止所有 }
测试:在upload目录下,分别建立1.txt和1.php文件,可以访问1.txt,不可以访问1.php;
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
mkdir /data/wwwroot/test.com/upload
echo "1111" > /data/wwwroot/test.com/upload/1.php
echo "2222" > /data/wwwroot/test.com/upload/1.txt
curl -x127.0.0.1:80 test.com/upload/1.php
curl -x127.0.0.1:80 test.com/upload/1.txt
3. 根据user-agent限制
不想被蜘蛛爬本身的网站,咱们彻底能够根据user-agent去禁止掉
禁止相关的user-agent,访问网站;
vim /usr/local/nginx/conf/vhost/test.com.conf 配置文件中加入以下配置:
if ($http_user_agent ~* 'Spider/3.0|YoudaoBot|Tomato') //$http_user_agent ~* (最后加的*忽略大小写) { return 403; }
检查语句,并加载配置文件
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
测试user_agent,不一样值的试验
curl -A "YoudaoBot" -x127.0.0.1:80 test.com/upload/1.txt -I user_agent为YoudaoBot,禁止访问
curl -A "Tomato" -x127.0.0.1:80 test.com/upload/1.txt -I user_agent为Tomato,禁止访问
curl -A "baidu.com" -x127.0.0.1:80 test.com/upload/1.txt -I user_agent为除设置的3个外,任意指定,能够访问
9、Nginx解析php相关配置
先建立一个3.php文件进行测试
vim /data/wwwroot/test.com/3.php
写入 <?php phpinfo();
curl -x127.0.0.1:80 test.com/3.php 此时不能解析
修改配置文件 vim /usr/local/nginx/conf/vhost/test.com.conf
加入以下内容
location ~ \.php$ { include fastcgi_params; fastcgi_pass unix:/tmp/php-fcgi.sock; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name; }
检查语句,并加载配置文件
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
curl -x127.0.0.1:80 test.com/3.php 能够正常解析
解析php代码释义:
其中fastcgi_pass用来指定php-fpm的地址,若是php-fpm监听的是一个tcp:port的地址(好比127.0.0.1:9000),那么也须要在这里改为fastcgi_pass 127.0.0.1:9000。这个地址必定要和php-fpm服务监听的地址匹配,不然会报502错误.
cat /usr/local/php-fpm/etc/php-fpm.conf php配置中的listen = /tmp/php-fcgi.sock是/tmp/php-fcgi.sock, fastcgi_pass 也要是fastcgi_pass unix:/tmp/php-fcgi.sock;
还有一个地方要注意fastcgi_param SCRIPT_FILENAME 后面跟的路径为该站点的根目录,和前面定义的root那个路径保持一致,若是这里配置不对,访问PHP页面会出现404;还有一种502的现象,若是内存中出现大量的php-fpm进程占据了内存,也会一样致使此问题
10、Nginx代理
原理:Nginx代理是一种反向代理。反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的链接请求,而后将请求转发给内部网络上的服务器;并将从服务器上获得的结果返回给Internet上请求链接的客户端,此时代理服务器对外就表现为一个服务器。
cd /usr/local/nginx/conf/vhost 改目录下,建立proxy.conf配置文件,写入如下配置:
server { listen 80; server_name ask.apelearn.com; location / { proxy_pass http://223.94.95.10/; 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://223.94.95.10/;真实WEB服务器的IP地址,要确保被代理的ip能访问 $host; 也就是我们的server_name
检查语句,并加载配置文件
/usr/local/nginx/sbin/nginx -t
/usr/local/nginx/sbin/nginx -s reload
开始测试:127.0.0.1就是本身的代理机,访问论坛
curl -x127.0.0.1:80 ask.apelearn.com -I
curl ask.apelearn.com/robots.txt 测试网站的robots