Nginx

49
0
0
2021-03-12
Nginx

Nginx

1. Nginx 是什么?

Nginx(发音为 "engine x")是一个高性能的开源的 HTTP 和反向代理服务器主要用来处理网络请求。你可以把它想象成一个“交通警察”,负责指挥网络上的数据流量。比如,当很多人同时访问一个网站时,Nginx 可以帮助快速分配任务,确保网站不会卡顿或崩溃。


2. Nginx 被用来解决什么问题?

Nginx 主要解决以下问题:

  • 高并发问题:当很多人同时访问一个网站时,服务器可能会忙不过来。Nginx 可以帮助高效处理这些请求,避免网站变慢或崩溃。

    • 例子:比如双十一购物节,很多人同时访问淘宝,Nginx 可以帮助淘宝快速处理这些请求,确保大家都能顺利购物。

  • 负载均衡问题:如果一个服务器忙不过来,Nginx 可以把任务分给多个服务器,避免单个服务器过载。

    • 例子:比如一个热门视频网站,Nginx 可以把用户的请求分给不同的服务器,确保视频播放流畅。

  • 反向代理问题:Nginx 可以隐藏真实的服务器,保护后端服务器的安全。

    • 例子:比如你访问一个网站,实际上请求是先到 Nginx,再由 Nginx 转发到真正的服务器,这样黑客就很难直接攻击真正的服务器。


3. Nginx 什么时候使用?

Nginx 通常在以下场景中使用:

  • 网站访问量很大时:比如电商网站、社交平台等,需要处理大量用户请求。

    • 例子:比如微博,很多人同时发帖、点赞、评论,Nginx 可以帮助快速处理这些请求。

  • 需要加速网站时:Nginx 可以缓存静态内容(如图片、CSS 文件),让网站加载更快。

    • 例子:比如一个新闻网站,Nginx 可以把新闻中的图片缓存起来,用户再次访问时就不用重新加载了。

  • 需要保护服务器时:Nginx 可以作为“中间人”,隐藏真实的服务器,提高安全性。

    • 例子:比如一个银行网站,Nginx 可以防止黑客直接攻击银行的服务器。


4. Nginx 的设计架构

Nginx 的核心设计是事件驱动异步非阻塞的模型。这是什么意思呢?

  • 事件驱动:Nginx 不会为每个请求单独开一个线程或进程,而是通过监听事件(比如用户请求)来快速响应。

  • 异步非阻塞:Nginx 在处理一个请求时,如果遇到需要等待的操作(比如读取文件或访问数据库),它不会停下来干等,而是先去处理其他请求,等之前的操作完成后,再回来继续处理。

举个例子
想象你是一个餐厅的服务员。传统的方式是,你为每一桌客人单独服务,等他们点完菜、吃完、结账后,再去服务下一桌。而 Nginx 的方式是,你同时服务多桌客人,当一桌客人在看菜单时,你可以先去给另一桌上菜,等他们看完菜单再回来继续服务。这样效率就高多了!


5. Nginx 如何做到高并发?

Nginx 的高并发能力主要来自它的事件驱动模型多进程架构

  • 事件驱动模型:Nginx 使用一个主进程来监听网络请求,当有请求到来时,它会快速分发给工作进程处理。

  • 多进程架构:Nginx 可以启动多个工作进程,每个进程都能独立处理请求。这样即使有很多用户同时访问,Nginx 也能轻松应对。

举个例子
假设你有一个快递站,传统的方式是只有一个快递员,他需要一个个处理包裹,效率很低。而 Nginx 的方式是,你有一群快递员,每个人都能同时处理多个包裹,效率自然就高了。


6. Nginx 如何做到负载均衡?

Nginx 的负载均衡功能是通过反向代理实现的。它会根据配置的规则,把用户的请求分发给多个后端服务器。

举个例子
假设你有一个热门视频网站,用户访问量很大。Nginx 可以把用户的请求分发给多个服务器,比如:

  • 用户 A 的请求发给服务器 1,

  • 用户 B 的请求发给服务器 2,

  • 用户 C 的请求发给服务器 3。

这样每个服务器的压力都减轻了,网站也不会因为访问量太大而崩溃。


7. Nginx 如何做到反向代理?

Nginx 的反向代理功能是通过转发请求实现的。当用户访问网站时,Nginx 会先接收请求,然后根据配置把请求转发给后端服务器,最后把服务器的响应返回给用户。

举个例子
假设你访问一个网站 example.com,实际上这个网站的服务器是隐藏的,Nginx 作为“中间人”接收你的请求,然后转发给真正的服务器。真正的服务器处理完请求后,把结果返回给 Nginx,Nginx 再返回给你。这样你就不知道真正的服务器在哪里,黑客也很难直接攻击它。


8. Nginx 如何加速网站?

Nginx 可以通过缓存静态内容来加速网站。它会把一些不经常变化的内容(比如图片、CSS 文件、JavaScript 文件)缓存起来,当用户再次访问时,直接返回缓存的内容,而不需要重新从服务器加载。

举个例子
假设你访问一个新闻网站,新闻中的图片和样式文件是不经常变化的。Nginx 会把这些内容缓存起来,当你再次访问时,直接使用缓存的内容,网站加载速度就更快了。


9. 如何使用 Nginx:

以下是一个简单的示例,演示了如何配置 Nginx 作为反向代理服务器,将请求转发到两个 Node.js 应用服务器。

  1. 安装 Nginx:

    • 使用包管理器安装 Nginx。例如,在 Ubuntu 上可以使用以下命令:

      sudo apt-get update sudo apt-get install nginx

  2. 配置 Nginx 反向代理:

    • 打开 Nginx 配置文件(通常是 /etc/nginx/nginx.conf/etc/nginx/conf.d/default.conf)并添加以下内容:

      server { listen 80; server_name example.com; location / { proxy_pass http://backend; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection 'upgrade'; proxy_set_header Host $host; proxy_cache_bypass $http_upgrade; } } upstream backend { server 127.0.0.1:3000; # 第一个 Node.js 应用服务器 server 127.0.0.1:3001; # 第二个 Node.js 应用服务器 }

    • 保存文件并退出。

  3. 重启 Nginx:

    • 使用以下命令重启 Nginx 以应用配置更改:

      sudo service nginx restart

  4. 访问网站:

    • 现在,通过浏览器访问 http://example.com 将会被 Nginx 转发到两个 Node.js 应用服务器,实现了反向代理。