Nginx 现在几乎是众多大型网站的必用技术,大家应该都知道 Nginx 被 F5 收购的大事件,章亦春也在专心维护 OpenResty 项目构建和谐家园,无论你选择 Nginx 还是 OpenResty,都需要对 Nginx 有一个比较全面的了解,日后才能做到事半功倍。本文以开发者必备的 Nginx 基础知识为主,在参考文章中罗列了目前比较优秀的 Nginx 和 OpenResty 参考教程,希望对大家有帮助。
Nginx 基础知识
Nginx 是什么?
Nginx 是一个 web 服务器,主要处理客户端和服务器的请求分发。
特点和优势
使用和扩展
开源免费的 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 客户端请求类型,如 GET、POST $remote_addr 客户端的 IP 地址 $args 请求中的参数 $content_length 请求头中的 Content-length 字段 $http_user_agent 客户端 agent 信息 $http_cookie 客户端 cookie 信息 $remote_addr 客户端的 IP 地址 $remote_port 客户端的端口 $server_protocol 请求使用的协议,如 HTTP/1.0、HTTP/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 常用命令
``` bash
# 快速关闭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 从入门到实战