• 深入浅出Nginx实战与架构


    本文主要内容如下(让读者朋友们深入浅出地理解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安装)

    七、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' *;
    #允许请求的header
    add_header 'Access-Control-Allow-Headers' *;
    #允许带上cookie请求
    add_header 'Access-Control-Allow-Credentials' 'true';
    #允许请求的方法,比如 GET,POST,PUT,DELETE
    add_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架构,明确架构核心、启动流程、源代码目录的含义等(读者朋友可根据自己需要进行查阅相关资料并深入学习实践等)。

  • 相关阅读:
    响应式开发
    webstrom配置
    CSS水平垂直居中
    CSS3里的 转换与过渡动效
    CSS布局
    CSS定宽居中的实现方案
    Flex布局篇2
    编辑器中快速生成代码——emmet输入法
    display:flex实践加感悟
    websocket connet.js
  • 原文地址:https://www.cnblogs.com/youcong/p/16320227.html
Copyright © 2020-2023  润新知