Nginx配置示例教程

       最近对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 负载均衡

原理图详见附录的负载均衡图。

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对应的objdev桶的Access Policy设置为public。
访问URL:http://localhost:8000/uploads/sub/my.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,才会生效!(切记!)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一望无际的大草原

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值