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 reloadnginx 配置
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 块包含两部分内容:
- http 全局块:配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等。
- 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 路径上,访问实际的后端服务
域名解析配置,www.123.com -> 192.168.17.129
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.html和http://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=10upstream 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定向到同一个后端服务器,后端服务器为缓存时比较有效。