LNMP(二)Nginx默认虚拟主机、用户认证、域名重定向、访问日志、日志切割、防盗链、访问控制、静态文件不记录日志和过期时间、Nginx解析php相关配置、Nginx代理...

本文深入探讨Nginx的高级配置技巧,包括虚拟主机、用户认证、域名重定向、日志管理、静态资源优化、防盗链、访问控制、PHP解析及代理设置,旨在帮助系统管理员和开发者提升Nginx服务器的性能与安全性。

任务列表:
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代理

扩展
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.html

5.15笔记

LAMP 以模块的形式存在

LNMP 以服务的形式

市场占有率https://w3techs.com/technologies/overview/web_server/all        https://news.netcraft.com/archives/2018

正向代理\反向代理https://coding.net/u/aminglinux/p/nginx/git

为什么基于事件驱动的服务器能实现高并发?https://github.com/aminglinux/nginx/blob/master/4z/IO.md

 

 

 

 

一、默认虚拟主机

在Nginx中也有默认虚拟主机,跟httpd类似,第一个被Nginx加载的虚拟主机就是默认主机,但和httpd不相同的地方是,它还有一个配置用来标记默认虚拟主机,也就是说,如果没有这个标记,第一个虚拟主机为默认虚拟主机。

编辑nginx.conf主配置文件

vim /usr/local/nginx/conf/nginx.conf

插入 include vhost/*.conf; 

b07c98cd2a105c9a39d038bfc71dc0b7ac4.jpg

创建vhost目录,并新建aaa.com.conf默认虚拟主机配置内容

vhost目录:在conf目录下创建一个vhost子目录

 

c14c66b7db1bb160b994808a43aa175c330.jpg

创建vhost目录,并新建aaa.com.conf默认虚拟主机配置内容

67ba9b4103f02cf41e26b692b9edf898102.jpg

创建默认的网站目录,建立index.html文件,写入一些内容

7a54eb2f32185dc8179c3221910d373e08a.jpg

检测语法,重新加载配置文件;测试相关网站;任意的域名,都会指向默认主机的网站名

/usr/local/nginx/sbin/nginx -t  检测语法

/usr/local/nginx/sbin/nginx -s reload   重新加载

不管访问什么域名,只要解析过来,指向到服务器,都能访问到aaa.com这个站点,即默认的虚拟主机

06d1b4360523d738b033b3f8d62b84463ed.jpg

如何去定义一个默认虚拟主机
1.放在第一个位置,如何区分第一个位置:做一个vhost:可以把第一个的名字改为00.conf,以名字区分

3efdc101d76e90f7e621dccf7ea19c7661a.jpg
2.加上特殊的标记为default_server

46f7c842a6b8fcd6397977821520a938fa1.jpg

也可以在nginx.conf中最后一行加include vhost/*.conf;就是包含了默认主机的配置,也可以把默认主机配置内容放置到下面,效果是一样的;

e4ba7928ffca3f93064c834e6e54ae6bf6c.jpg

二、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;   用户名密码文件

3be0daa7c4478a35563f60c98948d17f1ff.jpg

创建用户;
由于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     此时有两个密码文件生成

b34bfecfdf089a8d1d0ff2dc819ade9edf7.jpg

测试前需要检查语法错误,以及重新加载配置文件

 /usr/local/nginx/sbin/nginx -t

 /usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com        出现401码,需要用户认证

3bcbbfff7fa08973a347679f2b4f3b00de5.jpg

用户认证测试主机

25a4500609b6164577e8268454cbd3e760a.jpg

有时候我们需要对某个访问目录或者页面进行认证,而不是全站。所以我们需要对配置文件进行更改:

针对目录:

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

fdc11d37e0322bb71c5e81abaa878958857.jpg

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/  加上用户正常访问

0811ccd14f70c6883992457a325aa89b56d.jpg

针对某个请求的url做认证

95679250ea3ef50e7b2d451de26f5aa12b5.jpg

/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  此时需要用户认证

c5b553b5eee0c09fbafd6c2c4406c154c5d.jpg

location /:针对整个目录做认证
    也可以针对某一个目录或url做认证,比如:
    location /admin/:针对admin目录做认证
    location ~ admin.php:针对某个请求的url做认证
auth_basic_user_file:用户认证文件

三、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

c9cfd68de6a6d1cd25ef3ba8d732eae93c7.jpg

/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

e06a4e9db86eace380bc4512bdc8b0945bb.jpg

四、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

红框中的名称可以修改成任意名称,可以自定义

58835572cb578b0a9547a4138ef379b9df7.jpg

除了在主配置文件nginx.conf里定义日志格式外,还需要在虚拟主机配置文件中增加  access_log /tmp/test.com.log tobe;

vim /usr/local/nginx/conf/vhost/test.com.conf

071014c9ab3e422af787690fd069a8e25e7.jpg

检测、加载配置后,进行测试;

 /usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

6597ab5f2ecdb88aef41ce4edafad62dc65.jpg

 cat /tmp/test.com.log   查看日志

1ac910e7b826d59a3827ecaf733887397ed.jpg

五、Nginx日志切割

由于Nginx不像Apache有自己的切割工具,因此我们需要写个脚本完成需求

脚本放到/usr/local/sbin/目录下,写入如下内容

#! /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`

2db9669cc45df76f66e48e8b1269f99b9f6.jpg

脚本语句解释:

 date -d "-1 day" +%Y%m%d    生成昨天的日期

21397a11557cb5c1571fa9f41bfd4f0324b.jpg

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查看执行过程

f23f10e0f793de22c0f1be2df10f22f944d.jpg

查看生成的test.com日志

5951bf3d34c1744188b137dfb24cb275f82.jpg

日志清理

删除超过一个月的日志(也可以写在脚本里面)

find /tmp/ -name *.log-* -type f -mtime +30 |xargs rm

创建执行脚本的计划:比如:每天0时0分进行切割

crontab -e

0 0 * * * /bin/bash /usr/local/sbin/nginx_logrotate.sh            每天的0时0分执行此脚本

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

虚拟主机配置文件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;

}

226615bb10ede47fd15eebd1aba197954d3.jpg

/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

a54ba51077d113a80b16fea8db22767c5ee.jpg

通过expires设置过期时间,过期时间如下图

fe21a4bc2e2c7f12d1fa08be868a382201d.jpg

七、Nginx防盗链

编辑配置文件vim /usr/local/nginx/conf/vhost/test.com.conf

527f45e6e9352578268caa35cebd6b34401.jpg

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;
}

8967833ab2a02e7201daac33e594e6302a9.jpg

检查语句,并加载配置文件,进行测试,针对有效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,正常

9c40663e8ea55f2ec277bda5f10272b30ec.jpg

八、Nginx访问控制

1. 针对某个目录设置

需求:访问/admin/目录的请求,只允许某几个IP访问,需要将某些页面加密处理,配置如下:

location /admin/
{
    allow 127.0.0.1;
    allow 192.168.83.3;
    deny all;
}

d2880941054589b113164215a2b83f03c6e.jpg

测试,通过允许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主机都能连接到

 

569c69922fe571d4fc7398c76cfbd746916.jpg

 把allow 192.168.83.3注释,在访问,报错403

9611dbb8f214b29a855baac5bb5eb2101d2.jpg

3fd43979dae7523448e81b125281be86633.jpg

2. 匹配正则,根据正则去控制

主要是为了防止上传php文件,以免造成木马文件,影响安全;

把能上传文件的目录禁掉解析php,只要匹配upload,以php结尾的都禁掉

 vim /usr/local/nginx/conf/vhost/test.com.conf

location ~ .*(upload|image)/.*\.php$    //匹配.php文件
{
deny all;        //禁止全部
}

19b80729ac224968d552658b4bf0e8e2693.jpg

测试:在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

bc4a1cc2aa0324edbefcaf5f507641f5c4b.jpg

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;

}

5fc375d4aa6bdf7ec08ffd2959d960e4c2d.jpg

检查语句,并加载配置文件

/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个外,任意指定,可以访问

c6e71b5688e7ee906e8c5e6cd2df72cdad6.jpg

0889b9f0396d39812b3f188b026c052beef.jpg

九、Nginx解析php相关配置

先创建一个3.php文件进行测试

vim /data/wwwroot/test.com/3.php

写入 
<?php

phpinfo();

curl -x127.0.0.1:80 test.com/3.php   此时不能解析

a942030bd053df0acebd28e6cf0555c658b.jpg

修改配置文件   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;
    }

3a772d435a4332c1d488e7901bce88107f5.jpg

检查语句,并加载配置文件

/usr/local/nginx/sbin/nginx -t

/usr/local/nginx/sbin/nginx -s reload

curl -x127.0.0.1:80 test.com/3.php  可以正常解析

a923904532ebcb5ac9dff191685631e9f10.jpg

解析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;

babf609063b97a2139ce43ee4204c85bc45.jpg

还有一个地方要注意fastcgi_param SCRIPT_FILENAME 后面跟的路径为该站点的根目录,和前面定义的root那个路径保持一致,如果这里配置不对,访问PHP页面会出现404;还有一种502的现象,如果内存中出现大量的php-fpm进程占据了内存,也会同样导致此问题

7fb0dcba7781f32fc17c7e5249871d7670c.jpg

十、Nginx代理

原理:Nginx代理是一种反向代理。反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器;并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。

3eac5cea2ab9051688006f835eca8000e4e.jpg

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

796e82e65420549159c8e4051325298c57f.jpg

检查语句,并加载配置文件 

/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

866a63e2c2883be9475e992f7bc7f67ae3d.jpg

转载于:https://my.oschina.net/u/4093217/blog/3049573

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值