1. 项目级别划分2. 单体架构3. 集群5. Nginx详细介绍6. 反向代理之路由7. Nginx安装后的 目录结构详解
7.1 html目录7.2 sbin目录7.3 conf目录 8. Nginx的进程模型
8.1 Nginx的进程8.2 worker进程8.3 master进程 9. Nginx处理Web请求机制
9.1 worker抢占机制9.2 Nginx 事件处理9.3 Nginx 设置并发数 10. nginx.conf 配置文件的 配置结构11. nginx.conf 配置文件的 详细解释
11.1 nginx.conf详细解释11.2 nginx.conf的http模块 12. nginx.pid文件打开失败和失效的解决办法13. nginx常用的命令详解14. Nginx日志分割
14.1 手动切割日志14.2 定时切割日志 15. 使用nginx为静态资源提供服务16. Gzip压缩提升效率17. location的匹配规则解析
17.1 精准匹配17.2 location的正则表达式 18. DNS解析域名19. 解决Nginx的跨域支持问题
1. 项目级别划分2. 单体架构
单体架构的优点:
小团队成型即可完成开发-测试-上线。迭代周期短,速度快。打包方便,运维省事。
单体架构的缺点:
单节点宕机造成所有服务不可用。(可以通过集群解决,实现高并发性和高可用性。)耦合度太高(迭代,测试,部署)。(可以通过分布式,微服务)单节点并发能力有限。(可以通过负载均衡等方式来解决,实现高并发。) 3. 集群
集群和分布式一定搞清楚。
如果多服务器共同的实现一个业务,这就可以称之为集群。如果多个计算机节点运行的业务不同,这就可以称之为分布式。
集群的优势:
提高系统性能。提高系统可用性。可扩展性高(当用户访问量变多变少,我们可以增加减少计算机节点)。
集群的注意点:
集群的用户会话。集群中的业务都是定时任务。集群搭建必须内网互通。 5. Nginx详细介绍
常见的几种服务器:
通过不同的url路由来确定去哪台服务器上运行,一般静态资源的文件也都会有一个专门的路由匹配。
html目录:
sbin目录存放对nginx执行关闭重新加载等操作的命令。
7.3 conf目录conf目录就是用来存放配置配置文件的。nginx.conf文件是我们的主要进行配置文件的。
nginx进程有两个:
matster process只有一个,master进程是负责管理"worker"进程的,除了管理worker进程,master进程还负责读取配置文件、判断配置文件语法的工作。worker process默认只有一个,可以配置多个。worker进程负责接受处理请求,就是为master进程服务的。
8.2 worker进程
在nginx.conf配置文件可以对worker进程数量进行修改。
./nginx -t 命令:来检测我们的配置nginx.conf配置文件是Ok的!
没问题就是ok,有问题就报错。
8.3 master进程
master进程会对每一个worker进程进行监控。当worker进程发生了异常退出了,那么master进程会立刻创建一个新的worker进程出来。
master进程可以给worker进程发送一些信号,例如我们执行nginx的退出重新加载等等命令时,master会向worker发送退出重新加载等信号。
当我们的master发给worker关闭指令,worker是先将自己内部的请求处理完成之后在进行关闭!
9. Nginx处理Web请求机制 9.1 worker抢占机制Nginx支持着一个处理的并发数可以达到几十万甚至几百万。
为什么Nginx会有这样的效果?
9.2 Nginx 事件处理传统服务器事件处理:
nginx事件处理:
当客户请求发生阻塞,worker会先处理其他请求。这样worker就不会跟着客户请求阻塞而阻塞了。
9.3 Nginx 设置并发数
我们可以限制nginx的最大连接数,也就是并发数。
nginx的并发数是可以设置的,设置大小要根据硬件和用户请求数总和判断,如果配置的太高硬件cpu可能承受不住;如果设置太小用户请求比较多的话么,就会让客户端卡顿。
在nginx.conf文件中的events中可以配置最大连接数和事件模式。
nginx.conf的配置结构很清晰的,就像下图一样,main代表的是整个nginx.conf文件(相当于一个容器的效果)。
直接在main中配置的叫做全局变量。之后就是event模块和http模块。
nginx.conf的指令:
而下面的像server{ … }中的{ }叫做指令块。
我们要记住但凡无论在代码和配置中,碰到$开头的一般都是内置参数。
location定义的路由我们可以直接访问。
user nobody;
配置worker进程,以什么用户的权限来操作。
可以通过ps查看一下nginx的进程,master是以root用户权限来操作;而worker是以nobody用户权限来操作。
worker_processes 2;
配置多少个worker进程,一般最好的效果就是我们cpu有几个就配置几个(前提是服务器上面没啥东西运行)。
error_log logs/error.log debug;
配置错误日志路径和级别。
pid logs/nginx.pid;
pid就是进程id(master进程的id)和它存放的位置。
events{…}指令块
配置工作模式和最大连接数量(并发量)。
http{…}指令块
http模块的相关配置。
见下节。
11.2 nginx.conf的http模块这一节全是http模块的指令。
include mime.types;
include导入外部文件,mime.types包含需要参数类型,很重要!
log_format main ‘xxx’; 和 access_log logs/access.log main;
对于log_format的一些$内置属性,内容可以自行百度一下。
sendfile on; 和 tcp_nopush on;
sendfile on发送文件,默认是打开的。tcp_nopush on默认是关闭的。tcp_nopush 配置和 tcp_nodelay “互斥”,tcp_nopush可以配置一次发送数据的包大小。也就是说,它不是按时间累计 0.2 秒后发送包,而是当包累计到一定大小后就发送。sendfile on和tcp_nopush on是搭配使用的,只有先开启了sendfile才能开启tcp_nopush。
keepalive_timeout 65;
客户端和nginx服务器的超时时间。
gzip on;
打开gzip压缩,这样会将html,js等文件进行压缩,从而让文件体积变小自然效率就变高了。但是,同样既然是压缩,那么nginx服务器cpu也肯定有压力的。
server{…}
server就代表一个虚拟服务器!!!server可以设置多个,根据server_name不同的域名访问不同的server虚拟服务器。listen 80; 当前server监听端口号。server_name localhost; 为虚拟服务器的设别路径,一般我们设置成自己的域名,域名格式也有很多例如:www.itholms.*,~.*itholms.com等。location / {} 来映射url的。error_page 500 502 503 504 /50x.html;当发生错误的时候,就会显示50x.html页面。
server虚拟服务器是可以创建多个的。
平时,我们可以直接定义到nginx.conf配置文件,也可以配置一个外部conf文件,然后include导入到nginx.conf文件中。
问题一:目录不存在,导致无法读取nginx.pid文件。
问题二:nginx.pid文件失效了。
对于nginx的一些命令参数,我们可以通过-h来查看相关参数的信。
nginx常用的命令:
./nginx -s stop 命令:这种方式对于用户的请求是不友好的,一旦执行这种命令,用户的所有请求全部终止。./niginx -s quit 命令:这种方式是等待请求处理完成后,再关闭nginx服务。./nginx -s reload 命令:重新加载nginx配置文件。./nginx -t 命令:检测nginx.conf的配置文件的的格式是否正确,正确返回ok,不正确就会报错。./nginx -v 命令:显示当前nginx的版本。./nginx -V 命令:非常详细的显示当前nginx的版本和一些附带环境当时的配置信息等等。./nginx -h 或 -? 命令:显示nginx的所有参数信息,如果忘记了就可以使用他们两个来查看。./nginx -c /目录/nginx.conf 命令:指定核心配置文件来运行nginx服务。 14. Nginx日志分割 14.1 手动切割日志
nginx的日志一般就只有两个:
随着时间的推移,我们的日志肯定越来越多这样我们查看日志就非常不方便,所以就有了分割日志。
第一种方式:手动切割日志,创建.sh的shell脚本文件。这种脚本文件一般我们创建在sbin目录下,也方便我们一起执行nginx的相关命令。
下图就是就是一个相关shell文件中的信息,其实就是全局配置 + 执行的命令就可以了。
#!/bin/bash
LOG_PATH="/usr/local/nginx/logs/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/usr/local/nginx/logs/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
# 向Nginx主进程发送信号,用于重新打开日志文件。
kill -USR1 `cat $PID`
# 注意上面命令不要有多余的空格,不然会报错!
需要注意的是linux的一些.sh文件必须要权限才能去修改相关的文件。因此我们还需要执行chomd +x命令给文件添加权限。
14.2 定时切割日志第二种方式:使用定时任务来定时切割日志。其实定时切割日志就是在手动切割日志的.sh文件中,定时的去执行.sh文件的命令。
第一步:安装定时任务:执行apt-get install crontabs命令。(一般系统都自带。)
第二步:使用crontab -l 来查看定时任务的列表。再使用crontab -e 来添加一个定时任务。
# 格式相关,去菜鸟教程查看。 */1 * * * * /usr/local/nginx/sbin/cut_log.sh
(cron定时很常用,每天给数据库备份定时也可以通过这种方式,每天定时来备份。)
第三步:重启定时任务,具体命令如下:
既然是为静态资源提供服务,必然需要创建一个虚拟主机server。
我们可以在外部的创建一个conf文件,之后在导入nginx.conf的http模块。
例如:创建了一个static.conf文件,而我们的静态文件存储到/opt/static目录下,就可以定义下方的location映射路径。
注意:在同一个server中,location的映射路径是不能相同的,不然虚拟主机就混乱了。
还有一点就是注意location中映射的路径前面是否有斜杠,有斜杆代表绝对路径,没有斜杠代表相对路径。
我们也可以设置一种别名的效果,就是location中的alias指令来实现。
16. Gzip压缩提升效率提升效率就是nginx.conf文件中的http模块下的gzip on指令。
如果开启对应gzip相关的设置如下:
gzip on;指令:开启gzip压缩功能,目的:提高传输效率,节约带宽。gzip_min_length 1;指令:限制最小压缩,这里小于1字节的文件就不会被压缩了。gzip_comp_level 3;指令:定义压缩的级别(也就是压缩比,文件越大,压缩越多,但是cpu使用会越多。)gzip_types text/plain application/x-javascript text/css text/html application/xml; 指令:定义压缩文件的类型(这里只是提示了部分)。
17. location的匹配规则解析 17.1 精准匹配location精准匹配:
=开头表示精准匹配。
我们使用=号就能做到精准匹配的效果。
location正则表达式:
=:表示精确匹配。~:表示区分大小写的正则表达式。~*:表示不区分大小写。^~: 表示以某个字符路径开头请求。例如:指定的路径是/opt/static/img,那么只能访问/opt/static/img下的内容。
例如:下面是~*的演示:
server {
listen 89;
server_name localhost;
# 正则表达式。* 代表不区分大小写。
# 这里的意思是所有匹配结尾相同的都在/opt/static下面查找。
location ~* .(GIF|png|bmp|jpg|jpeg) {
root /opt/static;
}
}
这样我们随便访问一张图片,就可以在/opt/static中查找。
例如:下面是^~的演示:
server {
listen 89;
server_name localhost;
# ^~ 以某个字符路径开头请求。这里的意思是只能匹配/opt/static/img下的内容。
location ^~ /static/img {
root /opt;
}
}
18. DNS解析域名
对于一些域名ip,我们想看他的ip可以通过ping来查看到。
如果我们想看自己的外网ip地址,可以直接百度ip来查看到。
DNS域名解析的流程:
平时我们在本地也有域名映射效果,就是我们常见的localhost。
对于一些ip我们可以通过一些特殊工具来映射域名效果。
SwitchHosts软件:
CORS(Cross-Origin Resource Sharing):跨域资源共享。
允许浏览器向跨Origin的服务器发起js请求获取响应。
有一下几种形式来获取跨域的数据:
前端ajax可以以jsonp的形式去获取数据。
对于springboot服务器,通过spring boot cross 去进行一个配置,来达到服务器的一个跨域支持。
对于nginx想要实现跨域支持,就需要配置虚拟主机中的一些内容。完成下面配置当别人的域名或服务器来访问我们的数据时,就可以访问了。
server {
listen 89;
server_name localhost;
# 允许跨域请求的域,*代表所有。
add_header 'Access-Control-Allow-Origin' *;
# 允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许请求的方法,比如:get,post,put,delete
add_header 'Access-Control-Allow-Methods' *;
# 允许请求的header请求头
add_header 'Access-Control-Allow-Headers' *;
location ^~ /static/img {
root /opt;
}
}
请求头中的 Origin 和 Referer 来表示请求链接的来源。所有跨域请求(CORS)都会添加Origin请求头。
Origin 指示了请求来自于哪个站点,只有服务器名,不包含路径信息,浏览器自动添加到http请求 Header 中,无需手动设置。Referer 指示了请求来自于哪个具体页面,包含服务器名和路径的详细URL,浏览器自动添加到http请求 Header 中,无需手动设置。



