Linux基础——Web(二)Nginx

Nginx部署

1.

上传nginx安装包

2.

[root@centos ~]# yum -y install pcre-devel openssl-devel

//安装支持包

3.

[root@centos ~]# useradd -s /sbin/nologin -M www

//创建程序用户

4.

[root@centos ~]# tar xf nginx-1.10.2.tar.gz -C /usr/src

//解压压缩包

[root@centos ~]# cd /usr/src/nginx-1.10.2/

//进入nginx目录

[root@centos nginx-1.10.2]# ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module && make && make install

//源码编译

[root@centos nginx-1.10.2]# ln -s /usr/local/nginx/sbin/* /usr/local/sbin

//优化命令路径

[root@centos nginx-1.10.2]# /usr/local/nginx/sbin/nginx

//启动nginx

5.

[root@centos nginx-1.10.2]# cd /usr/local/nginx/

//进入安装目录

[root@centos nginx]# cd conf/

//进入配置目录

[root@centos conf]# egrep -v "#|^$" nginx.conf.default > nginx.conf

//过滤nginx.conf.default中注释和空行,将最终结果输出到nginx.conf文件中。

                 

6.

[root@centos conf]# vim nginx.conf

//进入配置文件,删除内容

一个网站可以有很多网页,但是首页只有一个。当我们输入域名www.baidu.com时,浏览器会自动帮我们补全输入的URL,而网站接收到/以后,会自动跳转到用户想要浏览的首页。也就是输入:www.baidu.com会自动识别成http://www/baidu.com/index.html

Nginx实验部署

1.

[root@centos ~]# cd /usr/local/nginx/conf/

//进入nginx配置目录

[root@centos conf]# vim nginx.conf

//进入主配置文件进行修改

修改线程和域名

[root@centos conf]# /usr/local/nginx/sbin/nginx

//启动服务

错误处理:

此类错误为nginx已经启动,所以重启即可。如果还是出现这种提示,那么使用pkill -9 nginx杀死nginx后重新启动即可。

[root@centos conf]# ps -ef | grep nginx

//看看服务端口号

master守护进程用于监听端口,用户来了后,转发给worker进程处理,每个worker进程有多个线程

//查看监听端口

四个零表示本地服务器所有网卡IP都被监听

2.

[root@centos conf]# curl 192.169.200.4

//通过curl命令访问服务器IP

3.

IP访问:

在客户机上使用浏览器进行测试:

如果不能访问,先检查网络连通性,使用ping命令ping服务器,然后检查防火墙。

4.

域名访问:

找到C盘中的hosts文件,路径为:C:/Windows/System32/drivers/etc/hosts

 

hosts文件拖到桌面上,使用记事本打开

添加服务器的IP和域名

然后再将hosts文件拖回原位置。

使用浏览器访问

此过程就是DNS解析后将记录记在hosts文件的最终步骤。

5.

此处有两个网页,也就是如果index.html不能用,系统将默认将50x.html使用。

当然,对于index.html中的内容是可以修改的,里面的内容就是网页被访问后所呈现的内容。

多虚拟网站的访问

类型

  1. IP地址,一台服务器上有多块网卡,每个网站绑定了一个IP地址。
  2. 多个虚拟网站不同域名,同一个端口。
  3. 多个虚拟网站同一个域名,不同端口。

不同端口访问不同网站

1

[root@centos ~]#cd /usr/local/nginx

[root@centos ~]#vim conf/nginx.conf

//进入配置文件

复制10-17行的内容,在17行后插入空白行,粘贴两份内容。

注意不要漏掉标点,自习检查语法结构。

修改其中的网页目录和端口,让他们处于相同域名,不同网页目录,不同端口状态。

保存退出

2

[root@centos nginx]# cd html

//进入网页目录

[root@centos html]# mkdir -p www bbs org news

//创建四个目录

[root@centos html]# echo "`hostname -I` www.xiaofa.com" > www/index.html

[root@centos html]# echo "`hostname -I` bbs.xiaofa.com" > bbs/index.html

[root@centos html]# echo "`hostname -I` org.xiaofa.com" > org/index.html

[root@centos html]# echo "`hostname -I` news.xiaofa.com" > news/index.html

//在每个目录中,创建一个index.html文件,将主机IP和相应域名导入到其中

[root@centos html]# /usr/local/nginx/sbin/nginx -s reload

//平滑重启nginx服务

测试

80端口,www网站

81端口,bbs网站

82端口,org网站

83端口,news网站

同一个端口,不同域名来访问不同网站

1

[root@centos nginx]# vim conf/nginx.conf

//进入配置文件进行修改

端口改为80,域名分别改为bbs.xiaofa.com org.xiaofa.com news.xiaofa.com

2.

[root@centos nginx]# /usr/local/nginx/sbin/nginx -s reload

//平滑重启nginx服务

测试

找到C:\Windows\System32\drivers\etc下的hosts文件,移动到桌面,使用记事本打开,添加内容。保存后重新将其放入C:\Windows\System32\drivers\etc下。

www.xiaofa.com

bbs.xiaofa.com

org.xiaofa.com

news.xiaofa.com

在企业中一般不适用以上的更改方法,太过于麻烦,以下的方法是对上面步骤的简化。

1.

[root@centos nginx]# cd conf/

//进入配置目录

[root@centos conf]# mkdir conf.d

//创建目录

[root@centos conf]# cd conf.d/

//进入目录

[root@centos conf.d]# touch www.cnf bbs.cnf org.cnf news.cnf

//创建四个网页文件

2.

[root@centos conf.d]# vim www.cnf

//进入配置文件进行编辑

[root@centos conf.d]# vim bbs.cnf

//进入配置文件进行编辑

[root@centos conf.d]# vim org.cnf

//进入配置文件进行编辑

[root@centos conf.d]# vim news.cnf

//进入配置文件进行编辑

3.

//conf.d中存放的是子配置文件,nginx.conf是著配置文件,我们只需要将子配置文件include到主配置文件,就可以避免主配置文件有许多不必要的参数。

4.

[root@centos conf]# vim nginx.conf

//进入主配置文件,修改内容

//include就是导入的意思

[root@centos conf]# /usr/local/nginx/sbin/nginx -s reload

//平滑重启nginx服务

测试

www.xiaofa.com

bbs.xiaofa.com

org.xiaofa.com

news.xiaofa.com

因为可能存在浏览器缓存情况,所以此处换了个浏览器进行访问,以便更清晰地看到效果。也可以在本地使用curl命令进行测试

状态信息模块

在工作中,可以添加一个状态信息模块,是给运维看的

* access_log access.log;访问日志

* error_log error.log;错误日志

[root@centos conf]# /usr/local/nginx/sbin/nginx -s reload

//平滑重启

[root@centos conf]# vim /etc/hosts

//做个映射

 

//保存退出

[root@centos conf]# curl status.xiaofa.com

禁止通过IP访问域名

当使用ip进行访问的时候,默认会将主配置文件里第一条的域名进行显示

在工作中禁止用户通过IP来访问网站,一般来说用户都是域名访问,只有黑客才使用IP访问,所以要禁止IP直接访问网站。

[root@centos conf]# vim nginx.conf

//进入主配置文件添加内容

default_server只要用户通过IP访问,服务端就会回馈404

[root@centos conf]# /usr/local/nginx/sbin/nginx -s reload

//平滑重启nginx服务

[root@centos conf]# curl 192.168.200.4

//通过IP访问域名

通过IP访问网页回馈404,通过域名访问网页并无影响。

通过DNS解析会被记录位置信息,所以黑客不走DNS而是使用IP访问域名。

日志

[root@centos nginx]# cd logs/

//进入日志目录

查看访问日志的内容:

本机访问:

200表示访问成功,30表示本次访问造成了30字节的流量;

curl/7.19.7(x86_64-redhat-linus-gnu)为用户使用的工具,所在的平台;

浏览器访问:

因为是网关转发的,所以记录的是网关IP

平台是windows NT,读请求,返回码304成功

出现如此内容表示:网站标题识别错误

Nginx访问日志切割

[root@centos ~]# vim nginx.sh

#! /bin/bash

Datetime=`date +%Y%m%d`            //当前时间值

Basedir="/usr/local/nginx"             //路径值

Nginxlogdir="$Basedir/logs"            //路径下的日志目录

Logname="access"                    //访问日志

[ -d $Nginxlogdir ] && cd $Nginxlogdir || exit 1         //判断是否有logs目录,有的话进入,没有返回值为1

[ -f ${Logname}.log ] || exit 1                        //判断是否有访问日志文件,没有返回值为1

/bin/mv ${Logname}.log ${Dateformat}_${Logname}.log    //讲访问日志文件改名,名称为系统当前日志_访问日志.log

$Basedir/sbin/nginx -s reload           //平滑重启服务,刷新日志

[root@centos ~]# cat >>/var/spool/cron/root <<KOF

> #cut nginx access log by Mr.chen

> 00 00 * * * /bin/bash /server/scripts/cut_nginx_log.sh >/dev/null 2>&1

> KOF

//将服务添加到计划任务中

Nginx location

[root@centos conf.d]# vim www.cnf

//修改配置文件

这些是location的过滤条件,过滤的是用户的URLRUI部分。

[root@centos conf.d]# /usr/local/nginx/sbin/nginx -s reload

//重启服务

匹配标识的location

匹配说明

location /

所有location都不能匹配后的默认匹配

location =/images/

精确匹配images

location /documents/

过滤URI部分是否含有这个东西,但是注意的是,所有字符串匹配其实都叫前缀型字符串匹配

location ^~ /images/

^~特殊的正则匹配,让字符串的优先级临时高于正则

location ~* \. (gif|jpg|jpeg)$

~正则表达式,~*不区分大小写,\转译符,匹配以.gif,.jpg,.jpeg结尾的URI部分

优先级测试

1.正则,字符串优先级比较

结论:精确匹配>默认匹配   正则匹配>字符串匹配

2.正则,特殊正则,字符串匹配

结论:特殊正则>正则>字符串匹配

3.特殊正则,精确匹配

结论:精确匹配>特殊正则

总结

精确匹配>特殊正则匹配>正则匹配>字符串匹配>默认匹配

Nginx rewrite重写

环境为上面的环境

[root@centos conf.d]# vim org.cnf

//进入org.cnf网页主页修改配置文件

//将用户输入的.*值,放到www.baidu.com后执行跳转。

[root@centos conf.d]# /usr/local/nginx/sbin/nginx -s reload

//平滑重启nginx服务

在服务器上测试,显示永久跳转,301表示连接成功但是跳转页面了。

在浏览器上测试,直接跳转页面。

应用场景

原来有个旧域名,现在换成了新的域名,但是老用户不知道新域名,就可以通过这个方式,让旧域名在访问时跳转到新域名的网页,这样久而久之用户便可熟悉新域名,避免了广为通知,大费周章的情况。

判断

解释:

if(条件)为真,才进入;条件是$http_host里就是访问域名,通过HTTP协议,默

认环境变量;~*进行正则匹配,如果用户访问的,只要是(.*) \.yunjisuan\.com$;

如果条件为真,进入判断:将上面小括号的值赋给$domain;无论用户怎么访问,一率跳转到新域名,取之前小括号的值,放到后面就是:http://www.yunjisuan.com/$domain/$1(前面小括号的值) break;

实验

[root@centos conf.d]# vim bbs.cnf

关闭安全机制

[root@centos conf.d]# vim news.cnf

Ps注意,这里的网页路径为:html/www,网页匹配项有:indexindex.html

index.htm,如果有不在其中的网页,那么是不能别调用的。

[root@centos conf.d]# cd /usr/local/nginx/html/www/

//进入www目录中

[root@centos www]# mv index.html index.h

//为网页改名,让模块匹配不到

浏览器访问

如果将autoindex删除,那么就会回馈

讲解:

Nigxin接收到用户请求,URI部分其实就是一个符号,他的意思是,用户想看整个html目录的所有内容,nginx/进行跳转到index.htmlindex.htm才变成了一个页面。但是,前提是必须跳成功,如果跳转不成功,那么用过户访问的还是所有网页目录,所以再跳转时,如果找不到首页,就相当于向用户呈现了所有的网页内容。这是非常不安全的,于是触发了nginx的安全机制,将用户的请求拒绝了,最终显示403

Nginx原理

主流Web服务:

Nginx本质上使用线程来接待用户,每个进程里由多个线程,每个线程接待一个用户,所以nginx是多线程模式

Apache本质上利用进程来接待用户。每个进程里,只有一个线程再做事情。所以接待十个用户,就需要启动十个进程。因此apache是多进程模式

每个进程就是个资源池,里面要占用资源的进程越多,资源就占用越多;而线程是共享一个资源池的,线程并不额外多占用资源,多个线程可以共享一个资源池里的资源。

因此,apache接待用户要消耗许多的内存资源,并不能支持非常高的并发量。Nginx用线程接待用户,多个线程共享一份资源,因此,在高并发情况下,服务器的资源消耗对于apache来说,比较少。

又因为apacheselect接待模式,中文名同步阻塞I/O模型nginxepoll模式,中文名:异步非阻塞I/O模型。因此nginxCPU的利用效率也远大于apache

综上所述,Nginxapache在高并发的情况下,NginxCPU和内存资源的占用非常小,可以承受更高的用户的并发访问,而apache不行。

工作流程

单线程:在QQ运行时,碰到了I/O读写,CPU将处于挂起状态,然后携带用户进程,从用户态转化成内核态;当I/O读写完毕,再程序继续运行,触发I/O继续挂起,直到运行结束;QQ运行完成才会继续下个程序,以此类推。

此模型为同步阻塞I/O模型(select:同步(CPU和程序同步),阻塞(碰到I/O程序无法继续执行)

多线程:CPU一旦挂起,就结束运行了,此时再浪费CPU的处理资源。

异步线程:当执行第一件事过程中,碰到I/O读写,CPU不挂起,而是做一个标记,然后CPU就走了,去做第二件事,微信遇到I/O读写,就再打一个标记,然后查看QQ读写书否结束,如果读写结束,继续运行QQ,当再次碰到I/O读写,就会去查看微信的I/O读写是否结束,如果前两个都没结束,那么他就会去处理第三件事,一次类推,谁的I/O读写结束,就会去运行谁。此模型对CPU的利用率最高。

异步非阻塞I/O模型(epoll:异步(CPU和程序不同步),非阻塞(I/O读写,CPU不挂起)

相互优缺

进程接待用户的资源耗费很大, 但是用户和用户之间的资源是不共享的,相对独立。他们可以读写同一个文件,资源却并不冲突,变量也不会冲突。因此在高并发的情况下,功能非常稳定,不会出现服务崩溃问题。

但,nginx虽然对资源占用率低,却是多个线程使用同一份资源,那么就会发生冲突现象,在高并发场景下,容易出现服务崩溃的问题。

线程的死锁现象

两个线程分别为AB,都在运行由于他们利用的是同一份内存空间,所以在内存中,A访问了C文件,B访问了D文件。但是在C中有一行代码为:includeDD中有行代码为:inlcludeCA在执行C的时候需要去D文件进行导入,但是却发现D文件被占用了,因为B在用D的时候,就给文件上锁了(为了避免文件占用冲突,线程会给文件上锁);A发现D上锁了,于是C就会处于wait状态,B在使用D的时候,发现D需要找但是此时C也是处于上锁状态。于是D也处于wait状态,此时就处于线程的死锁现象。

这种情况如果越来越多,就会占用越来越多的资源,由于线程一致处于wait,线程就没办法被收尸,最终导致CPU使用率一直上涨,直到CPU累死,也就是服务器崩溃。

2021-1-31

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值