Nginx
Nginx是什么
Nginx是一个高性能的 HTTP 和反向代理服务器,特点是占用内存少,并发能力强,事实上Nginx的并发能力确实在同类型的网页服务器中表现较好。
Nginx 专为性能优化而开发,性能是其最重要的要求,十分注重效率,有报告 Nginx 能支持高达 50000 个并发连接数
Nginx的功能
正向代理
正向代理:局域网中的电脑用户想要直接访问网络是不可行的,只能通过代理服务器来访问,这种代理服务就被称为正向代理。
反向代理
反向代理:客户端无法感知代理,因为客户端访问网络不需要配置,只要把请求发送到反向代理服务器,由反向代理服务器去选择目标服务器获取数据,然后再返回到客户端。
客户端通过Nginx来透明的调用后台服务器,Nginx来选择具体的Worker
负载均衡
当Nginx反向代理了多个同类型实例的时候,选择一个可以最大化并发量或者效率的服务器调用方式,来将请求路由到对应的Worker上,就是负载均衡
动静分离
根据用户请求的区别,将动态页面和静态页面的处理交给不同的服务器,加快解析的速度,降低单个服务器路由的压力。
高可用
Nginx 的配置文件
user nginx; # 定义 Nginx 运行的用户和用户组。 |
Nginx自带的变量
变量名称 | 描述 |
---|---|
$remote_addr | 客户端的 IP 地址。 |
$remote_port | 客户端的端口号。 |
$remote_user | 客户端的用户名(如果 HTTP 基本认证通过)。 |
$http_user_agent | 客户端请求中的 User-Agent 。 |
$http_cookie | 客户端请求中的 Cookie 值。 |
$server_addr | 服务器的 IP 地址。 |
$server_name | 请求中匹配的 server_name 。 |
$server_port | 服务器的端口号。 |
$hostname | Nginx 服务器的主机名。 |
$request_uri | 完整的原始请求 URI,包含查询字符串。 |
$uri | 去掉查询字符串的 URI,可以被内部重定向修改。 |
$document_uri | 与 $uri 相同,不能被内部重定向修改。 |
$document_root | 请求的根目录,通常由 root 或 alias 指定。 |
$realpath_root | 文件系统中真实的路径,解析符号链接后的值。 |
$query_string | 请求 URL 中的查询字符串部分。 |
$args | 与 $query_string 相同。 |
$request_method | 请求方法(如 GET 、POST 等)。 |
$scheme | 请求使用的协议(http 或 https )。 |
$is_args | 如果有查询字符串则为 ? ,否则为空字符串。 |
$request | 请求行的完整内容,如 GET /index.html HTTP/1.1 。 |
$request_length | 请求的总大小,包括请求行、头部和请求体。 |
**$http_* ** | 代表客户端请求中的任意 HTTP 头部,如 $http_host 、$http_referer 。 |
$proxy_add_x_forwarded_for | 客户端的 IP 和 X-Forwarded-For 头的组合。 |
$proxy_host | 代理服务器的主机名。 |
$proxy_port | 代理服务器的端口号。 |
$upstream_addr | 实际处理请求的上游服务器的地址。 |
$upstream_response_time | 上游服务器的响应时间。 |
$status | HTTP 响应的状态码。 |
$bytes_sent | 发送给客户端的总字节数。 |
$body_bytes_sent | 响应体的字节数,不包括头部。 |
**$sent_http_* ** | 响应中的 HTTP 头部,如 $sent_http_content_type 。 |
$connection | 当前连接的序列号。 |
$connection_requests | 当前连接处理的请求数。 |
$nginx_version | Nginx 的版本号。 |
$request_filename | 当前请求对应的文件路径。 |
$document_root | 当前请求的根目录路径。 |
$realpath_root | 解析符号链接后的实际根目录路径。 |
$time_local | 本地时间,格式如 04/Jul/2024:15:45:10 +0800 。 |
$time_iso8601 | ISO 8601 格式的时间,如 2024-07-04T15:45:10+08:00 。 |
$ssl_protocol | SSL/TLS 协议版本。 |
$ssl_cipher | SSL/TLS 使用的加密算法。 |
$ssl_client_cert | 客户端证书的完整内容(PEM 编码)。 |
$ssl_client_fingerprint | 客户端证书的 SHA1 指纹。 |
$limit_rate | 限制传输速率,单位为字节/秒。 |
$pid | Nginx 进程的 PID。 |
Location与正则
location[ = | ~ | ~* | ^~] url{} |
location 指令说明,该语法用来匹配 url,语法如上:
- =:用于不含正则表达式的 url 前,要求字符串与 url 严格匹配,匹配成功就停止向下搜索并处理请求。
- ~:用于表示 url 包含正则表达式,并且区分大小写。
- **~*:**用于表示 url 包含正则表达式,并且不区分大小写。
- ^~:用于不含正则表达式的 url 前,要求 Nginx 服务器找到表示 url 和字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再匹配。
- 如果有 url 包含正则表达式,不需要有 ~ 开头标识。
Nginx的高可用
Nginx 高可用的核心要素
- 负载均衡:将流量分发到多个后端服务器,从而避免单个服务器的瓶颈或宕机影响整体系统的可用性。
- 故障转移(Failover):当一台服务器不可用时,流量自动转移到另一台健康的服务器,确保服务不中断。
- 无状态架构:通过会话保持、共享存储等技术,确保服务的可扩展性和高可用性。
- 集群化部署:多个 Nginx 实例协同工作,提高冗余和容错能力。
Nginx 高可用的实现方式
- 使用 Keepalived 实现主备切换(Master-Slave Failover)
Keepalived 是一个常用于实现高可用性服务的工具。它通过虚拟 IP(VIP)的方式实现主备 Nginx 节点之间的自动切换。当主 Nginx 宕机时,备份节点会自动接管 VIP 并继续提供服务。
架构示例:
- 两台 Nginx 服务器(主 Nginx 和备份 Nginx)配置了 Keepalived 进行主备切换。
- 一个虚拟 IP(VIP)用于接收客户端请求,VIP 会根据 Keepalived 的状态漂移到不同的服务器。
- 当主 Nginx 服务器宕机时,Keepalived 自动将 VIP 转移到备 Nginx 服务器,客户端请求无感知切换。
基本配置:
/etc/keepalived/keepalived.conf
Keepalived 配置(主服务器):
vrrp_instance VI_1 { |
Keepalived 配置(备份服务器)
vrrp_instance VI_1 { |
Nginx 高可用的架构图示
+-------------------------+ +-------------------------+ |
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Comment