部分内容学习自:
看完这篇还不了解Nginx,那我就哭了
nginx学习,看这一篇就够了
Nginx 的产生
Nginx 同 Apache 一样都是一种 Web 服务器。
Apache 的发展时期很长,作为世界第一大服务器。它有着很多优点:稳定、开源、跨平台等等。它兴起的年代,互联网产业远远比不上现在。所以它被设计为一个重量级的,且不支持高并发的服务器。
在 Apache 上运行数以万计的并发访问,会导致服务器消耗大量内存。操作系统对其进行进程或线程间的切换也消耗了大量的 CPU 资源,导致 HTTP 请求的平均响应速度降低。
这些都决定了 Apache 不可能成为高性能 Web 服务器,轻量级高并发服务器 Nginx 就应运而生了。
俄罗斯的工程师 Igor Sysoev,他在为 Rambler Media 工作期间,使用 C 语言开发了 Nginx。
Nginx 是一款自由的、开源的、高性能的 HTTP 服务器和反向代理服务器;同时也是一个 IMAP、POP3、SMTP 代理服务器。
Nginx 可以作为一个 HTTP 服务器进行网站的发布处理;另外 Nginx 可以作为反向代理进行负载均衡的实现。
正向代理(客户端代理)
如科学上网的原理是找到一个代理服务器,我们将请求发送给代理服务器,让代理服务器去访问,然后将访问到的数据传递给我们。这样的代理模式称为正向代理,代理服务器也是作为客户端,去访问服务端,而服务端无感知。
反向代理(服务端代理)
关于反向代理的处理方式,举例如某宝双十一,单个服务器性能瓶颈与人民日益增长的购买欲望之间的矛盾。
于是出现了:分布式、集群;也就是通过部署多台服务器来提高性能。但此时的问题是,服务端有多台,但客户端并不清楚当前应该把请求发送给哪一台服务端。
反向代理就是由一台Nginx 代理服务器负责接收所有客户端的请求,Nginx 服务器接收到之后,按照一定的规则分发给了真正的服务器进行处理。这对客户端来说仍然只能感知到一台服务端的存在。
反向代理的作用:
- 保证内网的安全,通常将反向代理作为公网访问地址,Web 服务器是内网。
- 负载均衡,通过反向代理服务器来优化网站的负载。
通常情况下实际生活中,正向代理和反向代理很有可能会存在同一个应用场景中,二者并不互相冲突。正向代理代理客户端的请求去访问目标服务器,目标服务器是一个反向代理服务器,反向代理了多台真实的业务处理服务器。
负载均衡
Nginx 服务器将请求按照一定的规则分发给了真正的服务器,这里按照一定规则分发的过程,就有负载均衡。
Nginx 支持的负载均衡算法
-
weight 轮询(默认):接收到的请求按照顺序逐一分配到不同的后端服务器,即使在使用过程中,某一台后端服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。
这种方式下,可以给不同的后端服务器设置一个权重值(weight),用于调整不同的服务器上请求的分配率。权重数据越大,被分配到请求的几率越大。
-
ip_hash:每个请求按照发起客户端的 ip 的 hash 结果进行匹配,这样的算法下一个固定 ip 地址的客户端总会访问到同一个后端服务器,这也在一定程度上解决了集群部署环境下 Session 共享的问题。
-
url_hash:按照访问的 URL 的 hash 结果分配请求,每个请求的 URL 会指向后端固定的某个服务器,可以在 Nginx 作为静态服务器的情况下提高缓存效率。但Nginx 默认不支持url_hash,需要安装 Nginx 的 hash 软件包。(并不等同于location里使用正则匹配分发到不同server)
-
fair:智能调整调度算法,动态的根据后端服务器的请求处理到响应的时间进行均衡分配。更贴合实际生产环境做动态调整。但Nginx 默认不支持 fair 算法,使用这种调度算法,需要安装 upstream_fair 模块。
Nginx 的常用命令和配置文件
nginx 下载解压后有如下目录
conf html logs sbin ...
sbin
里面有两个文件:nginx 和 nginx.old
./nginx # 启动
./nginx -s stop # 停止
./nginx -s reload # 重新加载
conf
nginx的配置文件: nginx.conf。精简之后的内容:
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
nginx 配置文件有三部分组成:
- 第一部分:全局块。
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
比如上面第一行配置的:worker_processes 1;
- 第二部分:events块。
比如上面的配置,表示每个 work process 支持的最大连接数为 1024。events { worker_connections 1024; }
- 第三部分: Nginx 服务器配置中最频繁的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。
http { include mime.types; default_type application/octet-stream; sendfile on; keepalive_timeout 65; server { listen 80; # 监听主机的端口号 server_name localhost; # 监听主机的host(本机的host) location / { root html; index index.html index.htm; } error_page 500 502 503 504 /50x.html; location = /50x.html { root html; } } }
- http{}:http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
- server{}:一个 http 块可以配置多个 server 块,而每个 server 块就相当于一个虚拟主机。
- location{}:一个 server 块可以配置多个 location 块。根据接收到的请求URI中的内容对特定的请求进行处理。
配置反向代理
将本机8081的请求直接跳转到8082
server {
listen 8081;
server_name 192.168.1.1;
location / {
root html;
proxy_pass http://192.168.1.1:8082
index index.html index.htm;
}
}
配置反向代理
根据访问路径的分发给不同服务器
不等于url_hash,且可靠性弱于url_hash。
server {
listen 8081;
server_name 192.168.1.1;
location ~ /vod/ { # ~ 表示以正则表达式匹配URI
proxy_pass http://192.168.1.2:8082
}
location ~ /edu/ {
proxy_pass http://192.168.1.3:8083
}
}
location 正则表达式语法如下:
1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。
2、~:用于表示 uri 包含正则表达式,并且区分大小写。
3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。
4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字 符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。
配置反向代理
负载均衡效果。默认轮询。
upstream myservers { # 默认轮询
server 192.168.1.2:8082;
server 192.168.1.3:8083;
}
server {
listen 8081;
server_name 192.168.1.1;
location / {
proxy_pass http://myservers;
}
}
weight 权重。
默认为 1,权重越高被分配的客户端越多
upstream myservers {
server 192.168.1.2:8082 weight=10;
server 192.168.1.3:8083 weight=10;
}
server {
listen 8081;
server_name 192.168.1.1;
location / {
proxy_pass http://myservers;
}
}
ip_hash。
upstream myservers {
ip_hash;
server 192.168.1.2:8082;
server 192.168.1.3:8083;
}
server {
listen 8081;
server_name 192.168.1.1;
location / {
proxy_pass http://myservers;
}
}
fair。
upstream myservers {
fair;
server 192.168.1.2:8082;
server 192.168.1.3:8083;
}
server {
listen 8081;
server_name 192.168.1.1;
location / {
proxy_pass http://myservers;
}
}
高可用
在使用过程中,负载均衡的某一台被代理的服务器宕机,Nginx 会自动将该服务器剔除出队列,请求受理情况不会受到任何影响。
需要注意的是,Nginx作为一个服务端,自身也会有单点故障的风险,也需要组建Nginx集群。如原文提到使用两台nginx 服务器,配合keepalived实现。
Nginx location、proxy_pass 后有 / 与没 / 的区别:
https://www.cnblogs.com/she11s/p/14456301.html
https://blog.csdn.net/weixin_44003789/article/details/109812546