讲解高性能web服务器将分为两个板块讲解第一个板块就是理论知识,第二个板块就结合理论进行实战。
一、Web 服务基础介绍
(1)Web 服务介绍
1.Apache worker 模型
一种多进程和多线程混合的模型
有一个控制进程,启动多个子进程
每个子进程里面包含固定的线程
使用线程程来处理请求
当线程不够使用的时候会再启动一个新的子进程,然后在进程里面再启动线程处理请求,
由于其使用了线程处理请求,因此可以承受更高的并发
优点:相比prefork 占用的内存较少,可以同时处理更多的请求
缺点:使用keepalive的长连接方式,某个线程会一直被占据,即使没有传输数据,也需要一直待到超 时才会被释放。如果过多的线程,被这样占据,也会导致在高并发场景下的无服务线程可用(该问题在 prefork模式下,同样会发生)
2.Apache event模型
Apache中最新的模式,2012年发布的apache 2.4.X系列正式支持event 模型,属于事件驱动模型(epoll)
每个进程响应多个请求,在现在版本里的已经是稳定可用的模式
它和worker模式很像,最大的区别在于,它解决了keepalive场景下长期被占用的线程的资源浪费问题 (某些线程因为被keepalive,空挂在哪里等待,中间几乎没有请求过来,甚至等到超时)event MPM中,会有一个专门的线程来管理这些keepalive类型的线程
当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放。这样增强了高并发场 景下的请求处理能力
优点:单线程响应多请求,占据更少的内存,高并发下表现更优秀,会有一个专门的线程来管理keepalive类型的线程,当有真实请求过来的时候,将请求传递给服务线程,执行完毕后,又允许它释放
缺点:没有线程安全控制
3.Apache prefork 模型
预派生模式,有一个主控制进程,然后生成多个子进程,使用select模型,最大并发1024
每个子进程有一个独立的线程响应用户请求
相对比较占用内存,但是比较稳定,可以设置最大和最小进程数
是最古老的一种模式,也是最稳定的模式,适用于访问量不是很大的场景
优点:稳定
缺点:每个用户请求需要对应开启一个进程,占用资源较多,并发性差,不适用于高并发场景
4.服务端 I/O 流程
I/O在计算机中指Input/Output, IOPS (Input/Output Per Second)即每秒的输入输出量(或读写次数),
是衡量磁盘性能的主要指标之一。IOPS是指单位时间内系统能处理的I/O请求数量,一般以每秒处理的 I/O请求数量为单位,I/O请求通常为读或写数据操作请求。
一次完整的I/O是用户空间的进程数据与内核空间的内核数据的报文的完整交换,但是由于内核空间与用 户空间是严格隔离的,所以其数据交换过程中不能由用户空间的进程直接调用内核空间的内存数据,而 是需要经历一次从内核空间中的内存数据copy到用户空间的进程内存当中,所以简单说I/O就是把数据从 内核空间中的内存数据复制到用户空间中进程的内存当中。
服务器的I/O
磁盘I/O
网络I/O : 一切皆文件,本质为对socket文件的读写
5.网络I/O 处理过程
获取请求数据,客户端与服务器建立连接发出请求,服务器接受请求(1-3)
构建响应,当服务器接收完请求,并在用户空间处理客户端的请求,直到构建响应完成(4)
返回数据,服务器将已构建好的响应再通过内核空间的网络 I/O 发还给客户端(5-7)
(2)nginx
1.模块
nginx 有多种模块
核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件
驱动机制 、进程管理等核心功能
标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如: Flash
多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
Stream服务模块: 实现反向代理功能,包括TCP协议代理
第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等
nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载
2.Nginx 进程结构
web请求处理机制
多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直 到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务 器资源耗尽而无法提供请求
多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程和此客 户端进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器 对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可 以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作 了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。
第二个板块就结合理论进行实战
二、nginx的源码编译
环境:需要nginx-1.24.0的压缩包以及echo模块包
1.安装依赖
dnf install gcc pcre-devel zlib-devel openssl-devel -y
./configure --prefix=/usr/local/nginx --user=nginx
--group=nginx --add-module=/root/echo-nginx-module-0.63
--with-http_ssl_module --with-http_v2_module --with-http_realip_module
--with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module
三、nginx的平滑升级及版本回滚
1.根据链接下载或者使用安装包
wget https://nginx.org/download/nginx-1.26.2.tar.gz
此时利用链接下载1.26.2版本的nginx
2.解压: tar zxf ngnix-1.26.2
3.开始编译新版本:
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --add-module=/root/echo-nginx-module-0.63 --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module
4.make(注意!!!这里是make不需要makeinstall)
5.对老版本备份并将以前的nginx强制覆盖成为新版本的内容
6.检测一下
ps aux | grep nginx
nginx -t
7.回收旧版本的同时进行一个循环观察
四、nginx的核心配置
此时的的环境是关闭防火墙以及selinux
1.实现nginx的高并发配置:
vim /usr/local/nginx/conf/nginx.conf
vim /etc/security/limits.conf
测试结果:
ab -c 500 -n 10000 http://172.25.254.100/index.html
2.建立一个pc站点
mkdir /usr/local/nginx/conf.d
vim /usr/local/nginx/conf/nginx.conf
mkdir -p /usr/local/nginx/conf.d
vim /usr/local/nginx/conf.d/vhost.conf
mkdir -p data/web/html
echo welcome to xl > /data/web/htm/index.html
在windows中做域名解析
在这个路径下C:\Windows\System32\drivers\etc
打开hosts文件
访问一下www.xl.org
五、nginx启动脚本的编写
编辑文件:
六、nginx-location用法详解
#目录优先级
[root@nginx test1]# mkdir -p /data/web{1..5}
[root@nginx test1]# mkdir -p /data/web{1..5}/test
重启服务:
nginx -s reload
#文件优先级
[root@nginx test1]# echo web1 > /data/web1/test/index.html
[root@nginx test1]# echo web2 > /data/web2/test/index.html
[root@nginx test1]# echo web3 > /data/web3/test/index.html
[root@nginx test1]# echo web4 > /data/web4/test/index.html
[root@nginx test1]# echo web5 > /data/web5/test/index.html
文件:
重启服务:
nginx -s reload
七、nginx下的用户认证
1.添加账号以及密码
htpasswd -cm /usr/local/nginx/.htpasswd admin
设置密码为 xl
此时注意:路径一定要正确!!!
2.编辑配置文件
3.重启服务:
nginx -s reload
4.测试结果图:
输入你的用户名以及密码之后跳转
八、nginx自定义错误页面
编辑配置文件
重启服务
nginx -s reload
访问:www.xl.org/40x.html
九、自定义日志
创建目录:
mkdir /var/log/xl.org
编辑文件:
vim /usr/local/nginx/conf.d/vhost.conf
重新启动服务:
nginx -s reload
测试:
访问一个存在的URL:
cat /var/log/xl.org/access.log
访问一个错误的URL:
cat /var/log/xl.org/error.log
十、nginx中的变量详解
1.nginx的内置变量:
cd /usr/local/nginx/conf.d/
vim var.conf
2.nginx的自定义变量
(注意此时主机名(server_name)不能与var.conf中的名字相同)
vim var2.conf
本地解析域名:
vim /etc/hosts
测试结果:
利用命令测试一下
curl -b "key1=lee,key2=lee1" -u lee:lee var.timinglee.org/var?name=lee&&id=6666
十一、nginx中的rewerite模块功能
(1)指令
1.if指令
示例:
判断在文件是否存在
测试结果:
2.beak指令
示例:
测试:
3.return指令
示例:
测试:
(2)永久重定向和临时重定向
示例:
cd /usr/local/nginx/conf.d
vim var.conf
永久重定向:
临时重定向:
永久重定向测试结果:
访问var.xl.org
重定向到www.xl.org
临时重定向结果:
测试:curl -I var.xl.org
(3)break和last案例
1.创建目录并写入
mkdir /data/web/html/{test1,test2,break,last} -p
echo test1 > /data/web/html/test1/index.html
echo test2 > /data/web/html/test2/index.html
echo break > /data/web/html/break/index.html
echo last > /data/web/html/last/index.html
2.编辑配置文件
vim /usr/local/nginx/conf.d/break.conf
3.重启服务
nginx -s reload
4.访问测试:
curl -L var.exam.com/break/index.html
结果:test
curl -L var.exam.com/last/index.html
结果:nginx hahaha
十二、nginx中的rewerite实现全站加密以及防盗链
保证实验环境纯净,可以将之前实验中/usr/local/nginx/conf.d/目录下的文件删除
1.全站加密:
重启服务 nginx -s reload
测试:访问www.xl.com
c此时自动跳转到https
2.全站搜索错误跳转
重启服务 nginx -s reload
测试一下:
输入 一个错误URLwww.xl.com /a/b/c
跳转到正确页面
3.防盗链:
实验环境:需要两台主机,一台主机的ip为172.25.254.100 另一台主机的ip为172.25.254.10
我们先感受一下什么为盗链
先我们先放入一张图片到 /data/web/html/images/的路径下面
制作网页:
此时制作网页盗取图片
在172.25.254.10的这一台主机下
vim /var/www/html/index.htm
启动服务
重启服务 nginx -s reload
此时访问一下172.25.254.10
这便是盗链窃取你网页中的内容,为了防止他人窃取内容此时就用到了防盗链
防盗链:
在172.25.254.100的主机中
在/data/web/html中添加图片(此时一定要注意盗链与防盗链的这两张图片千万不要放在同一目录下如果放在同一目录下会出现无限循环的情况)
在172.25.254.10重启服务nginx
重启服务 nginx -s reload
结果:
访问172.25.254.10
在点击链接跳转
此时实验就结束啦!
十三、nginx的反向代理以及动静分离实现
1.编辑配置文件
host
2.编辑
3.重启服务
nginx -s reload
配置nginx
重启服务
nginx -s reload
vim /var/www/html/index.php
cat /var/www/html/index.php
mkdir -p /var/www/html/static
echo static 172.25.250.20 > /var/www/html/static/index.html
systemctl restart httpd
十五、nginx的四层负载均衡
主机和客户端服务器安装 MySQL
[ dnf install mariadb-server -y
vim /etc/my.cnf.d/mariadb-server.cnf(将10的主机的server.id改为10 20的id改为20)
systemctl start mariadb 启动数据库服务
#在10以及20的主机配置mysql
MariaDB [(none)]> CREATE USER 'howe'@'%' IDENTIFIED BY 'redhat';
Query OK, 0 rows affected (0.011 sec)
MariaDB [(none)]> GRANT ALL PRIVILEGES ON *.* TO 'howe'@'%';
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.001 sec)
MariaDB [(none)]> quit
Bye
#查看
[root@client ~]# mysql -e "grant all on *.* to howe@'%' identified by 'redhat';"
[root@client ~]# mysql -uhowe -predhat -h172.25.250.10 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 10 |
+-------------+
[root@client2 html]# mysql -e "grant all on *.* to howe@'%' identified by 'redhat';"
[root@client2 html]# mysql -uhowe -predhat -h172.25.250.20 -e "select @@server_id"
+-------------+
| @@server_id |
+-------------+
| 20 |
+-------------+
配置nginx
重启nginx并访问测试
nginx -s reload
测试通过nginx负载连接MySQL
#在nginx主机上连接
[root@nginx ~]# mysql -uhowe -p -h 172.25.250.100
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 7
Server version: 10.5.22-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 10 |
+-------------+
1 row in set (0.001 sec)
MariaDB [(none)]> quit
Bye
#退出之后再进
[root@nginx ~]# mysql -uhowe -p -h 172.25.250.100
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 6
Server version: 10.5.22-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> select @@server_id;
+-------------+
| @@server_id |
+-------------+
| 20 |
+-------------+
1 row in set (0.001 sec)
MariaDB [(none)]> quit
Bye
实现轮询 就实现了负载均衡
此时实验就结束了
十四、FastCGI实战
(1).源码编译php
环境准备:重新配置nginx
1.编译nginx
删除之前的nginx
rm -rf /usr/local/nginx
解压包
tar zxf memc-nginx-module-0.20.tar.gz
tar zxf php-8.3.9.tar.gz
tar zxf srcache-nginx-module-0.33.tar.gz
tar zxf openresty-1.25.3.1.tar.gz
yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel
安装
make && make install
(2)php相关配置优化
(1)pid = run/php-fpm.pid#指定pid文件存放位置
(3)nginx-php的配置方法
编辑nginx配置文件:
(4)nginx-mencache高速缓存
vim /data/web/php/memcache.php
systemctl restart php-fpm.service
[root@nginx memcache-8.2]# php -m | grep m
...
mbstring
memcache #如果有模块就添加好了
mysqli
mysqlnd
...
#下载memcache软件
[root@nginx ~]# dnf install memcached -y
#设置开机启动
[root@nginx ~]# systemctl enable --now memcached.service
Created symlink /etc/systemd/system/multi-user.target.wants/memcached.service → /usr/lib/systemd/system/memcached.service.
[root@nginx ~]# netstat -antlupe | grep memcache
tcp 0 0 127.0.0.1:11211 0.0.0.0:* LISTEN 980 229163 178247/memcached
tcp6 0 0 ::1:11211 :::* LISTEN 980 229164 178247/memcached
[root@nginx ~]# cat /etc/sysconfig/memcached
PORT="11211"
USER="memcached"
MAXCONN="1024"
CACHESIZE="64"
OPTIONS="-l 127.0.0.1,::1"
访问 http://php.timinglee.org/example.php #不断刷新
访问 http://php.timinglee.org/memcache.php #查看命中效果
不断点击刷新页面
十五、nginx的二次开发版
nginx -s stop #停止nginx 释放80端口
让其不要占用80端口
cd openresty-1.25.3.1/ ls bundle configure COPYRIGHT patches README.markdown README-windows.txt util
安装依赖包
dnf install -y gcc pcre-devel openssl-devel perl
cd /usr/local/src/ wget https://openresty.org/download/openresty-1.17.8.2.tar.gz
编译
/configure --prefix=/usr/local/openresty --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-http_sub_module --without-http_memcached_module --with-stream_realip_module
编译
make && make install
ln -s /usr/local/openresty/bin/* /usr/bin/
openresty -v nginx version: openresty/1.25.3.1
添加环境变量
vim ~/.bash_profile export PATH=$PATH:/usr/local/nginx/sbin:/usr/local/php/bin:/usr/local/php/sbin:/usr/local/openresty/bin
source ~/.bash_profile
openresty ps -ef | grep nginx nginx 180177 180175 0 19:16 ? 00:00:00 php-fpm: pool www nginx 180178 180175 0 19:16 ? 00:00:00 php-fpm: pool www root 199344 1 0 23:11 ? 00:00:00 nginx: master process openresty nobody 199345 199344 0 23:11 ? 00:00:00 nginx: worker process root 199347 180514 0 23:11 pts/5 00:00:00 grep --color=auto nginx