title: nginx新手入门详解
date: 2021-07-19 18:56:13
Nginx简介
一个项目或平台,用户使用量少,并发量小的情况下,一台 Tomcat 服务器就可以满足需求。但当平台用户量增多,并发量增大时,一台 Tomcat 服务器就不能够很好地支撑。于是就需要做横向扩展,多增加几台服务器,并设置一个代理服务器。用户如果要访问平台首先会经过代理服务器,代理服务器实现处理用户的请求和转发到真实服务器,也就是反向代理。在做横向扩展后,每台服务器的大小、性能可能各不相同。代理服务器需要根据用户的请求,服务器的状态等实际情况实现选择和转发,也就是负载均衡。
Nginx是一个高性能的HTTP和反向代理服务器,特点是占有内存少,并发能力强
Nginx 可以作为静态页面的 web 服务器,同时还支持 CGI 协议的动态语言,比如 pe rl 、 php
等。但是不支持 java 。 Java 程序只能通过与 tomcat 配合完成。 Nginx 专为性能优化而开发,
性能是其最重要的考量 实现上非常注重效率 ,能经受高负载的考验 有报告表明能支持高
达 50,000 个并发连接数。Tomcat 只支持 500~600 个响应。
Nginx因为多个worker机制非常有利于热部署
Nginx常用命令
-
启动:
- Windows:在Nginx根目录下执行命令nginx.exe或者直接双击nginx.exe
- Linux:在sbin目录下执行命令./nginx
-
关闭命令:在sbin 目录下执行 ./nginx s stop
-
重新加载配置文件:在sbin 目录下执行 ./nginx s reload
Nginx配置文件
Nginx配置文件是cong目录下的nginx.config
配置文件有四个代码块:
- 全局代码块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以及配置文件的引入等。例如:
# 这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是会受到硬件、软件等设备的制约 worker_processes 1;
- events代码块
events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等。
events { worker_connections 1024; # 表示每个 work process 支持的最大连接数为 1024. }
- http代码块
这算是 Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
需要注意的是:http 块也可以包括 http全局块、server 块。
- server代码块
每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。
- 全局server块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置。
- location块:一个 server 块可以配置多个 location 块。
server { listen 80; #监听端口 server_name localhost; #主机名,如果请求中的ip是该主机名,则nginx就会进入这个server块,根据下面的策略进行转发 #charset koi8-r; #access_log logs/host.access.log main; location / { #代表根目录,即请求为localhost:80时,nginx匹配以下策略 root html; index index.html index.htm; # 转发的url地址 proxy_pass http://localhost:8080; }
正向代理
正向代理是用户手动给浏览器添加代理,通过代理服务器去访问目标服务器。也就是我们常用的“梯子”,需要打开VPN手动选择节点,才能访问目标资源。
反向代理
反向代理对于客户端是无感知的,客户端只需要发出请求,然后在代理服务端对该请求进行转发,去访问目标服务器。转发的这一过程服务端对客户端是隐藏的,此时反向代理服务器和目标服务器对外就是一个服务器,暴露的是代理服务器地址,隐藏了真实服务器 IP 地址。
负载均衡
客户端发送多个请求到服务器,服务器处理请求再将结果返回给客户端。这种方式是相对单一的,仅适用于并发量不高的情况。如果在高并发情况下,服务器一般不只有一个,往往是一个服务器集群。而负载均衡就是Nginx按照一定的规则将多个请求平均分配到各个服务器中,以减轻单个服务器的压力。
负载均衡一般有几种内置策略:
- 轮询(默认):nginx按照时间先后顺序平均将请求分配到各个服务器中,同时nginx还会自动过滤掉那些宕机的服务器。
#在http代码块和server块中配置加权
#配置对应主机的转发策略,默认轮询
upstream doMain{
server 127.0.0.1:8080;
server 1.15.245.21:8080;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#配置策略
proxy_pass http://doMain;
}
- 加权:可以在配置文件中给每个服务器设置权重,届时nginx将按照权重的大小分配请求数量,权重越大分配的请求就越多。
#在http代码块和server块中配置加权
#配置对应主机的转发策略,weight是权重
upstream doMain{
server 127.0.0.1:8080 weight=1;
server 1.15.245.21:8080 weight=2;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#配置策略
proxy_pass http://doMain;
}
- ip_hash:每个请求按照ip的hash结果分配,这样就会每个访客固定访问一个后端服务器,可以解决session问题。
#配置iphash
upstream doMain{
ip_hash;
server 127.0.0.1:8080;
server 1.15.245.21:8080;
}
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
index index.html index.htm;
#配置策略
proxy_pass http://doMain;
}
- fair(第三方):按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream doMain{
server 127.0.0.1:8080;
server 1.15.245.21:8080;
fair;
}
动静分离
动静分离不是简单的将动态资源和静态资源简单的分离开来,而是将静态请求和动态请求分开。一般来说,通常将静态资源通过nginx服务器直接返回,动态资源需要nginx转发给Tomcat服务器访问数据库进行处理。
Nginx的原理
Nginx每当请求会转发到master上,而当master收到新请求后worker会对新请求进行争抢。每一个worker都是一个独立的进程。
master-workers 的机制的好处
- 首先,对于每个worker 进程来说,独立的进程,不需要加锁,所以省掉了锁带来的开销,同时在编程以及问题查找时,也会方便很多。其次,采用独立的进程,可以让互相之间不会影响,一个进程退出后,其它进程还在工作,服务不会中断, master 进程则很快启动新的worker 进程。当然, worker 进程的异常退出,肯定是程序有 bug 了,异常退出,会导致当前 worker 上的所有请求失败,不过不会影响到所有请求,所以降低了风险。
设置 worker 数和服务器的 cpu数相等是最为适宜的。设少了会浪费 cpu ,设多了会造成 cpu 频繁切换上下文带来的损耗。
#设置 worker 数量。
- worker_processes 4
#work绑定 cpu(4 work 绑定 4cpu) 。
- worker_cpu_affinity 0001 0010 0100 1000
连接数worker_connection
- 这个值是表示每个worker 进程所能建立连接的最大值,所以,一个 nginx 能建立的最大连接数,应该是 worker_connections * worker_processes 。当然,这里说的是最大连接数,对于HTTP 请求本地资源来说,能够支持的最大并发数量是 worker_connections *worker_processes ,如果是支持 http1.1 的浏览器每次访问要占两个连接,所以普通的静态访问最大并发数是: worker_connections * worker_processes /2 ,而如果是 HTTP 作 为反向代理来说,最大并发数量应该是 worker_connections *worker_processes/4。因为作为反向代理服务器,每个并发会建立与客户端的连接和与后端服务的连接,会占用两个连接。
高可用
类似于Redis的主从复制,一般为了防止Nginx挂掉,会设置从机,当主机Nginx挂掉后会通过脚本让从机生效,防止Nginx挂掉后服务直接崩溃
小结
我视频教程是在B站上看的尚硅谷的Nginx教学,讲的还挺细,个人认为挺适合新手入门
还在网上看了一些别人写的博客,我觉得写得挺好的,可以作为参考