nginx 是什么

2025 年 10 月 22 日 星期三
7

nginx 是什么

nginx 是什么

Nginx 是一个高性能的 HTTP反向代理 web 服务器,并发性能强

nginx 中的几个重要概念

反向代理

代表服务器接收客户端请求,隐藏服务器的真实 IP 和架构。

正向代理 vs 反向代理

  • 正向代理 是“替客户端办事”(如翻墙),客户端知道代理的存在服务器不知道真实的客户端是谁(只看到代理的 IP)
  • 反向代理 是“替服务器挡事”(如负载均衡),客户端不知道代理的存在服务器知道代理的存在

个人理解:首先了解正向代理,科学上网时,外网部署的 ss、trojan 服务器,我们电脑使用 clash 等客户端然后配置代理服务器,选择节点就可以访问外网,本质:使用客户端请求-> 外网服务器-> 真正的网址,然后响应内容发回给浏览器等客户端,在这种情况下,中间的代理服务器对于客户端是可感应的,已知的。而反向代理则不同,它只知道对应的服务器地址,但这个服务器地址大概率只能到达 nginx(但在客户端视角,它感知的是这个网址对应真正提供服务的 server),再由 nginx 转发请求到后端服务器。这个过程中 nginx 代理对于客户端来说,是无感知且透明的。

负载均衡:将客户端请求,根据轮询等负载均衡算法,分发到多个后端服务器上。一句话总结,请求分发到多个服务器节点

动静分离:将静态资源文件(html、css、js)部署到 nginx 上,动态资源文件(根据用户 id 不同,响应内容不同,需要后端服务 Controller 请求数据库)部署到真正的服务器。

nginx 安装

# nginx 启动
cd /usr/local/nginx/sbin
./nginx

# nginx 查看版本
cd /usr/local/nginx/sbin
./nginx -v

# nginx 停止nginx
./nginx -s stop

# nginx 重加载,常用于修改配置文件后生效
./nginx -s reload

nginx 配置

nginx 配置文件位置

/usr/local/nginx/conf/nginx.conf

nginx 配置文件组成部分

全局块

从配置文件开始到 events 块之间的内容,主要会设置一些影响 nginx 服务器整体运行的配置指令,比如

worker_processes 1; # worker_processes 值越大,可以支持的并发处理量也越多

events 块

events 块涉及的指令主要影响 Nginx 服务器与用户的网络连接

worker_connections 1024; # 每个 worker_process 支持的最大连接数

http 块

这是 Nginx 服务器配置中最常用的部分,代理、缓存和日志定义等绝大多数功能和第三方模块的配置都在这里。

需要注意的是:http 块包括 http 全局块、server 块。每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。

http 块包含两部分内容:

  1. http 全局块:配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
  2. server 块:这块和虚拟主机有密切关系,虚拟主机从用户角度看,和一台独立的硬件主机是完全一样的,该技术的产生是为了 节省互联网服务器硬件成本。
    • 全局 server 块:最常见的配置是本虚拟机主机的监听配置和本虚拟主机的域名或 IP 配置。
    • location 块:一个 server 块可以配置多个 location 块,主要作用是基于 Nginx 服务器接收到的请求字符串(例如 server_name/uri-string),对虚拟主机名称(也可以是 IP 别名)之外的 字符串(例如前面的/uri-string)进行 匹配,对特定的请求进行处理。地址定向、数据缓存和应答控制等功能,还有许多第三方模块的配置也在这里进行。T

Nginx 配置实例——反向代理

(1)准备工作

  • 部署服务,使用 web 服务器部署一个后端服务,并启动
  • 对外开放端口,服务器防火墙开放相应的端口,如果 vps 主机有安全组,也要开放相应端口
  • 浏览器测试是否能正常访问

(2)反向代理配置

示例一

实现效果:访问域名 www.123.com,会跳转到 127.0.0.1:8080 路径上,访问实际的后端服务

  1. 域名解析配置,www.123.com -> 192.168.17.129

  2. nginx 配置文件中,配置反向代理

    server {
        listen 80; //监听的请求端口
        server_name 192.168.17.129;//监听的ip 或 域名
        
        location / {
            proxy_pass http://127.0.0.1:8080;
        }
    }

    示例二

    实现效果:使用 nginx 反向代理,根据访问的路径跳转到不同端口的服务中,nginx 监听端口为 9001,

    • 访问 http://192.168.17.129:9001/edu/ 直接跳转到 127.0.0.1:8080
    • 访问 http://192.168.17.129:9001/vod/ 直接跳转到 127.0.0.1:8081

(1)准备工作

  • 准备两个 tomcat 服务器,一个 8080 端口,一个 8081 端口
  • 创建文件夹和测试页面,使得访问 http://192.168.17.129:8080/edu/a.htmlhttp://192.168.17.129:8081/vod/a.html 成功

(2)nginx 配置

  • http 块里再配置一个 server 块,具体配置如下:
server {
    listen 9001;
    server_name 192.168.17.129;
    
    location ~ /edu/ { # 这里 ~ 代表使用正则表达式对路径进行匹配
        proxy_pass http://127.0.0.1:8080;
    }
    location ~ /vod/ {
        proxy_pass http://127.0.0.1:8081;
    }
}
  • 开放对外端口,9001 8080 8081

location 指令说明

该指令用于匹配 URL。 语法如下:

location [= | ~ | ~* | ^~] uri {

}
模式含义
location = /uri= 表示精确匹配,只有完全匹配上才能生效
location ^~ /uri^~ 开头对 URL 路径进行前缀匹配,并且在正则之前。
location ~ pattern开头表示区分大小写的正则匹配
location ~* pattern开头表示不区分大小写的正则匹配
location /uri不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location /通用匹配,任何未匹配到其它 location 的请求都会匹配到,相当于 switch 中的 default

多个 location 配置的情况下匹配顺序为:

  • 首先精确匹配 =
  • 其次前缀匹配 ^~
  • 其次是按文件中顺序的正则匹配
  • 然后匹配不带任何修饰的前缀匹配。
  • 最后是交给 / 通用匹配
  • 当有匹配成功时候,停止匹配,按当前匹配规则处理请求

所以实际使用中,至少有三个匹配规则定义,如下:

# 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理,官网如是说。
# 这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
    proxy_pass http://tomcat:8080/index
}

# 第二个必选规则是处理静态文件请求,这是 nginx 作为 http 服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ {
    root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ {
    root /webroot/res/;
}

# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
# 毕竟目前的一些框架的流行,带.php、.jsp后缀的情况很少了
location / {
    proxy_pass http://tomcat:8080/
}

Nginx 配置实例——负载均衡

1、实现效果 浏览器地址栏输入地址 http://192.168.17.129/edu/a.html,负载均衡,平均分配到 8080 和 8081 端口中

2、准备工作

  • 准备两台 tomcat 服务器,一台 8080,一台 8081
  • 在两台 tomcat 里面 webapps 目录中,创建名称是 edu 文件夹,在 edu 文件夹中创建页面 a.html,用于测试

3、负载均衡配置

  • http 块中配置负载均衡服务列表 upstream myserver {server ...; server ...;}
  • server块的location中配置proxy_pass http://myserver;
http {
    upstream myserver {
        server 115.28.52.63:8080 weight=1;
        server 115.28.52.63:8180 weight=1;
    }
    server {
        listen 9001;
        server_name 192.168.17.129;
        location / {
            proxy_pass http://myserver;
            proxy_connect_timeout 10;
        }
    }
}

可以配置不同的负载均衡策略:

  • 轮询

    upstream myserver {
        server 115.28.52.63:8080;
        server 115.28.52.63:8180;
    }
  • 指定权重weight=10

    upstream myserver {
        server 115.28.52.63:8080 weight=10;
        server 115.28.52.63:8180 weight=5;
    }
  • ip绑定ip_hash;

    upstream myserver { 
        ip_hash; 
        server 192.168.0.14:88; 
        server 192.168.0.15:80; 
    }
  • 按后端服务器的响应时间来分配请求,响应时间短的优先分配。fair;

upstream myserver { 
    server server1; 
    server server2; 
    fair; 
}
  • 按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。

使用社交账号登录

  • Loading...
  • Loading...
  • Loading...
  • Loading...
  • Loading...