Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【Nginx】Nginx部署实战——静态文件+反向代理+均衡负载+Https+Websocket

【Nginx】Nginx部署实战——静态文件+反向代理+均衡负载+Https+Websocket

作者头像
DDGarfield
发布于 2022-06-23 09:25:09
发布于 2022-06-23 09:25:09
2.4K00
代码可运行
举报
文章被收录于专栏:加菲的博客加菲的博客
运行总次数:0
代码可运行

Nginx是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。前一段时间听说Igor Sysoev被俄罗斯警方带走了,不知道放出来了没有。言归正常,来看一下nginx的相关配置如何满足我们的日常需求吧。

0.巧克力安装nginx

由于博主手上是windows,所以直接介绍windows下如何安装nginx,如果想知道linux下如何安装,请阅读另一篇文章http://www.randyfield.cn/post/2019-06-01-netcore-centos/#3-nginx

记得CentOs下是不是有yum软件包管理器,那windows下呢?有没有这么方便的东西?答案是肯定的,chocolatey,

chocolatey

  • chocolatey安装
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Get-ExecutionPolicy

#如果返回的是Restricted
#就运行如下命令
Set-ExecutionPolicy AllSigned

#或者
Set-ExecutionPolicy Bypass -Scope Process

#接着执行-Paste the follow text into your shell and press Enter
#Wait a few seconds for the command to complete
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))

#If you don't see any errors, you are ready to use Chocolatey
  • 安装nginx
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
choco install nginx

这里有两点需要注意

  1. 通过choco安装nginx,会配套安装NSSM,这是个好东西,可以把nginx注册成windows服务,相当于linux下的SupervisorPM2
  2. 通过choco安装nginx,在最后一次需要您同意选择y[Yes]之前,注意回写的内容是,他将会执行C:\ProgramData\chocolatey\lib\nginx\tools\chocolateyInstall.ps1脚本
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   $toolsDir = Split-Path -parent $MyInvocation.MyCommand.Definition
   . "$toolsDir\helpers.ps1"
   
   $pp = Get-PackageParameters
   
   $arguments = @{
       packageName = $env:chocolateyPackageName
       file        = "$toolsDir\nginx-1.17.8.zip"
       destination = if ($pp.installLocation) { $pp.installLocation } else { Get-ToolsLocation }
       port        = if ($pp.Port) { $pp.Port } else { 80 }
       serviceName = if ($pp.NoService) { $null } elseif ($pp.serviceName) { $pp.serviceName } else { 'nginx' }
   }
   
   if (-not (Assert-TcpPortIsOpen $arguments.port)) {
       throw 'Please specify a different port number...'
   }
   
   Install-Nginx $arguments
   

注意看port那行,没错,80端口,nginx默认,所以在继续之前,请检查下80端口是否被占用,被占用就会安装失败。怎么办?这是您只需要编辑如上脚本,把80修改为一个未被占用的端口。然后回到命令窗口继续执行,选择Y,就能成功。

比如我修改为

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   $toolsDir = Split-Path -parent $MyInvocation.MyCommand.Definition
   . "$toolsDir\helpers.ps1"
   
   $pp = Get-PackageParameters
   
   $arguments = @{
       packageName = $env:chocolateyPackageName
       file        = "$toolsDir\nginx-1.17.8.zip"
       destination = if ($pp.installLocation) { $pp.installLocation } else { Get-ToolsLocation }
       port        = if ($pp.Port) { $pp.Port } else { 81 }
       serviceName = if ($pp.NoService) { $null } elseif ($pp.serviceName) { $pp.serviceName } else { 'nginx' }
   }
   
   if (-not (Assert-TcpPortIsOpen $arguments.port)) {
       throw 'Please specify a different port number...'
   }
   
   Install-Nginx $arguments

安装好的nginxC:\tools下,配置文件也会默认如下一节的初始化配置

1.初始化配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       81;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {
    #    listen       81;
    #    listen       81;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {
    #    listen       81 ssl;
    #    server_name  localhost;

    #    ssl_certificate      cert.pem;
    #    ssl_certificate_key  cert.key;

    #    ssl_session_cache    shared:SSL:1m;
    #    ssl_session_timeout  5m;

    #    ssl_ciphers  HIGH:!aNULL:!MD5;
    #    ssl_prefer_server_ciphers  on;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}

}

2.部署静态文件

其实初始化就是一个静态文件部署

/ 请求到html文件夹下的 index.html文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

3.部署Vue构建的静态文件

引用Vue官方文档--”vue-router 默认 hash 模式 —— 使用 URL 的 hash 来模拟一个完整的 URL,于是当 URL 改变时,页面不会重新加载。但是这里url会有一个#,那就只能改为history 模式,不过这种模式要玩好,还需要后台配置支持。因为我们的应用是个单页客户端应用,如果后台没有正确的配置,当用户在浏览器直接访问就会返回 404,这就不好看了。就需要加上try_files uri uri/ /index.html;"

try_files的含义是:首先会匹配uri文件,如果没有去匹配url/文件,如果再没有才会去找/index.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

4.反向代理

同域下部署前后端分离的前端与后端

后端这块可能部署在IIS,Node,Apache等等web服务器,但是我们又不想在前端api请求中硬编码后端url,且如果后端没有添加允许跨越的请求头,浏览器还会阻止。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        location /api/ {
            proxy_pass http://ip:port/outside/api/; #反向代理
            proxy_http_version 1.1;
            
            proxy_set_header Host $http_host;
            proxy_cookie_path /api /;
            
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

即当前端调用接口http://ip:81/api/的请求,都会被反向代理至http://ip:port/outside/api/,如果后台没有做允许跨域的配置,那么这种方式就是欺骗浏览器的解决方案。

5.均衡负载

前后端分离模式的流行,除了解决前后端开发的并行效率问题,解放生产力,解耦,快速定位问题等一系列的优点之外,还有一个就是横向扩展。大并发情况下,可以同时水平扩展前后端服务器,这个扩展就运用了均衡负载。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    #api接口部署至3个不同的地方
    upstream centerapi{
        server 192.168.110.10:82 weight=5;
        server 192.168.110.11:82 weight=3;
        server 192.168.110.10:83 weight=2;
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        location /api/ {
            proxy_pass http://centerapi/; #反向代理
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $http_host;
            proxy_cookie_path /api /;
            
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
            
            #暴露反向代理的地址
            #add_header backendIP $upstream_addr;
            #add_header backendCode $upstream_status;      
        }
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

这里的请求api接口nginx就会按照权重把请求分配下面3个url

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 upstream centerapi{
        server 192.168.110.10:82 weight=5;
        server 192.168.110.11:82 weight=3;
        server 192.168.110.10:83 weight=2;
    }

如果您想测试每次是不是不同的地址,可以让nginx把每次请求转发到的地址返回给浏览器就再加上如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 #暴露反向代理的地址
 add_header backendIP $upstream_addr;
 add_header backendCode $upstream_status;

6.子系统的融合部署

我司有一个ASP.NET MVC老项目 与前后端分离的新项目的融合

老项目一个平台,包含几个中心,其中一个中心就是新项目

  • /---反向代理至IIS 上部署的ASP.NET MVC主站
  • ^~/center1---前端构建的静态页面,已通过nginx发布
  • ^~/center1/api/---前端使用的api接口,反向代理+均衡负载
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream centerapi{
        server 192.168.110.10:82 weight=5;
        server 192.168.110.11:82 weight=3;
        server 192.168.110.10:83 weight=2;
    }
    server {
        listen       80;
        server_name  192.168.110.10;

        #主站
        location / {
            proxy_pass http://192.168.110.10/;#ASP.NET MVC主站 IIS已部署
            proxy_http_version 1.1;
            proxy_redirect off;
                 
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        #新中心前端
        location ^~/center1 {
            proxy_pass http://192.168.110.10:81/;#前端构建的静态页面 即下面的配置
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        #新中心api
        location ^~/center1/api/ {
            proxy_pass http://centerapi/;#前端调用的接口
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
           
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        #location /api/ {
            #proxy_pass http://centerapi/; #反向代理
            #proxy_http_version 1.1;
            
            #proxy_set_header Host $http_host;
            #proxy_cookie_path /api /;
            
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection keep-alive;
            #proxy_cache_bypass $http_upgrade;
            
            #暴露反向代理的地址
            #add_header backendIP $upstream_addr;
            #add_header backendCode $upstream_status;      
        #}
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

7.Https

领导说,以前iis就可以让网站通过https访问,新项目也需要,https需要ssl证书,都知道SSL证书只有大公司的证书,人家浏览器才会认,比如Symantec、Entrust、Geotrust,不然就会报不被信任的证书。但是为了迎合领导的需求,还是通过openssl生成了相关的证书。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream centerapi{
        server 192.168.110.10:82 weight=5;
        server 192.168.110.11:82 weight=3;
        server 192.168.110.10:83 weight=2;
    }
    server {
        listen       80;
        server_name  192.168.110.10;
        
        #ssl开启
        ssl	on;
        ssl_certificate ssl/server.crt;
        ssl_certificate_key ssl/server.key;

        location / {
            proxy_pass http://192.168.110.10/;#ASP.NET MVC主站
            proxy_http_version 1.1;
            proxy_redirect off;
                 
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/center1 {
            proxy_pass http://centerapi/;#前端构建的静态页面 即下面的配置
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/center1/api/ {
            proxy_pass http://192.168.110.10:81/;#前端调用的接口
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
       
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        #location /api/ {
            #proxy_pass http://centerapi/; #反向代理
            #proxy_http_version 1.1;
            
            #proxy_set_header Host $http_host;
            #proxy_cookie_path /api /;
            
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection keep-alive;
            #proxy_cache_bypass $http_upgrade;
            
            #暴露反向代理的地址
            #add_header backendIP $upstream_addr;
            #add_header backendCode $upstream_status;      
        #}
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

8.Websocket

系统突然增加了websocket的服务,直接访问ws://ip:port的前端硬编码应该杜绝,所以nginx再次发挥作用。

websocket协议不同于http协议,但是websocket握手是通过http,通过协议提升实现通信方式从http转向websocket。

8.1 ws

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream centerapi{
        server 192.168.110.10:82 weight=5;
        server 192.168.110.11:82 weight=3;
        server 192.168.110.10:83 weight=2;
    }
    upstream websocket{
        server 192.168.110.10:1443 weight=1;
    }
    server {
        listen       80;
        server_name  192.168.110.10;
        
        #ssl on;
        #ssl_certificate ssl/server.crt;
        #ssl_certificate_key ssl/server.key;

        location / {
            proxy_pass http://192.168.110.10/;#ASP.NET MVC主站
            proxy_http_version 1.1;
            proxy_redirect off;
                 
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/center1 {
            proxy_pass http://centerapi/;#前端构建的静态页面 即下面的配置
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/center1/api/ {
            proxy_pass http://192.168.110.10:81/;#前端调用的接口
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        #websocket
        location ^~/websocket/ {
            proxy_pass http://websocket;#前端调用的接口
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_connect_timeout 4s;
            proxy_read_timeout 600;
            proxy_send_timeout 12s;
        }
       
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        #location /api/ {
            #proxy_pass http://centerapi/; #反向代理
            #proxy_http_version 1.1;
            
            #proxy_set_header Host $http_host;
            #proxy_cookie_path /api /;
            
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection keep-alive;
            #proxy_cache_bypass $http_upgrade;
            
            #暴露反向代理的地址
            #add_header backendIP $upstream_addr;
            #add_header backendCode $upstream_status;      
        #}
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

8.2 wss

正常的情况下(http访问网站,接口),上面就完成了配置,但是一旦ssl on,原有的ws,就会导致控制台输出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Mixed Content: The page at ‘https://{域名}.com/‘ was loaded over HTTPS, but attempted to connect to the insecure WebSocket endpoint ‘ws://{ip}:{port}/. This request has been blocked; this endpoint must be available over WSS.
Uncaught DOMException: Failed to construct 'WebSocket': An insecure WebSocket connection may not be initiated from a page loaded over HTTPS.

那么就需要如下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
worker_processes  1;

events {
    worker_connections  1024;
}


http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    
    upstream centerapi{
        server 192.168.110.10:82 weight=5;
        server 192.168.110.11:82 weight=3;
        server 192.168.110.10:83 weight=2;
    }
    upstream websocket{
        server 192.168.110.10:1443 weight=1;
    }
    server {
        listen       80;
        server_name  192.168.110.10;
        
        ssl	on;
        ssl_certificate ssl/server.crt;
        ssl_certificate_key ssl/server.key;
        ssl_session_timeout  5m;
    	ssl_session_cache shared:SSL:50m;
    	ssl_protocols TLSv1 TLSv1.1 TLSv1.2  SSLv2 SSLv3;
     	ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
     	ssl_prefer_server_ciphers   on;

        location / {
            proxy_pass http://192.168.110.10/;#ASP.NET MVC主站
            proxy_http_version 1.1;
            proxy_redirect off;
                 
            proxy_set_header Host $host;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/center1 {
            proxy_pass http://centerapi/;#前端构建的静态页面 即下面的配置
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/center1/api/ {
            proxy_pass http://192.168.110.10:81/;#前端调用的接口
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection keep-alive;
            proxy_cache_bypass $http_upgrade;
        }
        
        location ^~/websocket/ {
            proxy_pass http://websocket;#前端调用的接口
            proxy_http_version 1.1;
            proxy_redirect off;
            
            proxy_set_header Host $host;         
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "Upgrade";
            proxy_connect_timeout 4s;
            proxy_read_timeout 600;
            proxy_send_timeout 12s;
        }
       
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }

    server {
        listen       81;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
            try_files $uri $uri/ /index.html;
            #proxy_redirect off;
        }
        
        #location /api/ {
            #proxy_pass http://centerapi/; #反向代理
            #proxy_http_version 1.1;
            
            #proxy_set_header Host $http_host;
            #proxy_cookie_path /api /;
            
            #proxy_set_header Upgrade $http_upgrade;
            #proxy_set_header Connection keep-alive;
            #proxy_cache_bypass $http_upgrade;
            
            #暴露反向代理的地址
            #add_header backendIP $upstream_addr;
            #add_header backendCode $upstream_status;      
        #}
        
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

9.常见问题

Nginx 转发时Header中信息丢失

通过Nginx转发后, Header中access_token信息丢失,经查,发现Nginx在转发时,header中带下划线_的属性默认不转发,需要增加配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server {
        listen       80;
        server_name  127.0.0.1;
        
        #charset koi8-r;
        #access_log  logs/host.access.log  main;
        underscores_in_headers on;
}

反向代理,操作超时

反向代理某接口,接口处理业务时间超过60秒,就会报time out的错误.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 proxy_read_timeout 600;

10.参考链接

https://blog.csdn.net/qq_29663071/article/details/80759098

https://www.nginx.com/blog/websocket-nginx/

https://blog.csdn.net/duyiwuerluozhixiang/article/details/100358930

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-12-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 加菲的博客 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
python数据库-mongoDB的高级查询操作(55)
  假设有一本书,你想看第六章第六节讲的是什么,你会怎么做,一般人肯定去看目录,找到这一节对应的页数,然后翻到这一页。这就是目录索引,帮助读者快速找到想要的章节。在数据库中,我们也有索引,其目的当然和我们翻书一样,能帮助我们提高查询的效率。索引就像目录一样,减少了计算机工作量,对于表记录较多的数据库来说是非常实用的,可以大大的提高查询的速度。否则的话,如果没有索引,计算机会一条一条的扫描,每一次都要扫描所有的记录,浪费大量的cpu时间。
Se7eN_HOU
2019/07/19
1.9K0
python数据库-MongoDB的基本使用(54)
可以看到,我们刚创建的数据库 Hero并不在数据库的列表中, 要显示它,我们需要向Hero数据库插入一些数据。
Se7eN_HOU
2019/07/19
7720
python数据库-MySQL数据库的增删改查基本操作(49)
整数: tinyint、smallint、mediumint、int、bigint 浮点数: float、double、real、decimal 日期和时间: date、time、datetime、timestamp、year
Se7eN_HOU
2019/07/10
2.4K0
python数据库-MySQL数据库的增删改查基本操作(49)
【MySQL】数据库基础&&库/表的操作&&数据类型详解
为解决上述问题,专家们设计出更加利于管理数据的东西-数据库,能更加有效的管理数据,数据库的水平是衡量一个程序员水平的重要指标
用户10925563
2025/02/16
980
【MySQL】数据库基础&&库/表的操作&&数据类型详解
MySQL数据库基础(十):DQL数据查询语言
之前我们做的查询都是横向查询,它们都是根据条件一行一行的进行判断,而使用聚合函数查询是纵向查询,它是对一列的值进行计算,然后返回一个单一的值;另外聚合函数会忽略空值。
Lansonli
2024/03/19
1600
MySQL数据库基础(十):DQL数据查询语言
flask数据操纵
在Django框架中内部已经提供ORM这样的框架,来实现对象关系映射,方便我们操作数据库。如果想在Flask中也达到这样效果,需要安装一个第三方来支持。 SQLAlchemy是一个关系型数据库框架,它提供了高层的ORM和底层的原生数据库的操作。flask-sqlalchemy是一个简化了SQLAlchemy操作的flask扩展。
py3study
2020/01/15
1.4K0
MySQL数据库的基本使用
当前主要使用两种类型的数据库:关系型数据库、非关系型数据库,本部分主要讨论关系型数据库,对于非关系型数据库会在后面学习;
星哥玩云
2022/08/18
4.3K0
MySQL数据库的基本使用
python数据库-MySQL与python的交互(52)
2.创建testMySQL.py模块对我们创建的MySQLManager.py模块测试
Se7eN_HOU
2019/07/15
8640
python数据库-MySQL与python的交互(52)
MYSQL数据库-基本操作
MYSQL数据库-基本操作 零、前言 表的增删改查 一、Create 1、插入 2、更新和替换 二、Retrieve 1、SELECT 查询 2、WHERE 条件 3、结果排序 4、筛选分页结果 三、Update 四、Delete 1、删除数据 2、截断表 五、插入查询结果 六、聚合函数 七、group by 零、前言 本章主要讲解表的基本操作 表的增删改查 CRUD : Create(创建), Retrieve(读取),Update(更新),Delete(删除) 一、Create 创建语法:
用户9645905
2022/11/15
1K0
MYSQL数据库-基本操作
数据库 - MySQL1.MySQL内容简介2.安装管理(linux)window下安装Mysql3.数据的完整性4.脚本命令操作5.数据库查询
MySQL数据库,是当前应用非常广泛的一款关系型数据库 MySQL官网 数据库排名
Python攻城狮
2018/08/23
1.2K0
数据库 - MySQL1.MySQL内容简介2.安装管理(linux)window下安装Mysql3.数据的完整性4.脚本命令操作5.数据库查询
​Mysql数据库查询好慢,除了索引,还能因为什么?
mysql查询为什么会慢,关于这个问题,在实际开发经常会遇到,而面试中,也是个高频题。
小白debug
2022/06/20
5710
​Mysql数据库查询好慢,除了索引,还能因为什么?
MySQL数据库、数据表的基本操作及查询数据
存储引擎比较 |功能|MyISAM|Memory|InnoDB|Archive| |---|---|---|---|---| |存储限制|256TB|RAM|64TB|None| |支持事务|No|No|Yes|No| |支持全文索引|Yes|No|No|No| |支持数索引|Yes|Yes|Yes|No| |支持哈希索引|No|Yes|No|No| |支持数据缓存|No|N/A|Yes|No| |支持外键|No|No|Yes|No|
星哥玩云
2022/08/17
3.2K0
Python数据库操作 初识mysql和mysql基本操作#学习猿地
Welcome to the MySQL monitor.  Commands end with ; or \g.
学习猿地
2020/03/20
3760
Python 高级笔记第二部分:数据库的概述和MySQL数据表操作
SQL结构化查询语言(Structured Query Language),一种特殊目的的编程语言,是一种数据库查询和程序设计语言,用于存取数据以及查询、更新和管理关系数据库系统。
杨丝儿
2022/02/24
1.8K0
Python 高级笔记第二部分:数据库的概述和MySQL数据表操作
python数据库-MySQL数据库高级查询操作(51)
  这里面学科包含了三个学科,所以学科拆分为:语文学科、数学学科、英语学科,同样的成绩也要拆分为语文成绩、数学成绩、英语成绩。这样既满足了第一范式,各列可以设计为:
Se7eN_HOU
2019/07/15
3K0
python数据库-MySQL数据库高级查询操作(51)
数据库
简单的说,数据库(因为Database)就是一个存放数据的仓库,这个仓库是按照一定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织、存储的,我们可以通过数据库提供的多种方式来管理数据库里的数据。 更简单形象的理解,数据库和我们生活中存放杂物的储物间仓库性质一样,区别只是存放的东西不同,杂物间存放实体的物件,而数据库里存放的是数据。
爱喝水的木子
2022/01/12
2.2K0
MySQL 之 数据库操作 及 表操作
在MySQL中, 我们的数据库通常是存放在数据库服务器中的, 而数据库中又有数据表,数据表中悠悠数据行,最后数据行中有数据列, 整理后我们可以得到如下结构:
AUGENSTERN_
2024/04/09
990
MySQL 之 数据库操作 及 表操作
登录和退出 MySQL 服务器建表约束数据库的三大设计范式查询练习事务推荐
最近在整理 sql 的时候发现一份优秀的笔记,是原作者学习 sql 所做的笔记,分享这份总结给大家,对大家对 sql 的可以来一次全方位的检漏和排查,感谢原作者 hjzCy 的付出,原文链接放在文章最下方,如果出现错误,希望大家共同指出!
wscats
2020/06/07
5.7K0
MySQL数据库入门
后台 (连接点:连接数据库JDBC,链接前端(控制,控制视图跳转,和给前端传递数据))
落寞的鱼丶
2022/02/21
5960
MySQL数据库5事务、视图、触发器、函数、数据库的备份
事务指一组操作要么成功要么失败,在成功修改数据前原来的数据不会受影响,如果修改成功则数据将被更改,如果失败,则原数据库数据不变。
GH
2019/12/12
9830
推荐阅读
相关推荐
python数据库-mongoDB的高级查询操作(55)
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档