最近对Nginx做了一些初步研究,Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发。主要根据工作中各类应用服务部署访问的需求,围绕HTTP服务、负载均衡、正反向代理、子路由、静态资源发布访问等,以及结合minio管理的图片文件资源预览,如何快速搭建web服务的一些研究和探索,也包括一些基本指令的解释和正则表达式等,主要编写了几个应用示例,其实Nginx应用范围非常广泛,功能都比较实用,任何一个功能都可以单独展开研究,比如关于性能优化的gzip功能,本文只是总结常见的应用场合,同时,Nginx支持master-worker和单进程模式,这里主要介绍单进程模式,供大家参考。
一、nginx启动
start nginx或 nginx.exe
重新载入nginx:nginx.exe -s reload
查看版本:nginx -v
二、nginx停止
nginx.exe -s stop 或 nginx.exe -s quit
三、nginx配置文件整体结构
... #全局块
events { #events块
...
}
http #http块
{
... #http全局块
server #server块
{
... #server全局块
location [PATTERN] #location块
{
...
}
location [PATTERN]
{
...
}
}
server
{
...
}
... #http全局块
}
四、nginx配置说明
1.指令说明
server : 用于定义服务,http中可以有多个server块
listen : 指定服务器侦听请求的IP地址和端口,如果省略地址,服务器将侦听所有地址,如果省略端口,则使用标准端口80
server_name : 服务名称,用于配置域名
location : 用于配置映射路径uri对应的配置,一个server中可以有多个location, location后面跟一个uri,可以是一个正则表达式, / 表示匹配任意路径, 当客户端访问的路径满足这个uri时就会执行location块里面的代码
root : 根路径,当访问http://localhost/test.html,“/test.html”会匹配到"/"uri, 找到root为/usr/local/var/www/html,用户访问的资源物理地址=root + uri = /usr/local/var/www/html + /test.html=/usr/local/var/www/html/test.html
index : 设置首页,当只访问server_name时后面不跟任何路径是不走root直接走index指令的;如果访问路径中没有指定具体的文件,则返回index设置的资源,如果访问http://localhost/html/ 则默认返回index.html;如果指定了路径,就直接从root中找对应该uri指定的文件。
set指令:语法 为set 变量名 变量值 ; 引用使用:$变量名,详见第2个示例。
2.uri正则表达式
1) . : 匹配除换行符以外的任意字符
2)? : 重复0次或1次
3)+: 重复1次或更多次
4)*: 重复0次或更多次
5) \d :匹配数字
6) ^ : 匹配字符串的开始
7)$ : 匹配字符串的结束
8){n} : 重复n次
9){n,} : 重复n次或更多次
10) [ ] : 匹配单个字符c
11) [a-z] : 匹配a-z小写字母的任意一个
12) (a|b|c) : 属线表示匹配任意一种情况,每种情况使用竖线分隔,一般使用小括号括括住,匹配符合a字符 或是b字符 或是c字符的字符串
13) \ 反斜杠:用于转义特殊字符
其中,小括号()之间匹配的内容,可以在后面通过$1来引用,$2表示的是前面第二个()里的内容。正则里面容易让人困惑的是\转义特殊字符。
五、nginx应用场景示例
1.示例:HTTP Server
http {
server {
listen 8081;
server_name localhost;
client_max_body_size 1024M;
# 默认location
location / {
root /usr/local/var/www/html;
index index.html index.htm;
}
}
}
访问URL:http://localhost:8081
2.示例:HTTP 静态资源
http {
server {
listen 8081;
server_name localhost;
set $doc_root /usr/local/var/www/html;
# 默认location
location / {
root /usr/local/var/www/html;
index index.html index.htm;
}
location ^~ /images/ {
root $doc_root;
}
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
}
}
访问URL:http://localhost:8081/my.png 或 http://localhost:8081/images/my.png
3.示例:HTTP 反向代理
作用:保护和隐藏原始资源服务器、- 加密和SSL加速、负载均衡、解决前端跨域问题,原理图详见附录的正向代理图和反向代理图
http {
server {
listen 8081;
server_name localhost;
# 默认location
location / {
proxy_pass http://localhost:8000;
# 设置用户ip地址
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# 当请求服务器出错去寻找其他服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
}
}
}
访问URL:http://localhost:8081,将会自动跳转到http://localhost:8000
4.HTTP 反向代理+子路由
http {
# 10.HTTP 数字孪生项目配置。
server {
listen 81;
access_log logs/host.access.log main;
error_log logs/error.log; # 修正错误日志路径
client_max_body_size 200m;
root /usr/local/var/www/html;
index index.html index.htm;
location / {
try_files $uri $uri/ /index.html;
}
# 指定压缩路由的头,开启Gzip压缩
location ~* \.gz$ {
add_header Content-Encoding gzip;
gzip on; # 开启Gzip压缩
gzip_proxied any; #对任意代理请求回应压缩
gzip_types application/javascript application/x-javascript text/javascript text/plain application/xml text/css; #指定主要压缩的资源类型,一般主要有文本类资源,如json/js/css/xml等
# 每当客户端的 Accept-Encoding-capabilities 头发生变化时,告诉代理缓存 gzip 和常规版本的资源。避免了不支持 gzip 的客户端(这在今天极为罕见)在代理给它们 gzip 版本时显示乱码的问题,缺省为off
gzip_vary on;
gzip_disable "MSIE [1-6]\.(?!.*SV1)";
}
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
# 指定子路由路径
location /superdev {
# 指定第二个网站的根目录
alias /usr/local/var/www/html/superdev;
index index.html index.htm;
try_files $uri $uri/ /usr/local/var/www/html/superdev/index.html last;
}
# 指定子路由映射的反向代理
location /apis/ {
proxy_pass http://127.0.0.1:8080/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
# 指定子路由映射的反向代理
location /minioui/ {
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-NginX-Proxy true;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_pass http://localhost:9000/; # 修改为正确的 MinIO Console 端口
proxy_redirect off;
sub_filter 'href="/' 'href="/minioui/';
sub_filter 'src="/' 'src="/minioui/';
sub_filter 'url("/' 'url("/minioui/';
sub_filter_once off;
}
}
访问URL:http://localhost:81/,http://localhost:81/apis,http://localhost:81/minioui
5.示例:HTTP 负载均衡
原理图详见8.负载均衡
http {
# 4.HTTP 负载均衡(4/5转到8000端口,1/5转到8082端口)
upstream web_servers {
server localhost:8000 weight=4;
server localhost:8082 weight=1;
server localhost:8082 weight=2 backup; # 热备,只有当前两个都宕机的情况下才走这里。
}
server {
listen 8081;
server_name localhost;
access_log logs/host.access.log main;
# 默认location
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
}
}
访问URL:http://localhost:8081,将会自动跳转到http://localhost:8000
6.示例:HTTP 动静分离
http {
# 5.HTTP 动静分离(1/5转到8000端口,4/5转到8081端口)
upstream web_servers {
server localhost:8000 weight=1;
server localhost:8081 weight=4;
server localhost:8082 weight=2 backup; # 热备,只有当前两个都宕机的情况下才走这里。
}
server {
listen 8081;
server_name localhost;
access_log logs/host.access.log main;
set $doc_root /usr/local/var/www;
location ~* \.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)$ {
root $doc_root/img;
}
location / {
proxy_pass http://web_servers;
# 必须指定Header Host
proxy_set_header Host $host:$server_port;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $doc_root;
}
}
}
访问URL:http://localhost:8081,将会自动跳转到http://localhost:8081,或者访问http://localhost:8081/my.png 或 http://localhost:8081/50x.html
7.示例:通过Nginx构建Minio管理的文件及图片预览。
通过Nginx实现Minio上传的文件及图片预览是一个非常简单而强大的功能。我们只需要将Nginx配置为代理Minio服务器,并配置一个新的服务器块来提供文件预览功能。通过这种方式,我们可以实现高效的文件上传和预览,从而提升用户体验。
http {
server {
# 监听在8081端口,进行请求路由转发
listen 8081;
server_name localhost;
location / { # 将所有8081端口过来的访问路由到proxy_pass指定的url
proxy_pass http://localhost:9000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
server {
# 监听在8000端口,进行请求路由转发,实现minio存放的图片文件浏览与下载
listen 8000;
server_name localhost;
location /uploads { # 只能配置指定目录下的所有文件,不支持字目录
alias /usr/local/minio/data0/objdev;
}
location /uploads/sub { # 只能配置指定目录下的所有文件,不支持字目录
alias /usr/local/minio/data0/objdev/2024/const/model;
}
}
}
说明:minio必须时2022年5月及之前的版本,新版本不支持,同时,minio对应的mxglfsdev桶的Access Policy设置为public。
访问URL:http://localhost:8000/uploads/sub/深海一号.png 或 http://localhost:8000/uploads/my.png
8.HTTP 反向代理 + 负载均衡 + 缓存控制
HTTP 反向代理 + 负载均衡 + 缓存控制,其中负载的1/5转到8000端口,4/5转到8081端口。
http {
# 8.HTTP 反向代理 + 负载均衡 + 缓存控制,其中负载的1/5转到8000端口,4/5转到8081端口.
upstream web_servers {
server localhost:8000 weight=1;
server localhost:8081 weight=4;
server localhost:8082 weight=2 backup; # 热备,只有当前两个都宕机的情况下才走这里。
}
# 全局缓存配置,缓存静态文件的请求(语法:路径 名称 大小;my_cache 是缓存区域的名称)
proxy_cache_path /usr/local/var/nginx/cache keys_zone=my_cache:10m levels=1:2 max_size=1g;
proxy_temp_path /usr/local/var/nginx/temp;
server {
listen 81;
server_name localhost;
access_log logs/host.access.log main;
set $doc_root /usr/local/var/www;
# 启用缓存和压缩功能
gzip on;
gzip_types text/css application/javascript image/png;
# 处理静态文件
location /static/ {
root $doc_root/static; # 静态文件路径,用于定义该路径对应的文件系统目录
expires 30d; # 缓存30天
}
# 处理动态请求,使用负载均衡和反向代理
location / {
proxy_pass http://10.23.10.12; # 反向代理到后端服务器池,比如http://backend_servers
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache my_cache; # 启用缓存,用前面定义的全局缓存:my_cache
proxy_cache_valid 200 302 10m; # 成功和重定向的缓存时间为10分钟
proxy_cache_valid 404 1m; # 404页面缓存1分钟
}
# 自定义错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root $doc_root/errors; # 错误页面路径
}
}
}
访问URL:http://localhost:81/,http://localhost:81/static
四、附录
1.正向代理图
Proxy和client属于同一网段或LAN,对Server透明,Proxy的作用就是代为转发请求和响应。
2.反向代理图
Proxy和Server属于同一网段或LAN,对Client透明,Proxy的作用就是代为转发请求和响应。
3.负载均衡
用户请求HTTP负载均衡服务器((116.100.50.10)),负载均衡服务器通过一套算法从应用服务器集群中返回用户(浏览器)为一台新的地址(116.100.50.3),后续用户通过发送请求到新的地址完成请求响应等服务(116.100.50.3)。
4.其他说明
1)配置文件中的结尾要有;作为结束~!(切记!)
2)每次实验修改完配置文件后,需要重启 nginx,才会生效!(切记!)