Day48-Nginx-Web服务入门实践
1. 什么是Nginx
Nginx (“engine x”) 是一个开源的,具备高性能、高并发、高可靠性的WWW服务和代理服务软件。
由俄罗斯人IgorSysoev开发,作者将源代码以类BSD许可证的形式开源出来供全球使用。
2019年,F5将收购 NGINX,总价值约为6.7亿美元。F5负载均衡厂商。
开源,是说可以直接获取Nginx的源代码,并且可以免费使用。
高性能,是说处理速度非常快,且消耗的资源很低。
高并发,支持并发连接1-5万,且消耗的资源很低。
高可靠,体现在服务非常稳定。
并发5万,说的是静态小文件,NGINX(5万并发)+PHP(700个并发)
资料:
F5 以6.7亿美金收购 NGINX
链接: https://mp.weixin.qq.com/s/IE2LpfBhdDAvhm6NQg3LRw
F5 收购 NGINX,一个时代的落幕
链接: https://zhuanlan.zhihu.com/p/61966442
2.为什么选择Nginx
- 开源、免费
- 功能强大、并且简单易用
- 高性能、高并发
- 高可靠性、高可扩展性(模块多,开发第三方模块)
- 社区活跃(前1万互联网网站),排名no.1,且增长快。
链接: https://w3techs.com/technologies/overview/web_server
3.nginx周边生态情况
OpenResty是一个基于Nginx与Lua的高性能Web平台,其内部集成了大量精良的Lua库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态Web应用、Web服务和动态网关。诞生于 2007 年。
Kong网关是一款基于OpenResty(Nginx+Lua模块)编写的高可用、易扩展的,由Mashape公司开源的API Gateway项目。Kong是基于NGINX和Apache Cassandra或PostgreSQL构建的,能提供易于使用的RESTful API来操作和配置API管理系统,所以它可以水平扩展多个Kong服务器,通过前置的负载均衡配置把请求均匀地分发到各个Server,来应对大批量的网络请求。
Lua是脚本语言,nginx+Lua是脚本语言,对请求过滤、控制。mysql-proxy读写分离软件使用lua开发的。
Tengine是由淘宝网发起的Web服务器项目。
链接: http://tengine.taobao.org/
4.Nginx核心企业应用场景
4.1 作为Web服务软件
Nginx是一个支持高性能、高并发的Web服务软件,它具有很多优越的特性,作为Web服务器,和Apache相比,Nginx能够支持更多的并发连接访问,而占用的资源却更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache,而且Nginx更新频率更快,社区用户更火爆。
-
Nginx是一个静态Web服务软件,使用Nginx运行HTML、JS、CSS、小图片等静态数据(此功能类似lighttpd软件)。
apache,lighttpd,IIS,Node.js -
支持动静分离功能
apache,lighttpd,IIS -
支持动态Web服务扩展
PHP(fastcgi_pass)
JAVA(proxy_pass)
Python(uwsgi_pass)
memcache(memcache_pass)
…
Nginx结合FastCGI运行PHP动态程序(使用fastcgi_pass方式)。
Nginx结合proxy_pass支持tomcat动态程序(使用proxy_pass)。
Nginx结合uwsgi_pass支持Python(使用uwsgi_pass)。
ubuntu搭建网盘LNP(FastCGI),NFS存储客户端挂载的时候LAP(Apache 通过mod_libphp.so) -
支持安全的Web服务(https)
全站HTTPS是以消耗性能为代价的,其实可以登陆用https,支付使用https。(有图)
4.2 作为反向代理或负载均衡服务软件
在反向代理或负载均衡服务方面,Nginx可以作为Web服务、PHP/Tomcat/Python等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件(最早开发这个产品的目的之一也是作为邮件代理服务),在Nginx的代理功能方面,已经支持TCP和UDP的代理,Nginx的代理功能已经越来越强大了。
-
负载均衡同类软件:
haproxy,lvs,硬件:F5,netscaler
nginx早期只支持http,现在也支持tcp/udp。
支持tcp负载:负载mysql、应用服务。 -
企业面试题:Nginx、Haproxy、LVS区别与优缺点?
链接: https://blog.csdn.net/qlj324513/article/details/81541282
链接: https://blog.csdn.net/artaganan8/article/details/87973645
作业:表格来回答
Nginx Haproxy LVS
功能1:
特点1: -
反向代理与负载均衡区别强调
代理:微商海外代购。
代理:代替别人做事。正向代理:由内向外。 代替,效率低
代替局域网内PC,请求外部应用服务。反向代理:由外向内,代替,效率低
代替外部的用户请求内部的应用服务器。负载均衡:转发、效率高(LVS)
甩手掌柜,后抛请求。 -
负载均衡和Web服务的走向
(有图)
作业:了解什么是云原生。
4.3 缓存服务器
在Web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。
- 常见缓存软件
squid,varnish,nginx,ats
(有图)
4.4 Nginx主要应用场景总结
-
静态Web服务器:
使用Nginx运行HTML、JS、CSS、小图片等静态数据(此功能类似lighttpd软件)。
-
配合运行动态Web服务器:
Nginx结合FastCGI运行PHP等动态程序(例如使用fastcgi_pass方式)。
Nginx结合proxy_pass支持Java动态程序(tomcat/resin服务)。
Nginx结合uwsgi_pass支持Python。
-
反向代理/负载均衡
http负载均衡
-
做Web缓存服务器(把文件放入内存里)。
-
支持安全的Web服务(https)
4.5 Nginx核心特点:静态小文件高并发,占用资源少。软件本身小。
企业面试时需要解答如下Nginx HTTP服务器的特色及优点:
- 支持高并发:能支持几万并发连接(特别是静态小文件业务环境)。
- 资源消耗少:在3万并发连接下,开启10个Nginx线程消耗不到200MB内存。
- 可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的haproxy软件或lvs的功能。
具备squid等专业缓存软件等的缓存功能。
4.6 Nginx是如何超越对手的?
2008冒头,当时Apache老大70%占有率,Nginx是如何超越对手的?
学习差异化:田忌赛马
- 学运维就是差异化。
- 分析apache老大缺点(select模型),5000并发。
- Web服务,高并发(符合时代的需求:处理高并发),核心采用epoll网络模型,squid,memcache都是用epoll网络模型。功能多,都实用。实用简单。
- 京东超越淘宝(杀出一片天空)。
1.全网正品。
2.当天即达。
3.价格全网最低。 - 拼多多(杀出一片天空)
1.便宜,随时退货。
2.农村市场(农村包围城市)。 - 你们如何超越运维对手啊?
1.思想加持:态度可以超越10年经验的。
2.技术上:接近(2-3年经验),知识体系系统。
4.7 Nginx epoll模型和Apache select模型区别?
企业必考面试题:Nginx epoll模型和Apache select模型区别?
Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache则使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid、Memcached软件都采用的是epoll模型。
简单总结:
1)epoll和select网络IO处理模型。
2)epoll异步网络IO模型,支持高并发。
3)select传统的网络IO模型,高并发能力弱。
4)Apache则使用的是传统的select模型,Nginx使用高并发的epoll模型。
异步和同步:
以及异步的静态化的案例
网络IO模型概述
通常来说,网络IO可以抽象成用户态和内核态之间的数据交换。一次网络数据读取操作(read),可以拆分成两个步骤:
1)网卡驱动等待数据准备好(内核态)
2)将数据从内核空间拷贝到进程空间(用户态)。根据这两个步骤处理方式不一样,我们通常把网络IO划分成阻塞IO和非阻塞IO。
1.操作系统需要两种CPU状态
内核态(Kernel Mode):运行操作系统程序、操作硬件。
用户态(User Mode):运行用户程序
网络IO可以抽象成用户态和内核态之间的数据交换。
阻塞IO和非阻塞IO
阻塞IO,同步模型
非阻塞IO,异步模型
系统调用:内核态为用户态程序提供的访问接口。
阻塞IO。用户调用网络IO相关的系统调用时(例如read),如果此时内核网卡还没有读取到网络数据,那么本次系统调用将会一直阻塞,直到对端系统发送的数据到达为止。如果对端一直没有发送数据,则本次调用将永远不会返回。
非阻塞IO。当用户调用网络IO相关的系统调用时(例如read),如果此时内核网络还没有收到网络数据,那么本次系统调用将会立即返回,并返回一个EAGAIN的错误码。
网络IO就是用户态和内核态之间的数据交换。
网络IO事件:用户态和内核态之间的数据交换的【事件】。
检测处理事件机制:网络IO模型,epoll,select,kquene。
宿管大妈版:
select模型:轮询,遍历扫描:伙伴去宿舍找你,一个一个宿舍区找,效率低。
epoll模型: 看队列,伙伴去宿舍找你,先问宿管大妈,看看在哪间宿舍,然后直奔具体宿舍。效率高。
保姆看小孩尿尿版:
小孩:用户态和内核态之间的数据交换过程。
小孩撒尿是一次网络IO事件。
select模型:小孩撒尿(网络IO事件):挨个询问,如果尿尿拉出来,带着尿尿。
epoll模型: 小孩撒尿:事先告诉所有小孩,如果要尿尿,你就站出来。
阿姨就看有没有人站出来(队列)就可以了。
一个保姆照看一群孩子,如果把孩子是否需要尿尿比作网络IO事件,select的作用就好比这个保姆挨个询问每个孩子:你要尿尿吗?如果孩子回答是,保姆则把孩子拎出来放到另外一个地方。当所有孩子询问完之后,保姆领着这些要尿尿的孩子去上厕所(处理网络IO事件)
企业面试题:Apache select和Nginx epoll模型区别
链接: https://blog.51cto.com/oldboy/1855201
链接: https://blog.csdn.net/u012167045/article/details/78388458
链接: https://blog.csdn.net/wma664620/article/details/54234132
Linux用户态和内核态?
链接: https://zhuanlan.zhihu.com/p/69554144
4.8 Nginx软件核心组成
1.Nginx可执行命令:
它是Nginx本身框架以及相关模块等构建的一个二进制文件,这个文件就相当于汽车本身,所有的功能都由它提供。
2.nginx.conf配置文件:
它相当于驾驶人员,虽然二进制可执行文件已经提供了许多的功能,但是这些功能究竟有没有开启,或者开启后定义怎 样的行为去处理请求,都是由nginx.conf这个文件决定的,所以他就相当于这个汽车的驾驶员,控制这个汽车的行为。
3.访问日志access.log:
它相当于这辆汽车经过所有地方形成的GPS轨迹,access.log会记录Nginx处理过的每一条HTTP的请求信息、响应信息。
4.错误日志error.log:
它相当于飞机的黑匣子,当出现了一些不可预期的问题时,可以通过error.log将问题定位出来。
4.9 Nginx软件安装方式选择说明
4.9.1 Linux下安装软件方法
1、rpm安装
依赖多,解决依赖困难繁琐。
2、yum安装 *****
简单快,自动解决依赖。不能选择软件版本或软件存放路径。
(补救:去官方找最新yum源提供的最新rpm包)
3、编译安装(源码编译)*****
慢、复杂、需要GCC编译器,可以自定义安装(版本、软件路径)
4、将源码制作成rpm,然后放到yum仓库,实现yum自动安装。
一次性慢 复杂,安装快,可以自定义安装(版本、软件路径)
5、二进制安装
制作RPM YUM仓库搭建
链接: https://blog.oldboyedu.com/autodeploy-rpm/
安装方式 | 优缺点 |
---|---|
rpm 安装 | 优点:简单、较快 缺点:需要找rpm 包,解决依赖很困难,无法定制化 |
yum 安装 | 优点:简单、易用、高效。自动解决依赖关系 缺点:不能选择软件版本或软件存放路径(无法定制化) |
编译安装 | 优点:可以自定义安装(选择版本、软件路径、针对性优化) 缺点:很慢、安装复杂,需要 GCC 编译器等环境 |
综合安装 | 将源码制作成rpm,然后放到本地yum仓库,实现 yum 自动安装。 优点:综合了 yum 和编译安装的所有优点。 缺点:需要提前制作,复杂,对技术人员能力要求高。 制作 RPM 、YUM 仓库搭建 https://blog.oldboyedu.com/autodeploy-rpm/ |
二进制安装 | MySOL软件一般会提供这种二进制安装方式,其它软件很少用。 |
4.9.2 Nginx 软件安装选择
1.源码编译:书里
优:1.版本随意。2.功能随意。缺:1.安装较复杂。2、安装时间长。
2.通过epel仓库yum(yum install nginx -y)
优:1.安装简单。缺:1.版本较低。2.不能定制版本。3.不能定制功能。
注:默认base仓库里有httpd。
3.通过官方仓库yum(yum install nginx -y)
优:1.安装简单。2.版本较新 3.配置更易读,老男孩推荐)
缺:1.不能定制版本。2.不能定制功能。
注:大多数情况下,使用的功能都已经放进去了。
补:
编译安装步骤(c语言代码编译3部曲)
./configure #配置
make #编译
make install #安装
4.利用源码制作符合企业需求的rpm软件包,放到yum仓库里,最后yum安装。
优:1)安装简单。2)可以随意定制。3)高度满足需求。4)安装速度快。
缺:1)编译和配置yum仓库较复杂。
rpm包定制
链接: http://blog.oldboyedu.com/autodeploy-rpm/
yum仓库搭建
链接: http://blog.oldboyedu.com/autodeploy-yum/
4.10 Nginx软件安装及部署
同时使用编译和yum安装方法
学习编译方式原因:
1)不少企业还在编译安装。2)企业有编译第三方模块需求。
学习yum方式原因
1)十分简单。2)默认编译的模块可满足大多数企业应用。
4.11 编译安装实践
- 下载源码包
mkdir -p /server/tools
cd /server/tools
wget http://nginx.org/download/nginx-1.20.1.tar.gz
############
[root@web02 tools]# ls -lh
总用量 1.1M
-rw-r--r-- 1 root root 1.1M 5月 25 23:34 nginx-1.20.1.tar.gz
- 安装依赖
yum install pcre pcre-devel -y #rewrite正则相关pcre:URL重写软件,实现伪静态\URL跳转等、SEO优化。
yum install openssl openssl-devel -y #https加密访问用它。
rpm -qa pcre pcre-devel openssl openssl-devel
- 编译安装步骤
userdel -r www
useradd -u 1111 -s /sbin/nologin www -M
id www
tar xf nginx-1.20.1.tar.gz
cd nginx-1.20.1/
./configure --user=www --group=www --prefix=/application/nginx-1.20.1/ --with-http_stub_status_module --with-http_ssl_module --with-pcre
make
make install
ln -s /application/nginx-1.20.1/ /application/nginx
lsof -i :80
/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx
netstat -lntup|grep nginx
注意:
1)每一步结尾直接echo $?验证是否正确。返回0代表步骤正确
4. 验证最终的安装是否正确。
wget 10.0.0.8
curl 10.0.0.8
或浏览器访问
5. configure参数作用
nginx -V 查看安装的参数及模块
参数作用:
--prefix=PATH 路径
--user=USER 用户
--group=GROUP 组
--with-pcre 伪静态
--with-http_stub_status_module 状态
--with-http_ssl_module 加密 443
配置环境变量PATH,加入nginx命令路径
vim /etc/profile #增加:
export PATH="/application/nginx/sbin/:$PATH"
增加后执行下面,使之生效
. /etc/profile
检查测试:
[root@web02 nginx-1.20.1]# echo $PATH
/application/nginx/sbin/:/application/nginx/sbin/:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
[root@web02 nginx-1.20.1]# nginx -t
[root@web02 nginx-1.20.1]# nginx -s reload
改成systemctl启动方式
[root@web02 nginx-1.20.1]# cat /usr/lib/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/application/nginx/logs/nginx.pid
ExecStartPre=/usr/bin/rm -f /application/nginx/logs/nginx.pid
ExecStartPre=/application/nginx/sbin/nginx -t
ExecStart=/application/nginx/sbin/nginx
ExecReload=/application/nginx/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
[root@web02 nginx-1.20.1]# chmod +x /usr/lib/systemd/system/nginx.service
[root@web02 nginx-1.20.1]# systemctl enable nginx
[root@web02 nginx-1.20.1]# pkill nginx
[root@web02 nginx-1.20.1]# systemctl start nginx
[root@web02 nginx-1.20.1]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 5504 root 6u IPv4 51393 0t0 TCP *:http (LISTEN)
---------------------------------------------------------------------
一个企业运维哥们的东西:
1、测试配置文件是否有异常:
/usr/local/nginx/sbin/nginx -t
2、启动:
/usr/local/nginx/sbin/nginx
3、指定配置文件启动(多实例):
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/config/nginx.conf
4、重新打开日志:
kill -USR1 `cat /usr/local/nginx/nginx.pid `
5、发送平滑升级信号:
kill -USR2 `cat /usr/local/nginx/nginx.pid`
6、平缓停止worker process
kill -WINCH `cat /usr/local/nginx/nginx.pid.oldbin
7、停止老的进程
kill -QUIT `cat /usr/local/nginx/nginx.pid.oldbin`
(编译安装完成)
4.12 配置官方源使用yum安装(web01 10.0.0.7)*****
- 配置nginx源
[root@web ~]# vim /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
非交互操作注意转义字符
cat > /etc/yum.repos.d/nginx.repo <<EOF
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/\$releasever/\$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true
EOF
- 安装并启动
yum install nginx -y
rpm -qa nginx
#搭建了网盘测试集群NFS存储
[root@web01 ~]# lsof -i :80
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
httpd 1149 root 4u IPv6 22941 0t0 TCP *:http (LISTEN)
[root@web01 ~]# systemctl stop httpd
[root@web01 ~]# systemctl disable httpd
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
systemctl start nginx
systemctl enable nginx
systemctl status nginx
netstat -lntup|grep nginx
- 验证最终的安装是否正确。
wget 10.0.0.7
curl 10.0.0.7
或浏览器访问
只要将结果的处理:shell编程判断
[root@web01 ~]# wget -q 10.0.0.7 &>/dev/null && echo $?
0
[root@web01 ~]# curl -s 10.0.0.7 &>/dev/null && echo $?
0
[root@web01 ~]# nginx -v
nginx version: nginx/1.20.1
(yum安装完成)