写点什么

深入浅出 Nginx 实战与架构原理

作者:C++后台开发
  • 2022 年 5 月 31 日
  • 本文字数:4129 字

    阅读完需:约 14 分钟

本文主要内容如下(让读者朋友们深入浅出地理解 Nginx,有代码有示例有图):

  • 1.Nginx 是什么?

  • 2.Nginx 具有哪些功能?

  • 3.Nginx 的应用场景有哪些?

  • 4.Nginx 的衍生生态有哪些?

  • 5.Nginx 开源相关资料有哪些?

  • 6.Nginx 怎么样安装?

  • 7.Nginx 常用的配置包含哪些?以及是怎么配置的?

  • 8.Nginx 的安全策略需要从哪些方面考虑?

  • 9.Nginx 架构是怎样的?

  • 10.总结

一、Nginx 是什么?

Nginx 是一款免费开源的高性能 HTTP 服务器及反向代理服务器产品。

二、Nginx 具有哪些功能?

  • 1.正向代理与反向代理。

  • 2.负载均衡。

  • 3.Web 缓存。

  • 4.动静分离。

三、Nginx 的应用场景有哪些?

从我个人的实践经验出发,我用 Nginx 做了这么几件事情,如下所示:

  • 1.个人网站(如 YC-Framework 官网就是放在 Nginx 对应的目录下)或者是公司官网。

  • 2.外部网关代理(内部网关用 SpringCloud Gateway,外部网关用 Nginx)。

  • 3.基于 Nginx+FTP 的文件服务搭建。

  • 4.Nginx 代理后端服务集群(负载均衡机制的体现)。

  • 5.基于 Nginx Basic 认证控制系统访问权限。

  • 6.内网映射代理。

  • 7.配置 https。

  • 8.黑白名单。

四、Nginx 的衍生生态有哪些?

衍生生态比较出名的一个叫 Openresty。Openresty 是一款基于 Nginx 和 LuaJIT 的 Web 平台,它既具有 Nginx 拥有的功能,同时由于大量精良的 Lua 库,使其更加灵活,能构造出很多玩法。一句话概括,功能更强大了。

关于 Openresty 安装可以阅读我的这篇文章:OpenResty源码编译安装

五、Nginx 开源相关资料有哪些?

Nginx 官方网站:https://nginx.org/en/

Nginx 官方文档:http://nginx.org/en/docs/contributing_changes.html

Nginx 源代码:https://github.com/nginx/nginx

如果大家觉得英文方面阅读方面有一些困难,不用担心。一方面可以借助 Google 翻译或其它翻译工具降低阅读困难,另外一方面可借助国内内容网站所包含的丰富内容(如博客园、知乎、掘金、51CTO、思否、CSDN 等这样的)。

除此之外,Nginx 的商业化解决方案可供一些朋友参考,Nginx 的商业网站:https://www.nginx.com/

六、Nginx 怎么样安装?

过去我写了不少文章,可供大家参考:

Windows安装Nginx

Centos7之Java开发环境构建(包含Nginx安装)

Ubuntu16.04之开发环境构建(包含Nginx安装)

【文章福利】另外小编还整理了一些 C++后端开发面试题,教学视频,后端学习路线图免费分享,需要的可以自行添加:学习交流群点击加入~ 群文件共享

小编强力推荐 C++后端开发免费学习地址:C/C++Linux服务器开发高级架构师/C++后台开发架构师​

​七、Nginx 常用的配置包含哪些?以及是怎么配置的?

1.Nginx 怎样配置 HTTPS?

server {        listen       443 ssl;                server_name  framework.youcongtech.com;                ssl_certificate /home/tech/7788450_framework.youcongtech.com.pem;        ssl_certificate_key /home/tech/7788450_framework.youcongtech.com.key;         ssl_session_cache    shared:SSL:1m;        ssl_session_timeout  5m;         ssl_ciphers  HIGH:!aNULL:!MD5;        ssl_prefer_server_ciphers  on;         location / {            try_files $uri $uri/ /index.html;            root /home/tech/project/yc-framework-docs;            index  index.html index.htm;           # root   html;           # index  index.html index.htm;        }    }
复制代码

这个是我官网的证书配置,大家可访问分布式微服务框架:YC-Framework官网查看效果。

2.Nginx 开启 SSL 以后如何将 HTTP 重定向到 HTTPS 呢?

YC-Framework官网

采用的是第二种方法。

(1)第一种方法

server {    listen 80;    server_name localhost;    return 301 https://127.0.0.1$request_uri;}
复制代码

(2)第二种方法

server {    listen 80;    server_name localhost;    rewrite ^(.*)$ https://$host$1 permanent;}
复制代码

(3)Nginx 如何配置静态资源映射?

location /img/ {   alias /home/tech/img/;   autoindex on;}
复制代码

(4)Nginx 如何代理内部服务器某个中间件(如 MySQL)?

stream {    upstream inner_mysql {       hash $remote_addr consistent;       server 192.168.1.188:3389 weight=5 max_fails=3 fail_timeout=30s;    }    server {       listen 17865; # 数据库服务器监听端口       proxy_connect_timeout 60s;       proxy_timeout 300s; # 设置客户端和代理服务之间的超时时间,如果5分钟内没操作将自动断开。       proxy_pass inner_mysql;    }}
复制代码

(5)Nginx 如何配置跨域?

#允许跨域请求的域,* 代表所有add_header 'Access-Control-Allow-Origin' *;#允许请求的headeradd_header 'Access-Control-Allow-Headers' *;#允许带上cookie请求add_header 'Access-Control-Allow-Credentials' 'true';#允许请求的方法,比如 GET,POST,PUT,DELETEadd_header 'Access-Control-Allow-Methods' *; 
复制代码

(6)Nginx 如何配置限制连接?

location / {    root   /var/www/test;    index  index.php index.html index.htm;    limit_conn addr 5; #是限制每个IP只能发起5个连接}
复制代码

(7)Nginx 如何配置限制下载速度?

location /download {        limit_rate_after 10m;        limit_rate 128k;  }
复制代码

(8)Nginx 如何限制 IP 访问?

# 允许部分ip访问allow 123.45.25.6;allow 123.68.52.125;allow 123.125.25.106; # 禁止其余ip访问deny all;
复制代码

该配置可放 server 和 location 中。

(9)Nginx 如何配置 HTTP Basic 认证?

location /{    auth_basic "网站名称";    auth_basic_user_file conf.d/passwd;    autoindex on;}
复制代码

详情可阅读这篇文章为 Nginx 添加 HTTP 基本认证(HTTP Basic Authentication)

(10)Nginx 如何配置超时时间?

proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)

(11)Nginx 请求体过大怎么办?

这种场景通常出现在 Nginx 代理后端服务中。问题的报错信息如下:

413 Request Entity Too Large

解决办法配置如下即可:

client_max_body_size 20m;

(12)Nginx 如何配置负载均衡?

Nginx 负载均衡有六种策略,分别是轮询、权重、ip_hash、最少连接、fair、url_hash 等)。

(1)轮询策略

upstream  backup-server {   server    192.168.1.101:8080;    server    192.168.1.102:8080;}
复制代码

(2)权重策略

upstream  backup-server {   server    192.168.1.101:8080 weigh=5;    server    192.168.1.102:8080 weigh=6;}
复制代码

(3)ip_hash 策略

upstream  backup-server {   ip_hash;   server    192.168.1.101:8080 weigh=5;    server    192.168.1.102:8080 weigh=6;}
复制代码

(4)最少连接策略

upstream  backup-server {   least_conn;   server    192.168.1.101:8080 weigh=5;   server    192.168.1.102:8080 weigh=6;}
复制代码

(5)fair 策略

upstream  backup-server {   server    192.168.1.101:8080;    server    192.168.1.102:8080;   fair;}
复制代码

(6)url_hash 策略

upstream  backup-server {   hash $request_uri;   server    192.168.1.101:8080;   server    192.168.1.102:8080;}
复制代码

八、Nginx 的安全策略需要从哪些方面考虑?

1.隐藏 Nginx 版本信息,防止对应的攻击者通过版本漏洞来攻击

server_tokens off;

2.限制 HTTP 请求方式

HTTP 请求一共有九种,分别为 GET、POST、Head、OPTIONS、PUT、PATCH、DELETE、TRACE、CONNECT 等。

这里我仅仅只允许 GET 与 POST:

if ($request_method !~ ^(GET|POST)$ ) {    return 404;}
复制代码

3.自定义 Nginx 缓存

proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的设置proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传
复制代码

4.过滤非法 USER-AGENT(简称 UA)

if ($http_user_agent ~* "java|python|perl|ruby|curl|bash|echo|uname|base64|decode|md5sum|select|concat|httprequest|httpclient|nmap|scan" ) {    return 403;}
复制代码

5.过滤不支持 URL

location ~* \.(bak|save|sh|sql|mdb|svn|git|old)$ {    rewrite ^/(.*)$  $host  permanent;}
复制代码

6.强制域名访问(必须开启 SSL 保护)

if ( $host !~* 'youcongtech.com' ) {    return 403;}
复制代码

7.用户降低权限

user nginx www;
复制代码

8.禁止目录浏览

autoindex off;
复制代码

9.限制文件上传大小

client_max_body_size 18m

10.关注 Nginx 所使用版本的漏洞情况,并适时更新

关于 Nginx 相关版本信息可访问如下网址获取(Nginx 下载地址):https://nginx.org/en/download.html

当然了,这仅仅是从 Nginx 的安全角度出发,光从 Nginx 出发只能在一定程度上保障 Nginx 本身的安全,还是得从服务器层面乃至制度层面入手。

九、Nginx 架构是怎样的?

1.Nginx 架构设计的核心主要包含哪些方面?


由图可知,架构设计的核心主要体现如下:

  • (1)模块化设计。

  • (2)代理设计。

  • (3)事件驱动模型。

  • (4)主进程模型。

  • (5)工作进程模型。

2.Nginx 启动流程是怎样的?


3.Nginx 源代码对应的目录是什么意思?

Nginx 源代码目录为如下:

- core (该目录存放core module的代码,也是nginx服务的入口)- event (nginx 自身对事件处理逻辑的封装)- http (http core module 的代码,nginx作为web/http proxy server运行时的核心模块)- mail (mail core module 的代码,nginx作为pop3/imap/smtp proxy server运行时的核心模块)- misc (nginx 的一些utils,定义了test和profiler的一些外围模块的逻辑)- os (nginx对各个平台抽象逻辑的封装)- stream (nginx用来实现四层协议的转发、代理和负载均衡)
复制代码

十、总结

光凭这一篇文章很难深入到 Nginx 的各种细节当中,不过此文章着重体现两个方面,第一个方面是 Nginx 各种配置示例(基本来源于我个人架构生涯中的 Nginx 实战),第二个方面总览 Nginx 架构,明确架构核心、启动流程、源代码目录的含义等(读者朋友可根据自己需要进行查阅相关资料并深入学习实践等)。

参考资料


推荐一个零声教育 C/C++后台开发的免费公开课程,个人觉得老师讲得不错,分享给大家:C/C++后台开发高级架构师,内容包括Linux,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等技术内容,立即学习


用户头像

还未添加个人签名 2022.05.06 加入

还未添加个人简介

评论

发布
暂无评论
深入浅出Nginx实战与架构原理_nginx_C++后台开发_InfoQ写作社区