01.Nginx基础知识

🐘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 实验

我们平常用的都是基于域名访问所以这里就不举例子了

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值