V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
wsgzao
V2EX  ›  程序员

Nginx 基础知识从小白到入门

  •  1
     
  •   wsgzao ·
    wsgzao · 2019-11-13 19:05:55 +08:00 · 3696 次点击
    这是一个创建于 1836 天前的主题,其中的信息可能已经有所发展或是发生改变。

    前言

    Nginx 现在几乎是众多大型网站的必用技术,大家应该都知道Nginx 被 F5 收购的大事件,章亦春也在专心维护 OpenResty 项目构建和谐家园,无论你选择 Nginx 还是 OpenResty,都需要对 Nginx 有一个比较全面的了解,日后才能做到事半功倍。本文以开发者必备的 Nginx 基础知识为主,在参考文章中罗列了目前比较优秀的 Nginx 和 OpenResty 参考教程,希望对大家有帮助。

    Nginx 基础知识从小白到入门

    更新历史

    2019 年 11 月 12 日 - 初稿

    阅读原文 - https://wsgzao.github.io/post/nginx/

    扩展阅读

    nginx.org

    NGINX Plus

    OpenResty


    Nginx 基础知识

    Nginx 是什么?

    Nginx 是一个 web 服务器,主要处理客户端和服务器的请求分发。

    特点和优势

    1. 高并发
    2. 热部署
    3. 低功耗
    4. 热部署

    使用和扩展

    开源免费的 Nginx 与商业版 Nginx Plus,与之对应的是免费 OpenResty 与商业版 OpenResty

    陶辉《深入理解 Nginx 》作者在极客时间上的讲义 PDF 已经介绍的非常详细了,如果觉得课程不错可以选择购买尽量少走弯路

    极客时间:nginx 核心知识 100 讲配置文件与代码分享

    nginx 正向代理与反向代理

    为了便于理解,首先先来了解一下一些基础知识,nginx 是一个高性能的反向代理服务器那么什么是反向代理呢?

    代理是在服务器和客户端之间假设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务端的响应转发给客户端。

    不管是正向代理还是反向代理,实现的都是上面的功能。

    如果你对OSI 七层模型与 TCP/IP 四层模型不是很熟悉可以再回顾下

    正向代理

    正向代理( forward )意思是一个位于客户端和原始服务器 (origin server) 之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标 (原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。

    正向代理是为我们服务的,即为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源。

    正向代理对我们是透明的,对服务端是非透明的,即服务端并不知道自己收到的是来自代理的访问还是来自真实客户端的访问。

    反向代理

    反向代理( Reverse Proxy )方式是指以代理服务器来接受 internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。

    反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等。

    反向代理对服务端是透明的,对我们是非透明的,即我们并不知道自己访问的是代理服务器,而服务器知道反向代理在为他服务。

    nginx 基本配置

    安装 nginx 时通常需要编译自己需要的模块,可以使用 rpmbuild 制作 Nginx 的 RPM 包

    main                                # 全局配置
    
    events {                            # nginx 工作模式配置
    }
    
    http {                                # http 设置
        ....
    
        server {                        # 服务器主机配置
            ....
            location {                    # 路由配置
                ....
            }
    
            location path {
                ....
            }
    
            location otherpath {
                ....
            }
        }
    
        server {
            ....
    
            location {
                ....
            }
        }
    
        upstream name {                    # 负载均衡配置
            ....
        }
    }
    

    如果想要生成 nginx 规范配置,可以参考nginxconfig.io

    下面是 nginx 一些配置中常用的内置全局变量,你可以在配置的任何位置使用它们。

    | 变量名 | 功能 | | --- | --- | | $host | 请求信息中的 Host,如果请求中没有 Host 行,则等于设置的服务器名 | | $request_method | 客户端请求类型,如 GETPOST | | $remote_addr | 客户端的 IP 地址 | | $args | 请求中的参数 | | $content_length | 请求头中的 Content-length 字段 | | $http_user_agent | 客户端 agent 信息 | | $http_cookie | 客户端 cookie 信息 | | $remote_addr | 客户端的 IP 地址 | | $remote_port | 客户端的端口 | | $server_protocol | 请求使用的协议,如 HTTP/1.0HTTP/1.1\ | | $server_addr | 服务器地址 | | $server_name | 服务器名称 | | $server_port | 服务器的端口号 |

    nginx 负载均衡

    Upstream 指定后端服务器地址列表,在 server 中拦截响应请求,并将请求转发到 Upstream 中配置的服务器列表。

    upstream balanceServer {
        server 10.1.22.33:12345;
        server 10.1.22.34:12345;
        server 10.1.22.35:12345;
    }
    
    server {
        server_name  fe.server.com;
        listen 80;
        location /api {
            proxy_pass http://balanceServer;
        }
    }
    

    上面的配置只是指定了 nginx 需要转发的服务端列表,并没有指定分配策略。

    默认情况下采用的是轮询策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配在这台服务器下的用户。

    nginx 常用命令

    # 快速关闭 Nginx,可能不保存相关信息,并迅速终止 web 服务
    nginx -s stop
    # 平稳关闭 Nginx,保存相关信息,有安排的结束 web 服务
    nginx -s quit
    # 因改变了 Nginx 相关配置,需要重新加载配置而重载
    nginx -s reload
    # 重新打开日志文件
    nginx -s reopen
    # 为 Nginx 指定一个配置文件,来代替缺省的
    nginx -c filename
    # 不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件
    nginx -t
    #  显示 nginx 的版本
    nginx -v
    # 显示 nginx 的版本,编译器版本和配置参数
    nginx -V
    # 格式换显示 nginx 配置参数
    2>&1 nginx -V | xargs -n1
    2>&1 nginx -V | xargs -n1 | grep lua
    

    参考文章

    以上内容只是 nginx 的冰山一角,我个人推荐大家跟着官方文档或者类似极客时间的教程学习,可以少走很多弯路

    nginx documentation

    前端开发者必备的 nginx 知识

    百万并发下 Nginx 的优化之道

    agentzh 的 Nginx 教程

    OpenResty 最佳实践

    以下为极客时间专栏

    Nginx 核心知识 100 讲

    极客时间:nginx 核心知识 100 讲配置文件与代码分享

    OpenResty 从入门到实战

    2 条回复    2019-11-13 20:38:59 +08:00
    Mithrandir
        1
    Mithrandir  
       2019-11-13 19:53:07 +08:00
    我选 envoy (#滑稽)
    kidlj
        2
    kidlj  
       2019-11-13 20:38:59 +08:00
    我选 envoy (#站队)
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 20:15 · PVG 04:15 · LAX 12:15 · JFK 15:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.