🐘1.网络IO模型(时间关系,以后会重新补上)
1.1 同步
1.2 异步
1.3 阻塞
1.4 非阻塞
1.5 同步阻塞,同步非阻塞,异步阻塞,异步非阻塞
🐘2.Nginx基本介绍
Nginx是一个开源且高性能、可靠的Http Web服务、代理服务。(现在nginx被F5公司以6.7亿收购)
1.开源: 直接获取源代码 (c语言)
2.高性能: 支持海量并发 (峰值能达到2~3万)
3.高可靠: 服务稳定 (宕机时间可达到4个9或者5个9,运维术语)
4个9:(1-99.99%)36524=0.876小时=52.6分钟,表示该系统在连续运行1年时间里最多可能的业务中断时间是52.6分钟。
5个9:(1-99.999%)36524*60=5.26分钟,表示该系统在连续运行1年时间里最多可能的业务中断时间是5.26分钟。
🐘3.nginx 主要优势(为什么要选则nginx?)nginx排名
3.1 高性能
通常正常情况下,单词请求会得到更快的响应。另一方面在高峰期(如nginx有数以万千的并非请求),nginx可以比其他web服务器更快的响应请求
3.2 高扩展性 nginx官方模块
Nginx功能模块化,代码模块化(易读,便于二次开发,对于开发人员非常友好)
nginx官方提供了非常多的优秀模块提供使用。这些模块都可以实现快速增加和减少。
3.3 高可靠性
所谓的高可靠性,是指Nginx可以在服务器上持续不间断的运行,而很多web服务器往往运行几周或几个月就需要进行一次重启。对于nginx这样的一个高并发,高性能的反向代理服务器而言,他往往运行网站架构的最前端,那么此时如果我们企业如果想提供9999,99999,对于nginx持续运行能够宕机的时间,一年可能只能以秒来计算,所以在这样的一个角色中,nginx的高可靠性为我们提供了非常好的保证。
3.4 热部署
热部署指的是不停止服务的情况下升级Nginx。由于nginx的master管理进程与worker工作进程的分离设计,使得nginx能够在7×24小时不间断服务的前提下,升级nginx的可执行文件。当然,它也支持不停止服务更新配置,更换日志文件等功能。
3.5 轻量级
功能模块少(源代码仅保留http与核心模块代码,其余不够核心代码会作为插件来安装)
3.6 互联网公司都选择nginx
1.Nginx技术成熟,具备的功能是企业最常使用而且最需要的,如代理,代理缓存,负载均衡,静态资源,动静分离,https,lnmp,lnmt等等
2适合当前主流架构趋势, 微服务、云架构、中间层
3.统一技术栈, 降低维护成本, 降低技术更新成本。.
3.7 Nginx采用Epool网络模型,Apache采用Select模型
Epool网络模型
当用户发起一次请求,epoll模型会直接进行处理,效率高效
Select网络模型
当用户发起一次请求,select模型就会进行一次遍历扫描,从而导致性能低下
🐘4.nginx应用场景
4.1 web服务
如下图是网站的基本架构,首先用户请求先到达nginx,然后在到tomcat或php这样的应用服务器。然后应用服务期再去访问redis,mysql这样的数据库,提供基本的数据功能
4.2 负载均衡
那么这里有一个问题,我们的程序代码要求开发效率高,所以他的运行效率是很低的,或者说它并发是受限的,所以我们需要很多的应用服务器组成一个集群,为更多的用户提供访问。而应用服务器一旦构成一个集群,则需要nginx具有反向代理功能,这样可以将动态请求传到给集群服务。
那么一定会带来两个需求
1.应用服务器需要动态扩展
2.有些服务出问题需要容灾
那么我们的反向代理必须具备负载的均衡功能,也就是负载均衡。
1.负载均衡是反向代理的一种方式,反向代理衍生一种功能叫做负载均衡
2.代理和负载均衡的区别:
方向代理只能代理一台节点,负载均衡能代理多台节点
4.3 代理缓存
随着我们网络链路的增长,用户体验到延时会增加。如果我们能把一段时间内不会发生变化的“动态”内容,缓存在nginx中。由nginx直接向用户提供访问,那么这样用户的请求时延迟就会减少。所以在这里反向代理会衍生出另外一个功能"缓存",用它来加速我们的访问。
4.4 静态资源服务(静态加速)
在很多时候我们访问docs,pdf,mp4,png等这样的静态资源时,是没必要,将这些请求通过Nginx交给后端应用服务器,我们只需要通过nginx直接处理这些“静态资源”即可。
4.5 动静分离 nginx+tomcat
4.6 安全服务 HTTPS
当我们使用http网站时,可能会遭受到劫持和篡改,如果使用https安全通讯协议,那么数据在传输过程中是加密的,从而能有效的避免黑客窃取或者篡改数据信息,同时也能避免网站在传输过程中的信息泄露,大大提升了我们网站的安全性。
🐘5.nginx 相关文件
为了让大家更清晰的了解Nginx软件的全貌,可使用rpm -ql nginx
查看整体的目录结构及对应的功能,如下表格整理了Nginx比较重要的配置文件。
5.1 Nginx主配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/nginx.conf | 配置文件 | nginx主配置文件 |
/etc/nginx/conf.d/default.conf | 配置文件 | 默认网站配置文件 |
5.2 Nginx代理相关参数文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/fastcgi_params | 配置文件 | Fastcgi代理配置文件 |
/etc/nginx/scgi_params | 配置文件 | scgi代理配置文件 |
/etc/nginx/uwsgi_params | 配置文件 | uwsgi代理配置文件 |
5.3Nginx编码相关配置文件
路径 | 类型 | 作用 |
---|---|---|
/etc/nginx/win-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-utf | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/koi-win | 配置文件 | Nginx编码转换映射文件 |
/etc/nginx/mime.types | 配置文件 | Content-Type与扩展名 |
5.4 Nginx管理相关命令
路径 | 类型 | 作用 |
---|---|---|
/usr/sbin/nginx | 命令 | Nginx命令行管理终端工具 |
/usr/sbin/nginx-debug | 命令 | Nginx命令行与终端调试工具 |
5.5Nginx日志相关目录与文件
路径 | 类型 | 作用 |
---|---|---|
/var/log/nginx | 目录 | Nginx默认存放日志目录 |
/etc/logrotate.d/nginx | 配置文件 | Nginx默认的日志切割 |
🐘6.nginx安装
1.源码编译=>Nginx (1.版本随意 2.安装复杂 3.升级繁琐 4.规范 5.便于管理)
2.epel仓库=>Nginx (1.版本较低 2.安装简单 3.配置不易读)
3.官方仓库=>Nginx (1.版本较新 2.安装简单 3.配置易读)💗 我们这里就用官方的吧!
6.1 点击打开nginx官网
6.2 部署nginx服务
6.2.1 安装nginx依赖
[root@web ~]# yum install -y gcc gcc-c++ autoconf pcre pcre-devel make automake wget httpd-tools vim tree
6.2.2 配置官方yum仓库
[root@web ~]# vim /etc/yum.repos.d/nginx.repo
[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1
6.2.3 安装nginx服务
[root@web ~]# yum install nginx -y
6.2.4 启动并设置开机自启
[root@web ~]# systemctl enable nginx
[root@web ~]# systemctl start nginx
6.2.5 验证是否启动成功
1.端口检测
[root@web ~]# netstat -lntup|grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1221/nginx: master
2.检测进程
[root@web ~]# ps -ef|grep nginx
root 1221 1 0 16:54 ? 00:00:00 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
nginx 1222 1221 0 16:54 ? 00:00:00 nginx: worker process
3.打开浏览器检测
打开浏览器访问:http://10.0.0.7
4.检查nginx的软件版本
[root@web ~]# nginx -v
nginx version: nginx/1.16.0
5.检查nginx的编译参数
[root@web ~]# nginx -V
nginx version: nginx/1.16.0
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
built with OpenSSL 1.0.2k-fips 26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log --http-log-path=/var/log/nginx/access.log --pid-path=/var/run/nginx.pid --lock-path=/var/run/nginx.lock --http-client-body-temp-path=/var/cache/nginx/client_temp --http-proxy-temp-path=/var/cache/nginx/proxy_temp --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp --http-scgi-temp-path=/var/cache/nginx/scgi_temp --user=nginx --group=nginx --with-compat --with-file-aio --with-threads --with-http_addition_module --with-http_auth_request_module --with-http_dav_module --with-http_flv_module --with-http_gunzip_module --with-http_gzip_static_module --with-http_mp4_module --with-http_random_index_module --with-http_realip_module --with-http_secure_link_module --with-http_slice_module --with-http_ssl_module --with-http_stub_status_module --with-http_sub_module --with-http_v2_module --with-mail --with-mail_ssl_module --with-stream --with-stream_realip_module --with-stream_ssl_module --with-stream_ssl_preread_module --with-cc-opt='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --param=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC' --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pie'
🐘7.nginx目录结构
[root@web ~]# tree /application/nginx/
/application/nginx/
|-- client_body_temp
|-- conf #这是Nginx所有配置文件的目录,极其重要
| |-- fastcgi.conf #fastcgi相关参数的配置文件
| |-- fastcgi.conf.default #fastcgi.conf的原始备份
| |-- fastcgi_params #fastcgi的参数文件
| |-- fastcgi_params.default
| |-- koi-utf
| |-- koi-win
| |-- mime.types #媒体类型,
| |-- mime.types.default
| |-- nginx.conf #这是Nginx默认的主配置文件
| |-- nginx.conf.default
| |-- scgi_params #scgi相关参数文件,一般用不到
| |-- scgi_params.default
| |-- uwsgi_params #uwsgi相关参数文件,一般用不到
| |-- uwsgi_params.default
| `-- win-utf
|-- fastcgi_temp #fastcgi临时数据目录
|-- html #这是编译安装时Nginx的默认站点目录,类似
**Apache的默认站点htdocs目录**
| |--50x.html #错误页面优雅替代显示文件,例如:出现502错误时会调用此页面
# error_page 500502503504 /50x.html;
| `-- index.html #默认的首页文件,首页文件名字是在nginx.conf中事先定义好的。
|-- logs #这是Nginx默认的日志路径,包括错误日志及访问日志
| |-- access.log #这是Nginx的默认访问日志文件,使用tail -f access.log,可以实时观看网站用户访问情况信息
| |-- error.log #这是Nginx的错误日志文件,如果Nginx出现启动故障等问题,一定要看看这个错误日志
| `-- nginx.pid #Nginx的pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
|-- proxy_temp #临时目录
|-- sbin #这是Nginx命令的目录,如Nginx的启动命令nginx
| `-- nginx #Nginx的启动命令nginx
|-- scgi_temp #临时目录
`-- uwsgi_temp #临时目录
9 directories,21 files
🐘8 nginx配置文件
Nginx主配置文件/etc/nginx/nginx.conf是一个纯文本类型的文件,整个配置文件是以区块的形式组成的。一般,每个区块以一对大括号{}来表示开始与结束。
Nginx主配置文件整体分为三块进行学习,分别是CoreModule(核心模块),EventModule(事件驱动模块),HttpCoreModule(http内核模块)
8.1 Core Module(核心模块)
1.user nginx; # Nginx进程的运行用户身份
2.worker_processes 1; # Nginx运行的worker进程数
ps aux |grep nginx 查看nginx进程数
3. error_log /var/log/nginx/error.log warn; # Nginx错误日志存放的路径
系统将讯息分为七个主要的等级,依序是由不重要排列到重要讯息等级:
info:仅是一些基本的讯息说明而已;
notice:比 info 还需要被注意到的一些信息内容;
warning 或 warn:警示讯息,可能有问题,但是还不至于影响到某个 daemon 运作。
err 或 error :一些重大的错误讯息,这就要去找原因了。
crit:比 error 还要严重的错误信息,crit 是临界点 (critical) 的缩写,已经很严重了!
alert:警告警告,已经很有问题的等级,比 crit 还要严重!
emerg 或 panic:疼痛等级,意指系统已经几乎要当机的状态! 很严重的错误信息了。
除了这些有等级的讯息外,还有两个特殊的等级,那就是 debug(错误侦测等级) 与 none (不需登录等级) 两个,当要作一些错误侦测,或者是忽略掉某些服务的信息时,就用这俩!
4.pid /var/run/nginx.pid; # Nginx进程运行的PID号
杀死进程 可以使用调用变量的方式 kill $(cat /var/run/nginx.pid)
8.2 Event Module(事件驱动模块)
events {
worker_connections 1024; #每个worker进程能接受的最大连接数
use epoll; #选择使用那种网络模型(默认规则)
}
8.3 Http CoreModule(http内核模块)
http {
1.include /etc/nginx/mime.types; #包含了nginx支持的所有类型
2.default_type application/octet-stream;
application/octet-stream 这是一种格式,访问网页就自动下载(在开发者工具http头信息中有显示)
3.#日志格式
log_format main (main是定义日志格式后的赋予的名称)
所以可以创建多个log_format 名称
$remote_addr #来源客户端ip地址
$remote_user #来源的用户名称
$time_local #时间戳
$request #1.请求的方法
#2.请求的uri
#3.http协议版本
'$status #状态码
$body_bytes_sent #发送字节的大小
"$http_referer" ' #记录上一次页面从哪里过来
'"$http_user_agent" #来源的终端设备
"$http_x_forwarded_for"'; #记录客户都真实IP地址(代理场景下)
4.#访问日志的路径 访问日志的存储格式是main格式, main格式在log_format中进行定义
access_log /var/log/nginx/access.log main;
访问日志记录会存在 /var/log/nginx/access.log 这个路径下
main 是一种日志格式,由上面 "log_format" 日志格式中的变量所定义
5.#sendfile on;
#tcp_nopush on;
6.keepalive_timeout 65; #超时时间
7.#gzip on; #将你的资源进行压缩处理
8. include /etc/nginx/conf.d/*.conf; #包含 *.conf
💗8.4 /etc/nginx/nginx.conf与/etc/nginx/conf.d/*.conf的关系图
8.5 整个配置文件综合起来
nginx配置文件
(进程能够以什么样的方式访问一个文件, 取决运行这个进程的用户身份对这个文件拥有什么样的权限)
[root@web01 ~]# cat /etc/nginx/nginx.conf
#CoreModule(核心模块)
user nginx; # Nginx进程的运行用户身份
worker_processes 1; # Nginx运行的worker进程数
error_log /var/log/nginx/error.log warn; # Nginx错误日志存放的路径
pid /var/run/nginx.pid; # Nginx进程运行的PID号
#EventModule(事件驱动模块)
events {
worker_connections 1024; #每个worker进程能接受的最大连接数
use epoll; #选择使用那种网络模型(默认规则)
}
#HttpCoreModule(http内核模块)
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
#日志格式
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
#访问日志的路径 访问日志的存储格式是main格式, main格式在log_format中进行定义
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65; #超时时间
#gzip on;
include /etc/nginx/conf.d/*.conf; #包含 *.conf
8.6 /etc/nginx/conf.d/*.conf文件配置
#server<--定义网站
server {
listen 80; #监听80端口
server_name localhost; #网站的域名
location / { #匹配网站的uri
root /usr/share/nginx/html; #返回资源的具体路径
index index.html index.htm; #返回的具体资源名称
}
}
🐘9 nginx运行一个游戏网站
9.0 注释默认配置default.conf
[root@web01 conf.d] gzip default.conf #压缩注释,因为/etc/nginx/nginx.conf这个配置文件包含匹配的配置文件是以.conf结尾的配置文件
default.conf.gz #查看压缩包内容
[root@web01 conf.d] zcat default.conf.gz
9.1 新增nginx配置文件
[root@web01 conf.d]# cat /etc/nginx/conf.d/game.conf
server {
listen 80;
server_name game.cry.com;
location / {
root /code/st;
index index.html;
}
}
9.2 放置游戏源代码文件至nginx配置文件root指定的目录
[root@web01 conf.d]# mkdir /code && cd /code
[root@web01 code]# rz -E
rz waiting to receive.
[root@web01 code]# ls
st_(1).zip
[root@web01 code]# unzip st_\(1\).zip
[root@web01 code]# ls
st st_(1).zip
9.2.1 查看压缩包目录结构
我先把我的游戏代码放在windows桌面上 我们可以去看一下这个文件本身有没有带目录结构(这里压缩包里带了名叫ST的目录结构,所以我们解压到/code下会多出一个st的目录)
9.2.2 上传代码解压到指定的站点目录下/code/st
9.2.3 查看一下/code下的st目录
9.3 检查nginx的语法是否存在错误
[root@web01 code]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
9.4 重载|重启Nginx [reload|restart]
[root@web01 code]# systemctl reload nginx #用重载或者重启都可以
9.5 设置本地hosts劫持
9.5.1 windows系统
9.5.1.1 我们找到windowsC盘下面的System32下面的drivers下面的etc下面的hosts
9.5.1.2 进行域名配置
9.5.2 苹果系统
MacBook-Pro:~ cry$ sudo vim /etc/hosts
10.0.0.7 game.cry.com
9.6 通过浏览器检测
🐘10 nginx运行多个游戏网站(新添加一个游戏网站,步骤和上面类似)
10.1 新增一个nginx的配置文件
[root@web01 code2]# cat /etc/nginx/conf.d/gd.cry.conf
server {
listen 80;
server_name gd.cry.com;
location / {
root /code2/gedou;
index index.html;
}
}
10.2 检测nginx语句,重载服务
[root@web01 code2]# nginx -t
[root@web01 code2]# systemctl restart nginx
10.3 创建代码存放路径
[root@web01 ~]# mkdir -p /code2
[root@web01 ~]# cd /code2
10.4 上传代码
10.4.1 找到代码位置 (这里关乎location匹配 里面包含一个名字为gedou目录结构所以我直接location匹配uri写/code2/gedou 你也可以访问的时候 gd.cry.com/gedou)
10.4.2 rz上传到/code2下,并且进行解压
10.4.3 查看目录信息
10.5 配置域名劫持
10.6 通过浏览器域名访问gd.cry.com
🐘11 nginx访问网站的原理(详细过程)
访问流程
1.使用浏览器——>html.cry.com
2.http://html.cry.com
3.Dns解析—>10.0.0.7(本地hosts劫持)
4.10.0.0.1(随机端口)---->10.0.0.7(80)---->TCP连接
5.发送http请求
5.1请求的协议:http 1.1
5.2请求的方法:①基于IP
②基于端口
③基于域名
5.3请求的域名 : Host:html.cry.com
5.4请求的uri : /
http://html.cry.com/—>/code3/index.html
🐘12 nginx虚拟主机,在一个nginx上运行多个网站?
nginx虚拟主机(在一台服务器上运行多个网站)
虚拟机主机实现方式有三种:
①基于IP
②基于端口
③基于域名
12.1 基于多个IP实现方式 (很少)
12.1.1 原理图
12.1.2 实验
①规划
我们这个实验用IP 10.0.0.7/172.16.1.7
目的
访问10.0.0.7 显示出10-wan
访问172.16.1.7 显示出172-lan
②配置
1.创建实验的站点目录
mkdir -p /code/{wan,lan}
2.准备索引文件index.html
echo "10-wan" >/code/wan/index.html
echo "172-lan" >/code/lan/index.html
3.添加nginx配置文件(/etc/nginx/conf.d 下)
server {
listen 10.0.0.7:80;
location / {
root /code/wan;
index index.html;
}
}
server {
listen 172.16.1.7:80;
location / {
root /code/lan;
index index.html;
}
}
4.检测语言,重启服务
nginx -t
systemctl restart nginx
③测试
curl http://10.0.0.7
--->10-wan
curl http://172.16.1.7
--->172-lan
12.2 基于不同的端口方式 (测试)
12.2.1 原理图
12.2.2 实验
①规划
我们这个实验是基于端口 你可以外网也可以用内网 10.0.0.7(172.16.1.7):8080 / 10.0.0.7(172.16.1.7):8081
场景:内网环境或者测试环境,没有域名,通过多个端口来区分不同的项目
目的:
访问10.0.0.7(172.16.1.7):8080 显示出 over 8080
访问10.0.0.7(172.16.1.7):8081 显示出 over 8081
②配置
1.创建实验的站点目录
mkdir -p /code/{8080,8081}
2.创建索引文件index.html
echo "over 8080" >/code/8080/index.html
echo "over 8081" >/code/8080/index.html
3.配置nginx文件(/etc/nginx/conf.d 下)
server {
listen 8080;
location / {
root /code/8080;
index index.html;
}
}
server {
listen 8081;
location / {
root /code/8081;
index index.html;
}
}
4.检查语言,重启服务
nginx -t
systemctl restart nginx
③测试
curl http://10.0.0.7:8080
--->over 8080
curl http://10.0.0.7:8081
--->over 8081
12.3 基于不同的域名方式 (生产)
12.3.1 原理图
12.3.2 实验
我们平常用的都是基于域名访问所以这里就不举例子了