全网最最最详细讲解企业高性能web服务器(包学会的!)

讲解高性能web服务器将分为两个板块讲解第一个板块就是理论知识,第二个板块就结合理论进行实战。

一、Web 服务基础介绍

1993 3 2 日,中国科学院高能物理研究所租用 AT&T 公司的国际卫星信道建立的接入美国 SLAC 国家实 验室的64K 专线正式开通,成为我国连入 Internet 的第一根专线。
1995 年马云开始创业并推出了一个 web 网站 中国黄页
1999 年创建阿里巴巴 www.alibabagroup.com
2003 5 10 日创立淘宝网
2004 12 月,马云创立第三方网上支付平台支付宝(蚂蚁金服旗下,共有蚂蚁金服支付宝、余额宝、招 财宝、蚂蚁聚宝、网商银行、蚂蚁花呗、芝麻信用等子业务板块)
2012 1 11 日淘宝商城正式更名为 天猫
2014 9 19 日里巴巴集团于纽约证券交易所正式挂牌上市

(1)Web 服务介绍
主要分为Apache与ngnix
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

不论磁盘和网络 I/O
每次 I/O ,都要经由两个阶段:
第一步:将数据从文件先加载至内核内存空间(缓冲区),等待数据准备完成,时间较长
第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,时间较短
(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

 useradd -s /sbin/nologin -M nginx
2.解压
tar zxf nginx-1.24.0.tar.gz
tar zxf echo-nginx-module-0.63.tar.gz
ls 查看一下是否解压
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 install
安装完成有这四个文件:
[root@Nginx nginx-1.24.0]# ls /usr/local/nginx/
conf html logs sbin
conf :保存 nginx 所有的配置文件,其中 nginx.conf nginx 服务器的最核心最主要的配置文件,其他 的.conf 则是用来配置 nginx 相关的功能的,例如 fastcgi 功能使用的是 fastcgi.conf fastcgi_params 两个文件,配置文件一般都有一个样板配置文件,是以.default 为后缀,使用时可将其复制并将 default 后缀 去掉即可。
html目录中保存了 nginx 服务器的 web 文件,但是可以更改为其他目录保存 web 文件 , 另外还有一个 50x web 文件是默认的错误页面提示页面。
logs :用来保存 nginx 服务器的访问日志错误日志等日志, logs 目录可以放在其他路径,比
/var/logs/nginx 里面。
sbin :保存 nginx 二进制启动脚本,可以接受不同的参数以实现不同的功能。
查看版本号
nginx -v

三、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.全站加密:
基于通信安全考虑公司网站要求全站 https ,因此要求将在不影响用户请求的情况下将 http 请求全
部自动跳转至 https ,另外也可以实现部分 location 跳转
cd /usr/local/nginx/conf.d/
vim var.conf

重启服务 nginx -s reload

测试:访问www.xl.com

c此时自动跳转到https

2.全站搜索错误跳转
当用户访问到公司网站的时输入了一个错误的 URL ,可以将用户重定向至官网首页
cd /usr/local/nginx/conf.d/
vim var.conf

重启服务 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 

源码编译nginx
./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 --add-module=/root/memc-nginx-module-0.20 --add-module=/root/srcache-nginx-module-0.33
停止nginx然后编译安装
make && make install
2.php
cd php-8.3.9/   切换到这个目录下
下载安装包

 yum install -y bzip2 systemd-devel libxml2-devel sqlite-devel libpng-devel libcurl-devel oniguruma-devel
编译
./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --enable-fpm --with-fpm-user=nginx --with-fpm-group=nginx --with-curl --with-iconv --with-mhash --with-zlib --with-openssl --enable-mysqlnd --with-mysqli --with-pdo-mysql --disable-debug --enable-sockets --enable-soap --enable-xml --enable-ftp --enable-gd --enable-exif --enable-mbstring --enable-bcmath --with-fpm-systemd
安装

 make && make install
 

(2)php相关配置优化

(1)pid = run/php-fpm.pid#指定pid文件存放位置

(2)修改时区
生成启动文件
 cp sapi/fpm/php-fpm.service /lib/systemd/system/
 vim /lib/systemd/system/php-fpm.service
注释该内容
(4)更改环境变量

(3)nginx-php的配置方法

编辑nginx配置文件:

编写php的首页内容
在windows中做好本地解析
C:\Windows\System32\drivers\etc\hosts中
访问www.xl.org/index.php
nginx和php的缓存优化
(4)nginx-mencache高速缓存
配置文件
cp example.php memcache.php /data/web/php/
 
 vim /data/web/php/memcache.php
 vim /usr/local/php/etc/php.ini
 systemctl restart php-fpm.service 
重启php-fpm 查看memcache模块是否成功添加
[root@nginx memcache-8.2]# php -m | grep m
...
mbstring
memcache        #如果有模块就添加好了
mysqli
mysqlnd
...
部署memcached
#下载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"
在windows中做好本地解析
C:\Windows\System32\drivers\etc\hosts中 做解析
添加 php.timinglee.org
测试:

访问 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值