“Nginx 是一款轻量级的 HTTP 服务器,采用事件驱动的异步非阻塞处理方式框架,这让其具有极好的 IO 性能,时常用于服务端的反向代理和负载均衡。”

学习文章

安装

代理

正向代理

正向代理(forward proxy):是一个位于客户端和目标服务器之间的服务器(代理服务器),为了从目标服务器取得内容,客户端向代理服务器发送一个请求并指定目标,然后代理服务器向目标服务器转交请求并将获得的内容返回给客户端。

代理服务器代理了客户端区和服务器通信,服务器并不知道客户端是谁

用途

  • 突破访问限制,突破自身 ip 的访问限制,可以科学上网
  • 提高访问速度,通常代理服务器都设置一个较大的硬盘缓冲区,会将部分请求的响应保存到缓冲区中,当其他用户再访问相同的信息时, 则直接由缓冲区中取出信息,传给用户,以提高访问速度。
  • 隐藏客户端 ip,隐藏自身的 ip,免受攻击

反向代理

反向代理(reverse proxy):是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

代理服务器代理了服务器,客户端并不知道服务器是谁,客户端访问一个地址,以为是服务器的地址,其实是代理服务器的地址

用途

  • 隐藏服务器真实 ip
  • 负载均衡,根据真实服务器的负载情况,将客户端的请求分发到不同的真实服务器上
  • 提高访问速度,反向代理服务器可以对于静态内容及短时间内有大量访问请求的动态内容提供缓存服务,提高访问速度。
  • 提供安全保障,反向代理服务器可以作为应用层防火墙,为网站提供对基于 Web 的攻击行为(例如 DoS/DDoS)的防护,更容易排查恶意软件等。还可以为后端服务器统一提供加密和 SSL 加速(如 SSL 终端代理),提供 HTTP 访问认证等。

区别

  1. 正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。

  2. 正向代理一般是客户端架设的,比如在自己的机器上安装一个代理软件。而反向代理一般是服务器架设的,比如在自己的机器集群中部署一个反向代理服务器。

  3. 正向代理中,服务器不知道真正的客户端到底是谁,以为访问自己的就是真实的客户端(其实是代理)。而在反向代理中,客户端不知道真正的服务器是谁,以为自己访问的就是真实的服务器(其实是代理)。

  4. 正向代理和反向代理的作用和目的不同正向代理主要是用来解决访问限制问题。而反向代理则是提供负载均衡、安全防护等作用。二者均能提高访问速度。

负载均衡

Load balancing,即负载均衡,是一种计算机技术,用来在多个计算机(计算机集群)、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到最优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的。

负载均衡(Load Balance),意思是将负载(工作任务,访问请求)进行平衡、分摊到多个操作单元(服务器,组件)上进行执行。是解决高性能,单点故障(高可用),扩展性(水平伸缩)的终极解决方案。

常用命令

查看配置文件配置/usr/sbin/nginx -t
查看 nginx 安装目录位置ps -ef | grep nginx
启动/停止/重启 nginx 服务sudo service nginx start/stop/restart

配置相关

主配置文件路径/etc/nginx/nginx.conf

子配置文件路径//etc/nginx/conf.d/*.conf

配置文件语法规则

  • 配置文件由指令和指令块构成
  • 每条指令以;结尾,指令与参数之间以空格分隔
  • 指令块以{}大括号将多条指令组织在一次
  • include语句允许组合多个配置文件以提升可维护性
  • 使用#添加行注释
  • 通过$使用变量
  • 部分指令的参数支持正则表达式

基础配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# main指令块,全局配置

# 配置影响nginx服务器与用户的网络链接
events {

}

# 配置代理、缓存、日志等大多数功能呢个和第三方模块配置(重要)
http {
# 配置服务器列表,负载均衡重要的一环
upstream {
server 127.0.0.1:8080
}

# 配置虚拟主机,一个http可有多个server
server {
# 配置请求路由以及页面的处理情况,一个server可有多个location
location / {
# 当前path访问的资源路径
root /usr/share/nginx/html;
index index.html;
# 禁止某个ip访问
deny 127.0.0.1;
# 允许某个ip访问
allow 127.0.0.1;
}

location /api {

}
}

server {

}
}

配置反向代理

1
2
3
4
5
6
7
8
9
server {
listen 80;
server_name: 127.0.0.1;

location / {
# 通过proxy_pass指令配置反向代理
proxy_pass https://www.baidu.com;
}
}

配置负载均衡

负载均衡的分配方式

  • 轮询(默认方式),就是轮流来,如果有服务器挂了,会自动剔除。
  • weight(权重分配),权重越高,被访问的几率越大,用于服务器性能不均的情况。
  • ip_hash,来自同一个 ip 的请求永远分配同一台服务器,有效解决了动态网页存在的 session 共享问题。如果每次分配的服务器是不同的,那么如果用户的登录信息(session)存在服务器 a 中,下次的请求被分配到了服务器 b 上,b 服务器上是不存在用户的登录信息(session)的,那么用户就会被判定为未登录,这个逻辑显然是不合理的。
  • 最小连接数策略。将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求。
  • fair(第三方),按后端服务器的响应时间分配,响应时间短的优先分配,依赖第三方插件 nginx-upstream-fair,需要先安装。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 配置需要均衡负载的服务器
upstream myserver {
# 最小连接数策略
least_conn;
# ip_hash匹配策略
ip_hash;
fair;
# 设置服务器匹配的权重
server 127.0.0.1:8001 weight=10;
server 127.0.0.1:8002;
server 127.0.0.1:8003;
}

server {
listen 80;
server_name 127.0.0.1;

location / {
# 配置代理指向负载均衡的服务器
proxy_pass http:myserver;
}
}

常用技巧

静态资源管理

gzip 压缩

注意事项

  • 在使用nginx后,前端路由的命名需要规避关键字,例如static