9

Nginx- 技术专题 - 技术介绍

 3 years ago
source link: https://xie.infoq.cn/article/6d06c29cb69e45e0b63923d21
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Nginx 介绍

Nginx  是一个高性能的  HTTP  和反向代理  web  服务器,同时也提供了  IMAP/POP3/SMTP  服务。

Nginx  是由伊戈尔·赛索耶夫为俄罗斯访问量第二的  Rambler.ru  站点开发的,第一个公开版本  0.1.0  发布于  2004  年  10  月  4  日。

Nginx  特点是占有内存少,并发能力强。

事实上  nginx  的并发能力确实在同类型的网页服务器中表现较好,一般来说,如果我们在项目中引入了  Nginx  ,我们的项目架构可能是这样:

b2yUnu3.png!mobile

这样的架构中 ,  Nginx  所代表的角色叫做负载均衡服务器或者反向代理服务器,所有请求首先到达  Nginx  上,再由  Nginx  根据提前配置好的转发规则,将客户端发来的请求转发到某个  Tomcat  上去。

那么这里涉及到两个概念:

负载均衡服务器

就是进行请求转发,降低某一个服务器的压力。负载均衡策略很多,也有很多层,对于一些大型网站基本上从  DNS  就开始负载均衡,负载均衡有硬件和软件之分,各自代表分别是  F5  和  Nginx  (目前  Nginx  已经被  F5  收购),早些年,也可以使用  Apache  来做负载均衡,但是效率不如  Nginx  ,所以 现在主流方案是  Nginx  。

反向代理服务器

另一个概念是反向代理服务器,得先说正向代理,看下面一张图:

UJNrmin.png!mobile

在这个过程中,Google 并不知道真正访问它的客户端是谁,它只知道这个中间服务器在访问它。因此,这里的代理,实际上是中间服务器代理了客户端,这种代理叫做正向代理。

那么什么是反向代理呢?看下面一张图:

muayM3A.png!mobile

在这个过程中, 10086 这个号码相当于是一个代理,真正提供服务的,是话务员,但是对于客户来说,他不关心到底是哪一个话务员提供的服务,只需要记得 10086 这个号码就行了。

所有的请求打到 10086 上,再由 10086 将请求转发给某一个话务员去处理。因此,在这里, 10086 就相当于是一个代理,只不过它代理的是话务员而不是客户端,这种代理称之为 反向代理

Nginx 优势

Nginx 有着非常广泛的使用,随便举几点:

  1. Nginx 做 静态资源服务器 :Java 中的资源可以分为动态和静态,动态需要经过 Tomcat 解析之后,才能返回给浏览器,例如 JSP 页面、Freemarker 页面、控制器返回的 JSON 数据等,都算作动态资源,动态资源经过了 Tomcat 处理,速度必然降低。 对于静态资源,例如图片、HTML、JS、CSS 等资源,这种资源可以不必经过 Tomcat 解析,当客户端请求这些资源时,之间将资源返回给客户端就行了。此时,可以使用 Nginx 搭建静态资源服务器,将静态资源直接返回给客户端。

  2. Nginx 做负载均衡服务器 ,无论是使用 Dubbo 还是 Spirng Cloud ,除了使用各自自带的负载均衡策略之外,也都可以使用 Nginx 做负载均衡服务器。

  3. 支持高并发、内存消耗少、成本低廉、配置简单、运行稳定等。

Nginx 安装

由于基本上都是在 Linux 上使用 Nginx,因此松哥这里主要向大家展示 CentOS 7 安装 Nginx:

首先下载 Nginx

然后解压下载的目录,进入解压目录中,在编译安装之前,需要安装两个依赖:

  1. 然后开始编译安装:

  2. 装好之后,默认安装位置在 :

进入到该目录的  sbin  目录下,执行  nginx  即可启动  Nginx  :

emERJru.png!mobile

Nginx 启动成功之后,在浏览器中直接访问 Nginx 地址:

NnaqUfQ.png!mobile

看到如上页面,表示 Nginx 已经安装成功了。

如果修改了 Nginx 配置,则可以通过如下命令重新加载 Nginx 配置文件:

Nginx搭建静态资源web服务器

Nginx默认会访问index.html页面.

例如,如下图配置, 当访问 http://172.16.204.5:90/ 时, 默认会访问安装目录下的mine_html目录中的index.html文件.

MVJfInv.png!mobile

设置Nginx的gzip压缩:

fYvyQrV.png!mobile

Nginx支持访问文件树

效果如下(如果访问的url路径下有index.html, 默认还是会跳到index.html页面):

FnqUf2.png!mobile

要达到上图中的效果, Nginx 的配置文件需要添加如下设置:

eyUJvei.png!mobile

添加上图中的配置后, 客户端访问 http://172.16.204.5:90/ 时, 会以树的格式展示mine_html中的所有文件. 使用这种方式可以很好的共享静态资源.

在生产环境中

公网的带宽是有限的, 并发情况下各个客户端会争抢带宽资源, 为了防止访问大的静态资源对其他用户造成影响, 可以设置nginx响应的带宽. 例如如下图设置, nginx给客户端响应时会以每秒1k的速度响应.

3e2yiav.png!mobile

Nginx缓存服务器上的静态文件

Nginx缓存的优点

j6Vb2iU.png!mobile

如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。

因为静态文件(比如css,js, 图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。

毕竟,IO密集型服务的处理是nginx的强项。

如何进行设置

先上个栗子:

http{
proxy_connect_timeout 10;
proxy_read_timeout 180;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 96k;
proxy_temp_file_write_size 96k;
proxy_temp_path /tmp/temp_dir;
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g;
server {
listen 80 default_server;
server_name localhost;
root /mnt/blog/;
location / {
}
#要缓存文件的后缀,可以在以下设置。
location ~ .*\.(gif|jpg|png|css|js)(.*) {
proxy_pass http://ip地址:90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 301 30d;
proxy_cache_valid any 5m;
expires 90d;
add_header wall "hey!guys!give me a star.";
}
}
# 无nginx缓存的blog端口
server {
listen 90;
server_name localhost;
root /mnt/blog/;
location / {
}
}
}

因为我是在一台服务器上做试验,所以用了两个端口 80 90 进行模拟两台服务器之间的交互。

80 端口对接的是普通的域名( http://wangxiaokai.vip )访问。

90 端口负责处理 80 端口代理过来的资源访问。

相当于 90 端口是源服务器, 80 端口是nginx反向缓存代理服务器。

接下来讲一下配置项:

http层设置

proxy_connect_timeout 10;
proxy_read_timeout 180;
proxy_send_timeout 5;
proxy_buffer_size 16k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 96k;
proxy_temp_file_write_size 96k;
proxy_temp_path /tmp/temp_dir;
proxy_cache_path /tmp/cache levels=1:2 keys_zone=cache_one:100m inactive=1d max_size=10g;
  • proxy_connect_timeout  服务器连接的超时时间

  • proxy_read_timeout  连接成功后,等候后端服务器响应时间

  • proxy_send_timeout  后端服务器数据回传时间

  • proxy_buffer_size  缓冲区的大小

  • proxy_buffers  每个连接设置缓冲区的数量为number,每块缓冲区的大小为size

  • proxy_busy_buffers_size  开启缓冲响应的功能以后,在没有读到全部响应的情况下,写缓冲到达一定大小时,nginx一定会向客户端发送响应,直到缓冲小于此值。

  • proxy_temp_file_write_size  设置nginx每次写数据到临时文件的size(大小)限制

  • proxy_temp_path  从后端服务器接收的临时文件的存放路径

  • proxy_cache_path  设置缓存的路径和其他参数。被缓存的数据如果在inactive参数(当前为1天)指定的时间内未被访问,就会被从缓存中移除

server层设置

反向缓存代理服务器

server {
listen 80 default_server;
server_name localhost;
root /mnt/blog/;
location / {
}
#要缓存文件的后缀,可以在以下设置。
location ~ .*\.(gif|jpg|png|css|js)(.*) {
proxy_pass http://ip地址:90;
proxy_redirect off;
proxy_set_header Host $host;
proxy_cache cache_one;
proxy_cache_valid 200 302 24h;
proxy_cache_valid 301 30d;
proxy_cache_valid any 5m;
expires 90d;
add_header wall "hey!guys!give me a star.";
}
}
  • proxy_pass  nginx缓存里拿不到资源,向该地址转发请求,拿到新的资源,并进行缓存

  • proxy_redirect  设置后端服务器“Location”响应头和“Refresh”响应头的替换文本

  • proxy_set_header  允许重新定义或者添加发往后端服务器的请求头

  • proxy_cache  指定用于页面缓存的共享内存,对应http层设置的keys_zone

  • proxy_cache_valid  为不同的响应状态码设置不同的缓存时间

  • expires  缓存时间

这里我设置了 图片 css js 静态资源进行缓存。

当用户输入 http://wangxiaokai.vip 域名时,解析得到 ip:port 的访问地址。 port 默认为80。所以页面请求会被当前server截取到,进行请求处理。

当解析到上述文件名结尾的静态资源,会到缓存区获取静态资源。

如果获取到对应资源,则直接返回数据。

如果获取不到,则将请求转发给 proxy_pass 指向的地址进行处理。

源服务器

server {
listen 90;
server_name localhost;
root /mnt/blog/;
location / {
}
}

这里直接处理 90 端口接受到的请求,到服务器本地目录 /mnt/blog 下抓取资源进行响应。

如何验证缓存是否有效

细心的读者应该发现,我在第二段栗子里,留了个彩蛋  add_header wall "hey!guys!give me a star."

add_header

是用于在报头设置自定义的信息。

所以,如果缓存有效的话,那么静态资源返回的报头,一定会带上这个信息。

访问 http://wangxiaokai.vip 结果如下:

RzAv6zE.png!mobile


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK