⼀、web基本概念和常识
- Web:为⽤户提供的⼀种在互联⽹上浏览信息的服务,Web 服 务是动态的、可交 互的、跨平台的和图形化的。
- Web 服务为⽤户提供各种互联⽹服务,这些服务包括信息浏览 服务,以及各种交互式服务,包括聊天、购物、学习等等内容。
3、Web 应⽤开发也经过了⼏代技术的不断发展,⽬前 Web 开发依 然是最重要的开发内容之⼀。Web 基础的技术包括超⽂本标记 语⾔(HTML)和 HTTP 协议,HTML 是⼀种呈现数据的⽅式 (给⼈看的),⽽ HTTP 则是⼀组通信的标准(语法、语义、 时许),可以简单的理解为 HTTP 携带 HTML。
4、web 应⽤:⽹站(⼴义上的PC,⼿机app)
浏览器(Browser):也称⽤户代理,web客户端,主要有IE、Edge、Chrome、
Firefox、腾讯浏览器,360浏览器等。
5、web服务器(web server):也称HTTP服务器(HTTPserver),主要有 Nginx、Apache、Tomcat 等。
二、网站基础
1、域名
域名是⼀个IP地址的“⾯具” ,⽬的是便于记忆和访问⼀个或⼀组服务器的地
址(⽹站,电⼦邮件,FTP 等)。
2、域名解析
本地HOSTS解析、DNS服务器解析Apache服务
3、⽹站的基本概念
⽹站、⽹⻚、主⻚;
HTTP、URL、HTML、超链接
4、web ⽹站
web1.0(以编辑为特征) web2.0(侧重⽤户交互)
5、动态⻚⾯与静态⻚⾯的差别
(1)URL不同
静态⻚⾯链接⾥没有“?” 动态⻚⾯链接⾥包含“?”
(2)后缀不同 (开发语⾔不同)
静态⻚⾯⼀般以 .html .htm .xml 为后缀 动态⻚⾯⼀般以 .php .jsp .py等为缀
(3)内容不同
静态⻚⾯的内容是固定的;动态⻚⾯的内容会因⽤户、浏览器、时间、地点等⽽
发⽣变化。
6、域名格式
http://(协议头)www.bing.com(域名)/(URI资源:路径/⽂件名)
示例:https://www.bilibili.com/v/game/?spm_id_from=333.85
1.b_7072696d6172794368616e6e656c4d656e75.21
三、HTTP 协议
HTTP协议是超⽂本传输协议的缩写,英⽂是Hyper TextTransfer Protocol。它是从
WEB服务器传输超⽂本标记语⾔(HTML) 到本地浏览器的传送协议。
1、HTTP 原理
HTTP是⼀个基于TCP/IP通信协议来传递数据的协议,传输的数据类型为HTML
⽂件,图⽚⽂件,查询结果等。HTTP协议⼀般⽤于B/S架构。浏览器作为HTTP
客户端通过URL向HTTP服务端即web服务器发送所有请求,web服务器收到客
户端请求后进⾏响应。
2、HTTP 特点
1) http协议⽀持客户端/服务端模式,也是⼀种请求/响应模式的协议。
2)简单快速:客户向服务器请求服务时,只需传送请求⽅法和路径。请求⽅法常
⽤的有GET、HEAD、POST。
3)灵活:HTTP 允许传输任意类型的数据对象。传输的类型由Content-Type 加以
标记。除开可以响应字符串之外,还可以上传和下载⼆进制⽂件。
4)⽆连接:限制每次连接只处理⼀个请求。服务器处理完请求,并收到客户的应
答后,即断开连接,但是却不利于客户端与服务器保持会话连接,为了弥补这不
⾜,产⽣了两项记录 http 状态的技术,⼀个叫做 Cookie,⼀个叫做 Session。
5)⽆状态:⽆状态是指协议对于事务处理没有记忆,后续处理需要前⾯的信息,
则必须重传。
3、URI 和 URL 的区别
(1)HTTP使⽤统⼀资源标识符(Uniform Resource Identifiers,
URI)来传输数据和建⽴连接。
URI:Uniform Resource Identifier 统⼀资源标识符
URL:Uniform Resource Location 统⼀资源定位符
(2)URI 是⽤来标识⼀个具体的资源的,我们可以通过 URI 知道⼀个资源是什
么,使⽤它就能够唯⼀地标记互联⽹上资源。
(3)URL 则是⽤来定位具体的资源的,标识了⼀个具体的资源位置。互联⽹上
的每个⽂件都有⼀个唯⼀的。
(4)URL,也就是我们俗称的⽹址,它实际上是 URI 的⼀个⼦集。
(5)URI 不仅包括 URL,还包括 URN(统⼀资源名称)
4、HTTP 报⽂组成
(1)客户端发出请求:
GET /index.php HTTP/1.5/ Host:zgod.cn
(2)客户端浏览器发送出来的请求格式:
GET:这个部分只声明了请求⽅式,除了get ⽅式可能还有 post
等⽅式。GET 表示请求,POST 表示邮寄。
/index.php:这⾥是⼀个URL,表示了我们要访问的资源是哪
个。
HTTP/1.5/:这⾥表示的是客户端浏览器使⽤的协议版本是1.5。
Host:zgod.cn:这是请求是交给主机zgod.cn的。
(3)服务器反馈的响应:
(4)服务器反馈的响应报⽂的具体含义:
HTTP/1.5:部分表示服务器回馈的对应http版本 (刚才客户端的
请求⾥⾯带有版本号,对⽅使⽤的1.5,服务器回馈的也是1.5)
200 ok:这⾥表示的是处理结果的状态码和状态的简单描述(ok)
Date:Mon,5 sep 2022 08:49:45 GMT:响应的具体时间
Content-Length:254:响应内容的⻓度
Content-Type:text/html:响应内容的类型
响应报⽂中打了⼀个空⾏(换⾏),当看到响应报⽂中有换⾏时,
它的下⾯开始就是客户机要访问的具体资源了。
5、HTTP 状态码
2xx:成功,200成功、201已经创建
3xx:重定向,304未修改
4xx:请求错误,404未找到⽂件、408请求超时
5xx:服务器错,500服务器内部错误、502⽹关错误
- 基础知识:
1、概述:最早的 web 服务程序,基于 http 协议提供⽹⻚浏览服务。
2、特点:模块化设置、开放源代码、跨平台应⽤、支持多种 web 编程语言、
运行稳定。
3、工作模式
(1)Prefork:使⽤进程处理请求,在该模式中⽐较消耗内存,但稳
定性⾼,如某个进程出现问题,不会影响其他请求。
(2)Worker:属于多进程模式,每个进程生成多个进程;在该模式下
消耗的资源比较⼩,适合高并发请求,但稳定性没有 Prefork 模式稳
定。
(3)Event:该模式与 Worker 模式较为相似,不同之处在于在该模
式下可以解决keepalive ⻓连接时占⽤线程资源导致浪费的问题。
(4)keep-alive ⻓连接:TCP连接在发送后将仍然保持打开状态,
于是,浏览器可以继续通过相同的连接发送请求。保持连接节省了为
每个请求建⽴新连接所需的时间,还节约了带宽。实现长连接要客户端和服务端、
都支持长连接。
4、静态资源——根据开发者保存在项目资源目录中的路径访问静态资源文件
静态文件如果无法在浏览器上访问,就一定无法加载在页面上
[root@web ~]# cd /opt/
[root@web opt]# ls
问题.png
[root@web opt]# cp -r 问题.png /var/www/html/
[root@web opt]# cd /var/www/html/
[root@web html]# ls
index.html 问题.png
[root@web html]# ls -lh
总用量 52K
-rw-r--r--. 1 root root 26 7月 29 09:40 index.html
-rw-r--r--. 1 root root 48K 7月 29 10:04 问题.png
[root@web html]# tree
.
├── index.html
└── \351\227\256\351\242\230.png
[root@web ~]# cd /var/www/html
[root@web html]# ls
[root@web html]# echo "我是静态的html文件" > index.html
[root@web html]# systemctl restart httpd
[root@web html]#systemctl stop firewalld
浏览器测试:
⼆、搭建apache服务器
常用命令
# 查看华为云主机的所有打开的端口
[root@web html]# firewall-cmd --list-ports
#查看防⽕墙是否启⽤,若启⽤则设置apache服务可通⾏规则
[root@web html]# systemctl status firewalld.service
# 可以停用防火墙,也可以指定端口打开
[root@web ~]#firewall-cdm --zone=public --add-port=80/tcp --permanent
[root@web ~]#firewall-cdm --zone=public --add-service=httpd --permanent
# 查看防火墙的打开端口
[root@web html]# firewall-cmd --list-all
# 防⽕墙开放http服务
[root@web ~]#filewall-cmd -addservice=http
# 查看防⽕墙的所有规则,发现ssh服务和http的服务都打开了
[root@web ~]#filewall-cmd --list-all
# 重载防火墙规则,重载之后前⾯的设置才会生效
[root@web ~]#firewall-cmd --reload
具体搭建过程
1、安装:
[root@lq ~]#yum -y install httpd # httpd服务和nginx服务都是使⽤80端⼝
2、查看安装的资源文件
[root@lq ~]# rpm -ql httpd
[root@lq ~]# ls /etc/httpd
conf conf.d conf.modules.d logs modules run
3、修改配置文件
# yum 安装的 apache,配置⽂件在 /etc/httpd/conf/httpd.conf
# 如果是编译安装的 apache,那么配置⽂件在⾃⼰编译安装的安装⽬录下
[root@lq ~]# vim /etc/httpd/conf/httpd.conf # 修改虚拟主机或端口号
45 Listen 80 #默认的httpd监听端⼝,可在下⾯添加其他自设端⼝
98 ServerName www.example.com:80 #指定httpd服务域名和该域名的端⼝,可以
⼿动修改其他域名
/Listen # 80附近的端⼝不要随便修改,使⽤1023之后的端⼝
[root@lq ~]# ls /var/www/html/ # 重装的目录下没内容
4、启动服务
[root@lq ~]# systemctl start httpd.service # 如果有其他占⽤80端⼝的应⽤需要
停⽤
5、查看云主机上所有打开的端口
[root@lq ~]# ss -antlp|grep http # 查看端⼝使⽤情况,确认开启端⼝的是http
服务以及端⼝号是多少
LISTEN 0 128 :::80 :::*
users:(("httpd",pid=1667,fd=4),("httpd",pid=1666,fd=4),("httpd",pid=1665,fd=4),("ht
tpd",pid=1664,fd=4),("httpd",pid=1663,fd=4),("httpd",pid=1662,fd=4))
6、不能直接停用防火墙,可以单独打开某些端口或服务
[root@lq ~]# firewall-cmd --zone=public --add-port=80/tcp --permanent
[root@lq ~]# firewall-cmd --zone=public --add-service=http --permanent #设置防
⽕墙放⾏apache
7、打开服务不会马上生效,需要重启服务
[root@lq ~]# firewall-cmd --reload
[root@lq ~]# sed -n '/^Listen/s/80/8081' /etc/httpd/conf/httpd.conf
[root@lq ~]# sed -n '/^Listen/p' /etc/httpd/conf/httpd.conf
Listen 80
[root@lq ~]# sed -i '/^Listen/s/80/8081/' /etc/httpd/conf/httpd.conf #修改端口
号
[root@lq ~]# ls -a /var/www/html/
[root@lq ~]# touch /var/www/html/index.html
8、apache 索引⽂件:当在资源目录中添加index.html之后,http服务会自动找
到index文件。在⼀般的前段服务器中http nginx tomcat,在没有指定文件路径
的时候,默认先访问资源文件夹中的index.xxx。
./html/index.html
1)httpd 使⽤ yum 安装时,默认的站html文件在/var/www/html/index.html,如
果 index.html ⽂件不存在,需要手动创建
2)在网站方面,index通常是指主⽬录的意思,index.html是目录下默认打开的⻚
⾯。⽐如,网站的域名是www.abc.com,如果设置了 index.html 是默认主⻚,
那么打开 http://www.abc.com 和打开页面 http://www.abc.com/index.html 就
是⼀样的。他们打开的都是网站首页,因为index.html是网站默认的主页。
3)在 index.html 写⼊如下内容,可以让主页显示一个圆形,圆⼼处显示文字“这
就是主页”。
测试1:
[root@lq ~]# vim /var/www/html/index.html
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>正方形</title>
<style>
div{
background-color:red;
width:120px;
height:120px;
}
</style>
</head>
<body>
<div>正方形</div>
<img src="img/问题.png" />
</body>
</html>
[root@lq ~]# mkdir /var/www/html/img/
[root@lq ~]# cp /opt/问题.png /var/www/html/img/
[root@lq ~]# ls /var/www/html/
img index.html
浏览器访问:
测试2:
[root@server2 ~]# vim /var/www/html/index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>ssjie's page</title>
<style type="text/css">
.bigMom{
margin:0 auto;
width:600px;
#圆的半径宽度
height:600px;
#圆的半径⾼度
line-height:600px;
#⾏间距
text-align:center;
#⽂字位置:居中
color:black;
#文字颜色:黑色
border-radius:50%;
#圆角率,50%是圆
backgroundcolor:cyan; #圆的颜色:青色
}
</style>
</head>
浏览器内输⼊搭建好的 httpd 服务器 IP 地址或域名(当前服务器地址为
192.168.2.28)
<body>
<div class="bigMom">
欢迎来到主⻚!
</div>
</body>
</html>
9、IP不同,域名相同的虚拟主机:
(1)修改主配置
设置 IP 相同,域名不同的虚拟主机,配置⽂件在
/etc/httpd/conf/httpd.conf
.htaccess ⽂件:可以实现,⽂件夹密码保护、⽤户自动重定向、错误⻚⾯、改
变你的⽂件扩展名、封禁特定IP地址的⽤户、只允许特定IP地址的⽤户、禁止
目录列表,以及使⽤其他文件作为index⽂件等⼀些功能。
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
45 Listen 80
46
47 ServerName www.yh666.com:80 #添加
如下内容,域名⾃起,IP地址为⾃⼰的主机
48
49 NameVirtualHost 192.168.33.110
50 <VirtualHost 192.168.33.110>
51 DocumentRoot /var/www/html/yang #标明
索引⽂件路径,所以还需⾃⼰在该路径创建新的索引⽂件
52 ServerName www.yh666.com #域名
⾃起
53 <directory /var/www/html/yang>
(2)创建索引⽂件
索引⽂件:index.html,⼀般为⽹站的⾸⻚。
54 allowoverride None #确定
是否被允许读取.htaccess⽂件内容
55 require all granted #允许
所有⽤户访问指定的(/var/www/html)⽂档或⽬录
56 </directory>
57 </virtualhost>
58
59 <virtualhost 192.168.33.110>
60 documentroot /var/www/html/hong #同上
61 servername www.hong777.com
62 <directory /var/www/html/hong>
63 allowoverride none
64 require all granted
65 </directory>
66 </virtualhost>
[root@server2 html]# systemctl reload httpd.service
#重载服务
[root@server2 ~]# cd /var/www/html/ #移动
到索引⽂件所在位置
[root@server2 html]# ls #当前
⽬录下有个索引⽂件模板
(3)修改本地 hosts
1)本地 hosts:将⼀些常⽤的网址域名与其对应的IP地址建⽴⼀个关联“数据库”,
当⽤户在浏览器中输⼊⼀个需要登录的网址时,系统会首先自动从Hosts文件中
寻找对应的IP地址,⼀旦找到,系统会立即打开对应网页,如果没有找到,则
系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
2)如果该文件需要权限,那么右键该文件,进⼊“属性”,点击“安全”选项卡,找
到自己电脑的主用户,点编辑,然后再根据图示给予用户权限。
3)以记事本或 notepad ⽅式打开本地 hosts ⽂件,最下⾏输⼊IP和域名,记得
要与 httpd 的配置⽂件内的对应。
4)域名访问测试:
Ⅰ.浏览器输⼊配置好的域名www.yh666.com
Ⅱ. 浏览器输⼊ www.hong777.com
10、IP 相同,端⼝不同的虚拟主机
(1)修改主配置:编辑 /etc/httpd/conf/httpd.conf 配置文件
[root@server2 ~]# vim /etc/httpd/conf/httpd.conf
45 Listen 80
46 Listen 88 #添加⼀个88端⼝
60 <virtualhost 192.168.33.110:88> #修改
hong777.com的虚拟主机端⼝为88,其余内容不变
使用源码编译安装nginx服务
⼀、Nginx
1、Nginx 简介
1)Nginx(engine X):开源、轻量级、⾼性能的 HTTP 和反向代理服务器,可以
代理 HTTP、IMAP/POP3/SMTP 和 TCP/UDP协议。
2)基本特点:占⽤内存少、并发能⼒强,采⽤ C 语⾔编写,在性能⽅⾯有⼀定
保证。
3)Nginx 可以⽤来做负载均衡及反向代理使⽤,⽬前使⽤最多的是负载均衡。
4)与 Nginx 同类的 Web 服务有 Apache、Tomcat等。
5)官方网站:nginx news
2、Nginx 服务器特点
(1)模块化设计
Nginx 将模块分为核⼼模块、HTTP 模块、事件模块和邮件模块
四类。每个模块都有特定的职责,从⽽实现了整个 Web 服务器
的功能。
(2)低内存消耗,高并发
Nginx 使⽤ epoll and kqueue 作为开发⼯具,能够⽀持最⼤50000 个并发连接数
的响应;不论是系统资源开销还是 CPU使⽤效率都很优秀。
(3)事件驱动
nginx 采⽤异步⽅式处理请求。
同步:指在发送⽅发出消息后,需要等待接收到接收⽅发回的响应,或者通过回
调函数来接收到对⽅响应信息。
异步:指在发送⽅发出请求后,接收⽅不需要返回消息或者不等待返回消息,直
接提供响应请求机制。
(4)⾼可靠性,master 与 worker 架构
⼀个主进程和多个⼯作进程。⼯作进程是单线程的,且不需要特
殊授权即可运⾏;
master进程:主要⽤来监控worker进程⼯作状态进⾏相应重
启、停⽌等操作。
worker进程:进⾏具体提供服务,接受请求和处理请求。
(5)⽀持热更新配置、⽇志⽂件滚动、平滑升级
/usr/local/nginx/sbin/nginx -s reload
html⽬录中的⽂件发上修改之后,不需要nginx服务。
可向 master 发送 USR1、QUIT 等信号,⽆需强制停⽌服务即可完成热更新。
向 master 发送的 USR1,可实现⽇志⽂件滚动。
向 master 发送的 USR2,可实现平滑升级。
(6)丰富的扩展模块
可在编译安装 nginx 时指定拓展模块,例如:nginx-stickymodule 模块(基于
cookie 来进⾏负载转发)。
3、Nginx 和 Apache 区别
(1)架构
Apache 采⽤多进程架构,每个请求都由⼀个独⽴的进程处理;⽽Nginx采⽤异步
事件驱动的架构,可以处理更多的并发连接。
(2)性能
由于Nginx的架构设计,它可以处理更多的并发连接,⽽且在⾼负载情况下表现
更加稳定和可靠。因此,Nginx通常被认为是比Apache更⾼效的Web服务器。
(3)配置
Apache 的配置⽂件⽐较复杂,需要⼀定的学习和经验才能正确配置;⽽ Nginx
的配置⽂件⽐较简洁和可读性强,更容易理解和配置。
(4)功能
ngin x有许多模块可以扩展其功能,例如 mod_rewrite ⽤于URL 重写,mod_ssl
⽤于 SSL 加密等;⽽apach 的功能⽐较简单,但是可以通过第三⽅模块扩展其
功能。
4、Nginx 基本功能
(1)静态资源 Web 服务器
nginx 可实现动静资源分离
动态资源:需要程序处理或者从数据库中读数据,能根据不同的条件在⻚⾯显示
不同的数据。
静态资源:前端的固定⻚⾯,这⾥⾯包含HTML、CSS、JS、图⽚、⾳乐等等,不
需要查数据库也不需要程序处理,直接就能够显示的⻚⾯。
动静分离:当使⽤ nginx 处理静态⻚⾯时,可将⽤户的动态请求转发给后端的
tomcat 或 PHP 处理动态⻚⾯。
前后端:前端就是完全的静态资源,
(2)基于域名/IP/端⼝的虚拟主机
虚拟主机:在Web服务⾥就是⼀个独⽴的⽹站站点,这个站点对应独⽴的域名(也
可能是IP或端⼝),具有独⽴的程序及资源⽬录,可以独⽴地对外提供服务供⽤
户访问。
⼀个 nginx 主进程,指定⼀个配置⽂件,配置⽂件内有多个虚拟主机。如果不
⽤虚拟机,⼀个域名就要对应⼀个服务器,浪费资源。
Ⅰ.基于域名的虚拟主机
以不同的多个域名区分不同的虚拟主机(IP 相同),放在⼀个nginx服务上,能
够让⽤户有序访问⽣产⽤途,例如:www.jd.com 和diannao.jd.comchannel.jd.com。
Ⅱ.基于端⼝的虚拟主机
以不同的端⼝,来区分多个虚拟主机,也是放在⼀个nginx服务上,能够让⽤户
有序访问,例如:192.168.33.110:8080、www.baidu.com:8080。
Ⅲ.基于 IP 的虚拟主机
以不同 IP 区分不同的虚拟主机。
(3)HTTP/HTTPS、SMTP、POP3 和 TCP/UDP 反向代理
客户端代理,增强客户端的作⽤;反向代理是保护服务器;反向代理是⼀种代理
服务器的配置模式,它代表服务器向客户端提供服务。客户端发送请求到反向代
理服务器,然后代理服务器将请求转发到后端的真实服务器上,并将响应返回给
客户端。简单理解为⽤户直接访问反向代理服务器就可以获得⽬标服务器
的资源。
(4)负载均衡
所谓负载均衡,就是 Nginx 把请求均匀的分摊给上游的应⽤服务器,这样即使
某⼀个服务器宕机也不会影响请求的处理,或者当应⽤服务器扛不住了,可以随
时进⾏扩容。
(5)⻚⾯缓存
Nginx 不仅仅是⼀个 Web 服务器,它还可以作为⼀个缓存服务器使⽤。
通过 Nginx 缓存,可以对⼀些静态资源或者数据更新频率较低的后端服务做缓
存,降低静态资源或后端服务的响应时间,同时也会降低后端的负载。⽐如对⼀
些图⽚,css或js做⼀些缓存,那么在每次刷新浏览器的时候,就不会重新请求
了,⽽是从缓存⾥⾯读取。这样就可以减轻服务器的压⼒。
(6)⽀持代理 FastCGI、uWSGI 等应⽤服务器
1)CGI:描述了服务器(nginx,apache)和请求处理程序(django,flask,springboot web
框架)之间传输数据的⼀种标准。定义了客户端与服务器之间如何传输数据。
2)FastCGI:快速通⽤⽹关接⼝(Fast Common GatewayInterface/FastCGI)是⼀种
让交互程序与Web服务器通信的协议。FastCGI是早期通⽤⽹关接⼝(CGI)的
增强版本。
3)WSGI:为Python定义的 web 服务器和 web 框架之间的接⼝标准。
4)uwsgi:uWSGI 服务器实现的独有的协议,定义传输信息的类型,是⽤于前端
服务器与 uwsgi 的通信规范(uWSGI 服务器自由的⼀个协议)。
5)uWSGI:⼀个Web Server(web服务器),即⼀个实现了WSGI协议的服务器,
处理发来的请求及返回响应。
6)web 服务器:
客户端(浏览器,app)跟服务器(web框架)之间的东⻄,服务器中间件
# nginx apache 是⼀类东⻄,就是做请求转
发,符合fastcgi服务器
# uWSGI,gunicorn 只针对于python的web框架
# tomcat,jboss,weblogic 只针对java的web框架
# php-fpm 针对于php的框架
(7)⽀持 gzip、expires
当运维⼈员将要锁包放到html中,会⾃动部署nginx ⽀持资源压缩和缓存控制。
(8)URL Rewrite
192.168.1.3/abc
192.168.1.3/a/b/c/
Rewrite 主要实现url地址重写,以及重定向,就是把传⼊web的请求重定向到
其他 url的过程。
(9)路径别名:资源路径的别名(root 和 alias)。
(10)基于 IP、⽤户的访问控制 nginx 可对指定 IP ⽹段或某个特定 IP 做访
问控制(allow:允 许;deny:拒绝)。
支持访问速率、并发限制。
5、Nginx 架构
(1)主进程(master process)
主要与外界通信和⼯作进程管理。
读取 nginx 配置⽂件并验证有效性。
建⽴、绑定和关闭 socket(套接字,IP地址:端⼝号)。
按照配置⽂件⽣成、管理和结束⼯作进程。
nginx 重启、停⽌、重载配置⽂件、平滑升级、管理⽇志⽂件
等。
(2)工作进程(worker process)
接受客户端请求,将请求交给各个功能模块处理。
接收主进程的指令并执⾏。
与后端服务器通信,接收后端服务器处理的结果,发送结果给客户端。
数据缓存管理。
访问缓存索引、重建、查询和调⽤缓存数据。cache 模块,主要由缓存索引重建
和缓存索引管理两个进程完成,缓存索引重建进程是在进程 nginx 服务启动⼀
段时间之后,由主进程⽣成,对本地磁盘的索引⽂件在内存中建⽴元数据库,包
括扫描、过期更新等操作,完成后退出。
系统 IO 调⽤,获取响应数据,发送响应给客户端。
⼆、Nginx ⽀持⾼并发的原因
- 事件驱动模型:Nginx采⽤了异步事件驱动模型,它使⽤⼀个单独的⼯作进
程来处理多个连接,每个连接都是异步的,不会阻塞其他连接。这种模型使得
Nginx能够处理⼤量并发连接,⽽不会消耗过多的系统资源。
2、 ⾼效的内存管理
Nginx使⽤内存池来管理内存分配,避免了频繁的内存分配和释放操作,从⽽提
⾼了效率。此外,Nginx还采⽤了零拷⻉技术,减少了数据在内存和磁盘之间的
复制次数,进⼀步提⾼了性能。
3、 负载均衡
Nginx可以作为反向代理,将请求分发给多个后端服务器,从⽽实现负载均衡。
这样⼀来,每个后端服务器只需要处理部分请求,整个系统的负载得到了均衡,
提⾼了系统的并发能⼒。
4、⾼度可定制化
Nginx⽀持动态模块加载,⽤户可以根据⾃⼰的需求选择需要的模块进⾏编译和
加载,从⽽提⾼了灵活性和可扩展性。
niginx企业实战
1、修改配置
1)进⼊ nginx 主配置⽂件(yum 和编译安装的⽂件路径不⼀样)。
2)找到“server { }”,添加⼀个“location { }”,也就是虚拟主机。
[root@web ~]# vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
server {
listen 80; #监听端⼝
server_name localhost; #服务器名称
charset utf-8; #字符集,utf-8为中⽂字符集
#access_log logs/host.access.log main;
location /status { #nginx状态的监听模块
stub_status on;
access_log off;
}
}
......省略部分内容......
:wq #保存并退出
[root@web ~]# systemctl restart nginx.service #重启nginx
2、访问测试
浏览器访问 192.168.33.110/status,查看 nginx 状态信息。
3、nginx 虚拟主机配置
⼀个“location”相当于⼀个虚拟主机,也就是⽤户访问⽹站时,点击跳转的另
⼀个⻚⾯。location 内可以添加 nginx 各种功能模块。
[root@web ~]#vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
server {
listen 80; #监听端⼝
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location /status {
stub_status on;
access_log off;
}
location / {
root html; #⽹站在服务器上的⽬
录,默认为/usr/local/nginx/html
index index.html index.htm; #跳转到
的⽹站⾸⻚
}
}
......省略部分内容......
[root@web ~]# systemctl restart nginx.service #重启nginx
- nginx 反向代理配置
反向代理:⽤户直接访问反向代理服务器就可以获得⽬标服务器(后端服务器)
的资源。
1)修改配置:在配置⽂件中添加⼀⾏反向代理块指令(proxy_pass),表示
当访问本机地址 192.168.33.110 的 80 端⼝时即可跳转到后端
服务器 192.168.33.11 的 80 端⼝上。
[root@web ~]# vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
server {
listen 80;
server_name localhost;
charset utf-8;
#access_log logs/host.access.log main;
location /status {
stub_status on;
access_log off;
}
location / {
root html;
index index.html index.htm;
proxy_pass http://192.168.33.11:80;
#添加⼀个反向代理模块
}
......省略部分内容......
[root@web ~]# systemctl reload nginx.service #重载nginx配置
2)建⽴后端服务器
使⽤另⼀台虚拟机,安装 nginx ,然后进⼊/usr/share/nginx/html/ ⽬录,修改
其中的 index.html ⽂件,随便写⼊⼀条内容进⾏测试。
[root@web ~]# vim /usr/share/nginx/html/index.html
这里是192.168.33.11
3)访问测试
浏览器输⼊本机地址 192.168.33.110,将会⾃动跳转到后端服务器
192.168.33.11 上。
5、nginx 访客 IP ⿊名单
1)修改配置
作为运维⼈员,我们可以选择允许哪些⽤户 IP 来访问我们的服务器,也可以选
择允许哪个⽹段的⽤户。
allow:允许
deny:拒绝
在 nginx 配置⽂件的 server 模块内可以添加下⾯的内容。
当访问被拒绝时,会显示 403 错误⻚⾯。
[root@web ~]# vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
server {
listen 80;
server_name localhost;
charset utf-8;
allow 192.168.33.22; #允许192.168.33.22
⽤户访问
deny 192.168.33.0/24; #拒绝33.0⽹段的⽤户访
问
deny all; #拒绝所有
......省略部分内容.....
[root@web ~]#vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
server {
listen 80;
server_name localhost;
charset utf-8;
allow 192.168.33.22; #允许192.168.33.22
⽤户访问
deny 192.168.33.0/24; #拒绝33.0⽹段的⽤户访
问
deny all; #拒绝所有
......省略部分内容......
2)访问测试
因为当前服务器拒绝了 33.0 ⽹段的⽤户访问,⽽本机浏览器
正是通过 33.1 ⽹关与服务器建⽴连接,所以浏览器被拒绝访问了,
显示 403 错误信息。
使⽤也是 192.168.33.0 ⽹段的 33.11 的 YH1 主机访问服务器
进⾏测试。
[root@web ~]# curl 192.168.33.110 #访问33.110服务器进⾏测试
<html>
<head><title>403 Forbidden</title></head> #可以看
到403错误,说明访问同样被拒
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.24.0</center>
</body>
</html>
使⽤之前允许的 192.168.33.22 的 YH2 主机进⾏访问服务器测试
[root@web ~]# ip a #查看当前主机的IP
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu
1500 qdisc fq_codel state UP group default qlen
1000
link/ether 00:0c:29:10:45:e6 brd
ff:ff:ff:ff:ff:ff
altname enp2s0
inet 192.168.33.22/24 brd 192.168.33.255 scope
global noprefixroute ens32
[root@web ~]# curl 192.168.33.110 #访问33.110服务器进⾏测试
欢迎访问!
这⾥是 192.168.33.110 服务器! #测试成功,可以访问
6、为 server 主机配置访问和错误⽇志
控制⽇志参数
(1)nginx 访问⽇志主要控制参数
log_format:⽤来定义记录⽇志的格式(可以定义多种⽇志格式,取不同名字即
可)
access_log:⽤来指定⽇志⽂件的路径及使⽤何种⽇志格式记录⽇志
(2)log_format ⽇志格式变量
$remote_addr:记录访问⽹站的客户端地址。
$remote_user:远程客户端⽤户名。
$time_local:记录访问时间与时区。
$request:⽤户的http请求起始⾏信息。
$status:http状态码,记录请求返回的状态码,例如:200、301、404等。
$body_bytes_sent:服务器发送给客户端的响应body字节数。
$http_referer:记录此次请求是从哪个连接访问过来的,可以根据该参数进⾏防
盗链设置。
$http_user_agent:记录客户端访问信息,例如:浏览器、⼿机客户端等。
$http_x_forwarded_for:当前端有代理服务器时,设置web节点记录客户端地址
的配置,此参数⽣效的前提是代理服务器也要进⾏相关的x_forwarded_for设置。
[root@web ~]#vim /usr/local/nginx/conf/nginx.conf
......省略部分内容......
#log_format main '$remote_addr -
$remote_user [$time_local] "$request" '
# '$status $body_bytes_sent
"$http_referer" '
# '"$http_user_agent"
"$http_x_forwarded_for"';
......省略部分内容......
(3)access_log 访问⽇志
(4)error_log 错误⽇志
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
......省略部分内容......
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
错误⽇志 错误⽇志⽂件路径 错误⽇志级别
7、nginx 错误⻚⾯
nginx 的错误⻚⾯与访问⾸⻚⼀样,都有⾃⼰的索引⽂件,⼀般
⽤户访问的⽹站都是对应的索引⽂件。
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
......省略部分内容......
error_page 500 502 503 504 /50x.html;
#500~504错误代码,不论哪个代码,错误⻚⾯都是50x.html
location = /50x.html { #错误⽂件所在路径
root html; #该⽹站的根⽬录
}
8、location 块的匹配规则和优先级
1、location⼤致可以分为三类
精准匹配:location = / {...}
正则匹配:location ~ / {...}
⼀般匹配:location / {...}
2、location常⽤的匹配规则
= :进⾏普通字符精确匹配,也就是完全匹配。
^~ :表示普通字符匹配。使⽤前缀匹配。如果匹配成功,则不再匹
配其它 location。
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
......省略部分内容......
error_page 500 502 503 504 /50x.html;
#500~504错误代码,不论哪个代码,错误⻚⾯都是50x.html
location = /50x.html { #错误⽂件所在路径
root html; #该⽹站的根⽬录
}
~ :区分⼤⼩写的匹配。
~* :不区分⼤⼩写的匹配。
!~ :区分⼤⼩写的匹配取⾮。
!~* :不区分⼤⼩写的匹配取⾮。
3、location优先级
⾸先精确匹配 =
其次前缀匹配 ^~
其次是按⽂件中顺序的正则匹配 或*
然后匹配不带任何修饰的前缀匹配
最后是交给 / 通⽤匹配
精确>前缀>正则>⼀般>通⽤
(location = 完整路径) > (location ^~ 完整路径) > (location ~* 完整路径) > (location ~ 完整路径) >(location 部分起始路径) > (location /)
9、rewrite 重写和⽹站跳转
1)301 永久跳转
301 永久跳转:当⽤户或搜索引擎向⽹站服务器发起浏览请求时,服务器返回的
HTTP 数据流中头信息(index.html 等)中的状态码的⼀种,表示本⽹⻚永久性
地转移到了另⼀个地址。
rewrite 重写跳转规则
http://www.yang1314/$1:跳转到的⽬标地址,后⾯的$1代表链参数也⼀起跳转。
⽐如访问 www.yh666.com/123 就会跳转到
www.yang1314/123 没有的话。就会直接跳转到 www.yang1314.com
permanent:301 永久跳转
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
.......省略部分内容.......
server {
listen 80;
server_name www.yh666.com;
charset utf-8;
#access_log logs/host.access.log main;
rewrite^/(*) 1](http://www.lei
ge.com/$1) redirect;
location / {
root html;
index index.html index.htm;
rewrite ^/(.*)$
http://www.yang1314.com/$1 permanent; #添加此参数
}
}
2、302 临时跳转
跟 301 永久跳转相⽐,302 就是⼀个参数的差别。
配置规则按着 301 配置⾛即可找到域名配置⽂件的Server或者
location段,适当位置添加下⾯代码:
[root@server2 ~]# vim
/usr/local/nginx/conf/nginx.conf
.......省略部分内容.......
server {
listen 80;
server_name www.yh666.com;
charset utf-8;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
rewrite ^/(.*)$
http://www.yang1314.com/$1 redirect;
}
}
常用指令
# 指令之所以能在命令行使用是因为在$PATH目录中能找到这个可执行文件
# 启动和关闭nginx
[root@web ~]# ./nginx
[root@web ~]# ./nginx -s stop
# 修改了配置文件后,重载nginx服务
[root@web ~]# ./nginx -s reload
# 脚本启动nginx服务
[root@web ~]# vim ~/nginx.sh
#!/bin/bash
/usr/local/sbin/nginx &> /dev/null
ss -lnput|grep nginx
if [ $? -eq 0 ];then
echo "nginx正在执行,或者是80被占用"
fi
[root@web ~]# ls /usr/lib/ssytemd/system
[root@web ~]# vim /usr/lib/systemd/system/nginx.service
# 如果直接使用sbin目录下的nginx,就无法直接使用systemctl