乐趣区

nginx常用功能全揭秘(内附福利!!!)

本文旨在用最通俗的语言讲述最枯燥的基本知识
nginx 作为一个高性能的 web 服务器,想必大家垂涎已久,蠢蠢欲动,想学习一番了吧,语法不多说,网上一大堆。下面博主就 nginx 的非常常用的几个功能做一些讲述和分析,学会了这几个功能,平常的开发和部署就不是什么问题了。因此希望大家看完之后,能自己装个 nginx 来学习配置测试,这样才能真正的掌握它。前方高能,文末有福利。

文章提纲:

正向代理
反向代理
透明代理
负载均衡
静态服务器
nginx 的安装
一点点小福利

1. 正向代理
正向代理:内网服务器主动去请求外网的服务的一种行为
光看概念,可能有读者还是搞不明白:什么叫做“正向”,什么叫做“代理”,我们分别来理解一下这两个名词。
正向:相同的或一致的方向代理:自己做不了的事情或者自己不打算做的事情,委托或依靠别人来完成。
借助解释,回归到 nginx 的概念,正向代理其实就是说客户端无法主动或者不打算完成主动去向某服务器发起请求,而是委托了 nginx 代理服务器去向服务器发起请求,并且获得处理结果,返回给客户端。从下图可以看出:客户端向目标服务器发起的请求,是由代理服务器代替它向目标主机发起,得到结果之后,通过代理服务器返回给客户端。
举个栗子:广大社会主义接班人都知道,为了保护祖国的花朵不受外界的乌烟瘴气熏陶,国家对网络做了一些“优化”,正常情况下是不能外网的,但作为程序员的我们如果没有谷歌等搜索引擎的帮助,再销魂的代码也会因此失色,因此,网络上也曾出现过一些 fan qiang 技术和软件供有需要的人使用,如某 VPN 等,其实 VPN 的原理大体上也类似于一个正向代理,也就是需要访问外网的电脑,发起一个访问外网的请求,通过本机上的 VPN 去寻找一个可以访问国外网站的代理服务器,代理服务器向外国网站发起请求,然后把结果返回给本机。
正向代理的配置:
server {
#指定 DNS 服务器 IP 地址
resolver 114.114.114.114;
#指定代理端口
listen 8080;
location / {
#设定代理服务器的协议和地址(固定不变)
proxy_pass http://$http_host$request_uri;
}
}
这样就可以做到内网中端口为 8080 的服务器主动请求到 1.2.13.4 的主机上,如在 Linux 下可以:
curl –proxy proxy_server:8080 http://www.taobao.com/
正向代理的关键配置:

resolver:DNS 服务器 IP 地址
listen:主动发起请求的内网服务器端口
proxy_pass:代理服务器的协议和地址

2. 反向代理
反向代理:reverse proxy,是指用代理服务器来接受客户端发来的请求,然后将请求转发给内网中的上游服务器,上游服务器处理完之后,把结果通过 nginx 返回给客户端。
上面讲述了正向代理的原理,相信对于反向代理,就很好理解了吧。反向代理是对于来自外界的请求,先通过 nginx 统一接受,然后按需转发给内网中的服务器,并且把处理请求返回给外界客户端,此时代理服务器对外表现的就是一个 web 服务器,客户端根本不知道“上游服务器”的存在。
举个栗子:一个服务器的 80 端口只有一个,而服务器中可能有多个项目,如果 A 项目是端口是 8081,B 项目是 8082,C 项目是 8083,假设指向该服务器的域名为 www.xxx.com,此时访问 B 项目是 www.xxx.com:8082,以此类推其它项目的 URL 也是要加上一个端口号,这样就很不美观了,这时我们把 80 端口给 nginx 服务器,给每个项目分配一个独立的子域名,如 A 项目是 a.xxx.com,并且在 nginx 中设置每个项目的转发配置,然后对所有项目的访问都由 nginx 服务器接受,然后根据配置转发给不同的服务器处理。具体流程如下图所示:
反向代理配置:
server {
#监听端口
listen 80;
#服务器名称,也就是客户端访问的域名地址
server_name a.xxx.com;
#nginx 日志输出文件
access_log logs/nginx.access.log main;
#nginx 错误日志输出文件
error_log logs/nginx.error.log;
root html;
index index.html index.htm index.php;
location / {
#被代理服务器的地址
proxy_pass http://localhost:8081;
#对发送给客户端的 URL 进行修改的操作
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
proxy_max_temp_file_size 0;
}
}
这样就可以通过 a.xxx.com 来访问 a 项目对应的网站了,而不需要带上难看的端口号。反向代理的配置关键点是:

server_name:代表客户端向服务器发起请求时输入的域名
proxy_pass:代表源服务器的访问地址,也就是真正处理请求的服务器(localhost+ 端口号)。

3. 透明代理
透明代理:也叫做简单代理,意思客户端向服务端发起请求时,请求会先到达透明代理服务器,代理服务器再把请求转交给真实的源服务器处理,也就是是客户端根本不知道有代理服务器的存在。
举个栗子:它的用法有点类似于拦截器,如某些制度严格的公司里的办公电脑,无论我们用电脑做了什么事情,安全部门都能拦截我们对外发送的任何东西,这是因为电脑在对外发送时,实际上先经过网络上的一个透明的服务器,经过它的处理之后,才接着往外网走,而我们在网上冲浪时,根本没有感知到有拦截器拦截我们的数据和信息。
有人说透明代理和反向代理有点像,都是由代理服务器先接受请求,再转发到源服务器。其实本质上是有区别的,透明代理是客户端感知不到代理服务器的存在,而反向代理是客户端感知只有一个代理服务器的存在,因此他们一个是隐藏了自己,一个是隐藏了源服务器。事实上,透明代理和正向代理才是相像的,都是由客户端主动发起请求,代理服务器处理;他们差异点在于:正向代理是代理服务器代替客户端请求,而透明代理是客户端在发起请求时,会先经过透明代理服务器,再达到服务端,在这过程中,客户端是感知不到这个代理服务器的。
4. 负载均衡
负载均衡:将服务器接收到的请求按照规则分发的过程,称为负载均衡。负载均衡是反向代理的一种体现。
可能绝大部分人接触到的 web 项目,刚开始时都是一台服务器就搞定了,但当网站访问量越来越大时,单台服务器就扛不住了,这时候需要增加服务器做成集群来分担流量压力,而在架设这些服务器时,nginx 就充当了接受流量和分流的作用了,当请求到 nginx 服务器时,nginx 就可以根据设置好的负载信息,把请求分配到不同的服务器,服务器处理完毕后,nginx 获取处理结果返回给客户端,这样,用 nginx 的反向代理,即可实现了负载均衡。
nginx 实现负载均衡有几种模式:
轮询:每个请求按时间顺序逐一分配到不同的后端服务器,也是 nginx 的默认模式。轮询模式的配置很简单,只需要把服务器列表加入到 upstream 模块中即可。
下面的配置是指:负载中有三台服务器,当请求到达时,nginx 按照时间顺序把请求分配给三台服务器处理。
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
}
ip_hash:每个请求按访问 IP 的 hash 结果分配,同一个 IP 客户端固定访问一个后端服务器。可以保证来自同一 ip 的请求被打到固定的机器上,可以解决 session 问题。
下面的配置是指:负载中有三台服务器,当请求到达时,nginx 优先按照 ip_hash 的结果进行分配,也就是同一个 IP 的请求固定在某一台服务器上,其它则按时间顺序把请求分配给三台服务器处理。
upstream serverList {
ip_hash
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
}
url_hash:按访问 url 的 hash 结果来分配请求,相同的 url 固定转发到同一个后端服务器处理。
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
hash $request_uri;
hash_method crc32;
}
fair:按后端服务器的响应时间来分配请求,响应时间短的优先分配。
upstream serverList {
server 1.2.3.4;
server 1.2.3.5;
server 1.2.3.6;
fair;
}
而在每一种模式中,每一台服务器后面的可以携带的参数有:

down: 当前服务器暂不参与负载
weight: 权重,值越大,服务器的负载量越大。
max_fails:允许请求失败的次数,默认为 1。
fail_timeout:max_fails 次失败后暂停的时间。
backup:备份机,只有其它所有的非 backup 机器 down 或者忙时才会请求 backup 机器。

如下面的配置是指:负载中有三台服务器,当请求到达时,nginx 按时间顺序和权重把请求分配给三台服务器处理,例如有 100 个请求,有 30% 是服务器 4 处理,有 50% 的请求是服务器 5 处理,有 20% 的请求是服务器 6 处理。
upstream serverList {
server 1.2.3.4 weight=30;
server 1.2.3.5 weight=50;
server 1.2.3.6 weight=20;
}
如下面的配置是指:负载中有三台服务器,服务器 4 的失败超时时间为 60s,服务器 5 暂不参与负载,服务器 6 只用作备份机。
upstream serverList {
server 1.2.3.4 fail_timeout=60s;
server 1.2.3.5 down;
server 1.2.3.6 backup;
}
下面是一个配置负载均衡的示例(只写了关键配置):其中:

upstream serverList 是负载的配置模块
server_name 是客户端请求的域名地址
proxy_pass 是指向负载的列表的模块

upstream serverList {
server 1.2.3.4 weight=30;
server 1.2.3.5 down;
server 1.2.3.6 backup;
}

server {
listen 80;
server_name www.xxx.com;
root html;
index index.html index.htm index.php;
location / {
proxy_pass http://serverList;
proxy_redirect off;
proxy_set_header Host $host;
}
}
5. 静态服务器
现在很多项目流行前后分离,也就是前端服务器和后端服务器分离,分别部署,这样的方式能让前后端人员能各司其职,不需要互相依赖,而前后分离中,前端项目的运行是不需要用 Tomcat、Apache 等服务器环境的,因此可以直接用 nginx 来作为静态服务器。
静态服务器的配置如下, 其中关键配置为:

root:直接静态项目的绝对路径的根目录。
server_name : 静态网站访问的域名地址。

server {
listen 80;
server_name www.xxx.com;
client_max_body_size 1024M;
location / {
root /var/www/xxx_static;
index index.html;
}
}
nginx 的安装
学了这么多 nginx 的配置用法之后,我们需要对每一个知识点做一下测试,才能印象深刻,在此之前,我们需要知道 nginx 是怎么安装,下面以 Linux 环境为例,简述 yum 方式安装 nginx 的步骤:
安装依赖:
// 一键安装上面四个依赖
yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel
安装 nginx:
yum install nginx
检查是否安装成功:
nginx -v
启动 / 挺尸 nginx:
/etc/init.d/nginx start
/etc/init.d/nginx stop
编辑配置文件:
/etc/nginx/nginx.conf
这些步骤都完成之后,我们就可以进入 nginx 的配置文件 nginx.conf 对上面的各个知识点,进行配置和测试了。
一点点小福利:
有的人说看到这里好像都懂了,但是没 Linux 可以测试呀,其实 nginx 也有 Windows 版本,当然 Windows 版本在实际项目中用的并不多,因为 web 项目的服务器都是 Linux,因此你可以在自己的电脑上装个虚拟机,然后装个 Linux 来玩耍,不过如果如果你想要学以致用,并且更接近公司项目的生产环境的配备的话,作者建议你还是自己买一台云服务器来学习,刚好阿里云有双十一活动,一台服务器只需要 90 元一年,这是明显的撸羊毛活动啊,你忍心放弃吗?
你花在装虚拟机和 Linux 系统上的时间都不止 90 块钱了!你有没有想过有朝一日亲手上传自己的代码到服务器呢?你有没有憧憬拥有自己搭建和维护的个人博客呢?你试过从项目发布上线到域名解析访问整个流程吗?…. 如果都没有,建议你买一台吧:
点我 90 元购买服务器
如果链接无法点开,请扫描二维码购买:
———— 划重点 —————-
注意了!!!点链接注册购买之后,阿里云会有返现给博主,为了感谢各位大大的厚爱,博主决定把所有返现归还给各位大大,因此凡是新用户注册购买的,请加博主 V(sisi-ceo)联系博主,博主核实后把返现以红包的形式给你您,让你最低的价格买到服务器,能学到更多的东西!!!
(老用户以及点别的链接注册购买的大大,博主是收不到返现的哦,所以这部分博主无能为力的啦~~~)

觉得本文对你有帮助?请分享给更多人关注「编程无界」,提升装逼技能

退出移动版