nginx实战,nginx高可用, nginx负载配置, nginx正向,反向代理,nginx各种配置, 及其配置问题

news2025/1/10 20:39:09

nginx配置实战, nginx负载, nginx正向,反向代理,nginx路由配置

  • nginx
    • nginx基础
    • nginx 配置
    • nginx正向代理
    • nginx 反向代理
    • nginx 负载
    • nginx高可用
  • nginx 配置常见问题
    • 反向代理报426错误
    • post请求变get请求
    • nginx 配置前端代理, 会出现js, css找不到

nginx

简介:Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好。

场景: 因此我们有这样的一个业务场景, 我们系统会收录公司所有的api接口, 每个api都会有自己的preview 页面,有的api提供者会提供preview的共能, 有的需要重新开发ui,那当我们系统访问不同的preview时, 都会存在问题, 例如跨域, 前端, 后端等会有, 对于api提供者非常不友好, 那我就想使用nginx做代理服务, 统计管理请求。

业务设计如下:
在这里插入图片描述

  1. nginx集中部署preview 前端代码,或者正向代理到preview
  2. nginx集中反向代理preview对应的apiserver
    基于以上业务场景, 接着全面熟悉nginx知识。
    如果英文够好, 可以详细了解: nginx官方文档

nginx基础

nginx 配置

1.首先来看看nginx配置的结构

# 全局配置
...              

# events 配置
events {
   ...
}
# http配置
http
{
	# http 全局配置
    ...
    # server 配置
    server
    { 
    	#server 全局配置
        ...       
        #location配置
        location /xxx   
        {
            ...
        }
    }
}

# 全局配置: 配置影响全局, 包括运行nginx的用户组, 进程存放, 日志, 配置文件等
# events: 配置影响nginx 的服务器与客户端的网络连接, 包括进程最大连接数, 数据驱动模型, 序列化等
# http: 配置代理, 缓存, 日志, 第三方模块等, 可嵌套多个server
# server : 配置虚拟主机的参数, 可以配置多个location
# location: 配置请求路由, 页面处理
  1. 全局配置
# 全局配置
# nginx的用户组, 默认noboby
# user noboby noboby;

# 开启进程的线程数, 根据机器的cpu核数确定
# worker_processes 1;
# 定义错误日志位置  参数log level (notice, debug, info, warn, error, crit)debug输出最多, crit最少
# error_log logs/error.log  debug;
#指定进程id的存储位置
#pid logs/nginx.pid

#指定一个nginx进程打开的最多文件描述符数目,受系统进程的最大打开文件数量限制
#worker_rlimit_nofile 65535
 
#envents 配置
events {
    #设置工作模式为epoll,除此之外还有select,poll,kqueue,rtsig和/dev/poll模式
    use epoll;
    #定义每个进程的最大连接数,受系统进程的最大打开文件数量限制
    worker_connections  1024;
}

#http 配置
http {
    #主模块指令,实现对配置文件所包含的文件的设定,可以减少主配置文件的复杂度
    include       mime.types;
    
    #核心模块指令,默认设置为二进制流,也就是当文件类型未定义时使用这种方式
    default_type  application/octet-stream;
    
    #下面代码为日志格式的设定,main为日志格式的名称,可自行设置,后面引用
	log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
	                  '$status $body_bytes_sent "$http_referer" '
	                  '"$http_user_agent" "$http_x_forwarded_for"';
	#引用日志main格式
	access_log  logs/access.log  main;

    #设置允许客户端请求的最大的单个文件字节数
    client_max_body_size 20M;
    #指定来自客户端请求头的headebuffer大小
    client_header_buffer_size  32k;
    #指定连接请求试图写入缓存文件的目录路径
    client_body_temp_path /dev/shm/client_body_temp;
    #指定客户端请求中较大的消息头的缓存最大数量和大小,目前设置为4个32KB
    large client_header_buffers 4 32k;

    #开启高效文件传输模式
    sendfile        on;
    #开启防止网络阻塞
    tcp_nopush     on;
    #开启防止网络阻塞
    tcp_nodelay    on;

    #设置客户端连接保存活动的超时时间
    #keepalive_timeout  0; # 无限时间
    keepalive_timeout  65;

    #设置客户端请求读取header超时时间
    client_header_timeout 10;
    #设置客户端请求body读取超时时间
    client_body_timeout 10;

    #HttpGZip模块配置
    #开启gzip压缩
    gzip  on;
    #设置允许压缩的页面最小字节数
    gzip_min_length 1k;
    #申请4个单位为16K的内存作为压缩结果流缓存
    gzip_buffers 4 16k;
    #设置识别http协议的版本,默认为1.1
    gzip_http_version 1.1;
    #指定gzip压缩比,1-9数字越小,压缩比越小,速度越快
    gzip_comp_level 2;
    #指定压缩的类型
    gzip_types text/plain application/x-javascript text/css application/xml;
    #让前端的缓存服务器进过gzip压缩的页面
    gzip_vary on;    
}

# server 配置:
server {
    #单连接请求上限次数
    keepalive_requests 120; 
    #监听端口
    listen       88;
    #监听地址,可以是ip,最好是域名
    server_name  111.222.333.123;
    #server_name  www.123.com;
    #设置访问的语言编码
    charset utf-8;
    #设置虚拟主机访问日志的存放路径及日志的格式为main
    access_log  /info/respones.log main; #响应日志
    error_log  /error/erro.log main; #错误日志
  	# includes
    include xxx.conf;
    #REWRITE URL重写规则引用
    include /nginx/conf/xxx.conf;
    #REWRITE-END
    
    #设置主机基本信息
    #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
    location  ~*^.+$ {
    	#根目录
        root html;  
        #设置默认页
        index  index.html index.htm;
        #拒绝的ip,黑名单
        deny 127.0.0.1;  
        #允许的ip,白名单
        allow 172.111.111.111; 
    } 
    
    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
	#图片资源配置
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log off;
    }
    
    #网站js与css资源配置
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log off; 
    }
    
    #访问异常页面配置
    error_page  404              /404.html;
    error_page  500 502 503 504  /50x.html;
    location = /50x.html {
		root   html;
	}
}
  1. location + proxy_pass
server {
        listen       8081;
        server_name  localhost;

        location / {
            root   html;
            index  index.html index.htm;
        }
		#情景1:proxy_pass后有/ ,表绝对路径,不把匹配部分加入最终代理路径(location 和proxy_pass结尾一致)
        #访问地址:http://localhost:8081/wcp/a2/download/asc.shtml
        #最终代理:http://127.0.0.1:8082/a2/download/asc.shtml
        location /wcp/a2/download/ {
            proxy_pass   http://10.194.171.7:13082/a2/download/;
        }
        #访问地址:http://localhost:8081/model/asc.shtml
        #最终代理:http://127.0.0.1:8082/model/asc.shtml
        location /model/ {
            proxy_pass   http://127.0.0.1:8082/model/;
        }
		#情景2:proxy_pass后有/ ,表绝对路径,不把匹配部分加入最终代理路径(location 和proxy_pass结尾不一致)
        #访问地址:http://localhost:8081/model/asc.shtml
        #最终代理:http://127.0.0.1:8082/asc.shtml
        location /model/ {
            proxy_pass   http://127.0.0.1:8082/;
        }
		#情景3:proxy_pass后没有 / ,Nginx会把匹配部分带到代理的url
        #访问地址:http://localhost:8081/model/asc.shtml
        #最终代理:http://127.0.0.1:8082/model/asc.shtml
        location /model/ {
            proxy_pass   http://127.0.0.1:8082;
        }

		#情景4
        #访问地址:http://localhost:8081/model/asc.shtml
        #最终代理:http://127.0.0.1:8082/aaamodel/asc.shtml
        location /model/ {
            proxy_pass   http://127.0.0.1:8082/aaa;
        }
		#情景5
        #访问地址:http://localhost:8081/model/asc.shtml
        #最终代理:http://127.0.0.1:8082/asc.shtml
        location /model {
            proxy_pass   http://127.0.0.1:8082/;
        }
		#情景6
        #访问地址:http://localhost:8081/modelXxxxx/asc.shtml
        #最终代理:http://127.0.0.1:8082/asc.shtml
        location /model {
            proxy_pass   http://127.0.0.1:8082/;
        }

        location /opus-front-sso {
            proxy_pass   http://10.194.170.94/opus-front-sso;
        }
        location /awater {
            proxy_pass   http://10.194.170.94/awater;
        }
    }

  1. rewrite
server {
        listen        6677;
        server_name   10.212.38.39;

		# 情景1:  http://127.0.0.1:6677/aa  -> http://127.0.0.1:6688
        location /aa{
                proxy_http_version 1.1;
                ##rewrite ^/js/(.*)$ /$1/$2 break;
                rewrite ^/aa  http://127.0.0.1:6688/ break;
        }

		# 情景2:   http://127.0.0.1:6677/cc  -> https://xxx.xxxxx.com/
        location /cc {
                proxy_http_version 1.1;
                ##rewrite ^/js/(.*)$ /$1/$2 break;
                rewrite ^/cc  https://xxx.xxxxx.com/ break;
        }

		#情景3: http://127.0.0.1:6677/dd/docs    ->  https://xxx.xxxxx.com/docs   参数:   (.*) = $1=docs
        location /dd {
                rewrite ^/dd/(.*)$ https://xxx.xxxxx.com/$1 break;
        }
}


  1. try_files
# try_files 解释: 
# 首先:按照指定的顺序检查文件是否存在,并使用第一个找到的文件进行请求处理
# 其次:处理是在当前上下文中执行的。根据 root 和 alias 指令从 file 参数构造文件路径。
# 然后:可以通过在名称末尾指定一个斜杠来检查目录的存在,例如“ $uri/”。
# 最后:如果没有找到任何文件,则进行内部重定向到最后一个参数中指定的 uri。

server {
        listen        6688;
        server_name   127.0.0.1;

        location /{

                root /home/bieber/backstage/dist1/;
                index index.html;
                try_files $uri  $uri/  /index.html;
        }
}

# 配置解释:
# root:设置静态根目录为 /home/bieber/backstage/dist1/
# index:设置目录的默认文件为 index.html 、index.htm
# try_files:设置文件查找规则为 $uri $uri/ /index.html。即3个规则,先从 $uri 查找,再从 $uri/ 目录中查找,最后查找 /index.html

# 注意: try_files 必须有一个存在, 不然一直死循环找, 最终抛出500
  1. includes

includes 可以使用在多个位置, 在http里面,与server并列, 在server 里面,与location 并列

// 情景1: http includes: conf1
http {
.....
 include /usr/local/nginx/conf/*default.conf;
}

// default.conf
server {
        listen        5566;
        server_name   127.0.0.1;



        location / {
              proxy_http_version 1.1;
              proxy_pass https://xx.xxx.com/ssds/ssss;
              proxy_redirect off;
        }

}


//情景2:  http server: conf2

server {
        listen        6677;
        server_name   127.0.0.1;

		 include /usr/local/nginx/conf/*conf3.conf;
		 include /usr/local/nginx/conf/*conf4.conf;
}

// conf3
location /aa{

                proxy_http_version 1.1;
                ##rewrite ^/js/(.*)$ /$1/$2 break;
                rewrite ^/aa  http://127.0.0.1:6688/ break;
        }
// conf4

 location /dd {
             rewrite ^/dd/(.*)$ https://xxx.xxxx.com/$1 break;
 }

nginx正向代理

何为正向代理?
正向代理就是前端对前端, 即客户端对客户端, 比如我们的backstage前端页面要访问preview的前端, 直接访问受防火墙, 跨域等限制, 通过nginx正向代理解决了这个问题

在这里插入图片描述

# nginx 配置 比如公司只能用内网, 但是10.110.111.1上可以访问外网
server {
	listen    4433;
	server_name  10.110.111.1;
	location  / {
		proxy_pass  http://www.baidu.com
	}
}
# 重启nginx(nginx -s reload)
# 访问http://10.110.111.1:4433/  就能访问到百度

nginx 反向代理

在这里插入图片描述

location /opus-front-sso {
           proxy_pass   http://10.194.170.94/opus-front-sso;
}

nginx 负载

  1. nginx 负载均衡配置, 默认负载(轮询)
http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }

    server {
        listen 80;

        location / {
            proxy_pass http://myapp1;
        }
    }
}
  1. 最少连接的负载
upstream myapp1 {
        least_conn;
        server srv1.example.com  down;   // down 永久下线
        server srv2.example.com;
        server srv3.example.com;
    }

server {
	        listen 80;
	
	        location / {
	            proxy_pass http://myapp1;
	        }
	    }
  1. ip哈希负载
upstream myapp1 {
    ip_hash;
    server srv1.example.com;
    server srv2.example.com;
    server srv3.example.com;
}

server {
	        listen 80;
	
	        location / {
	            proxy_pass http://myapp1;
	        }
	    }
  1. 加权重负载平衡

# 每 5 个新请求将分布在 应用程序实例如下:将定向 3 个请求 对于 SRV1,一个请求将转到 SRV2,另一个请求将转到 SRV3
upstream myapp1 {
        server srv1.example.com weight=3;
        server srv2.example.com;
        server srv3.example.com;
    }

server {
	        listen 80;
	
	        location / {
	            proxy_pass http://myapp1;
	        }
	    }


nginx高可用

nginx的使用场景非常多了, 那nginx做到高可用就非常的重要, 下来我们借助第三方插件Keepalived 完成nginx的负载, 如下图:

在这里插入图片描述

  1. 首先可以用一个域名代理这个虚拟ip
  2. 这个虚拟ip负载到两台机器上
  3. 每台机器装Keepalived:
yum install keepalived -y   #安装
rpm -q -a keepalived   # 查看安装情况


# 修改两台配置
cd /etc/keepalived vi keepalived.conf
global_defs {

    notification_email {

        acassen@firewall.loc

        failover@firewall.loc

        sysadmin@firewall.loc

    }

    notification_email_from Alexandre.Cassen@firewall.loc

    smtp_server 127.0.0.1

    smtp_connect_timeout 30

    router_id LVS_DEVEL #唯一

}

vrrp_script chk_http_port {
    script "/usr/local/src/nginx_check.sh"
    interval 2  #(检测脚本执行的间隔)2 s执行一次
    weight 2   # 脚本成立 权重增加2。
}

vrrp_instance VI_1 {

    state BACKUP    # 备份服务器上将 MASTER(主) 改为 BACKUP 

    interface ens33 # 网卡

	virtual_router_id 51    # 主、备机的 virtual_router_id 必须相同

    priority 100    # 主、备机取不同的优先级,主机值较大,备份机值较小

    advert_int 1 # 进行心跳检测 每隔一秒 发送检测信息 查看是否存活

    authentication {

        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {

        10.110.111.01 # 虚拟地址
    }
}


# 注意: Keepalived 必须在nginx的实力存活的情况下启动
systemctl start keepalived
# 结果: 访问10.110.111.01 然后两个keepalived会抢占这个虚拟ip,同时将服务请求发送到不同对应的nginx服务器上,这样就保证了在一个服务器出现故障时候,另外一个还能够正常的工作。

nginx 配置常见问题

反向代理报426错误

在这里插入图片描述

server {
       listen        5566;
       server_name   127.0.0.1;

       location / {
             proxy_pass https://xx.xxx.com/ssds/ssss;
       }
}

// 修改如下:
server {
       listen        5566;
       server_name   127.0.0.1;

       location / {
       		proxy_http_version 1.1;
           	proxy_pass https://xx.xxx.com/ssds/ssss;
       }
}

post请求变get请求

问题: 使用nginx转发请求,但是明明是post请求,打到服务上确实get请求,body中的参数都没了
原因: post转get其实不是Nginx导致的!而是重定向导致, 可以关闭重定向。

server {
        listen        5566;
        server_name   10.212.38.39;



        location / {
              proxy_http_version 1.1;
              proxy_pass https://xx.xxx.com/ssds/ssss;
              proxy_redirect off;
        }

}

nginx 配置前端代理, 会出现js, css找不到

可以使用rewrite 重定向, 或者处理js, css的再次代理

location /aa{
                proxy_http_version 1.1;
                ##rewrite ^/js/(.*)$ /$1/$2 break;
                rewrite ^/aa  http://10.212.38.39:6688/ break;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/430695.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

自学Java靠谱吗?自学Java能找到工作吗?建议收藏反复查看!

网上是不是很多人劝你学Java不要报班,浪费金钱,自己在家学习Java就可以了。那小源问你,自学Java它的成功率到底有多少?前两天看到一位老师发的视频,说自学的成功率大概在5%左右,小源觉得这个数据还是比较客…

IO线程模型

文章目录IO线程模型一、BIO1、概念2、Demo2.1、Demo1.02.2、Demo2.02.3、小结二、NIO1、概念2、Demo2.1、Demo1.02.2、Demo2.0IO线程模型 一、BIO 1、概念 BIO 全称 Block-IO 是一种**同步且阻塞**的通信模式。是一个比较传统的通信方式,模式简单,使用…

万字长文的BI百科全解

目前来看,现今世界未来的发展方向基本已经确定,数字化的趋势已经化身为一股不可阻挡的浪潮,各国也都宣布了数字化、数据、数字经济、数字化转型等方面的相关发展政策法规,明确未来的战略方针。同时世界传统经济增长也开始乏力&…

6 计时器(一)

计时器 6.1 TIM TIM简介 TIM(Timer)定时器 定时器可以对输入的时钟进行计数,并在计数值达到设定值时触发中断 16位计数器、预分频器、自动重装寄存器的时基单元,在72MHz计数时钟下可以实现最大59.65s的定时 不仅具备基本的定时中…

2023 年 3 月 NFT 月度报告

作者:Danielfootprint.network 数据来源:NFT Monthly Report 三月份的 NFT 市场上出现了两个有趣的趋势。一方面,Polygon 链尽管在二月份有所突破,达到了 NFT 总交易量的 4.2%,但于三月再次跌至 1% 以下,…

55 openEuler搭建Mariadb数据库服务器-配置环境

文章目录 55 openEuler搭建Mariadb数据库服务器-配置环境55.1 关闭防火墙并取消开机自启动55.2 修改SELINUX为disabled55.3 创建组和用户55.4 创建数据盘55.4.1 方法一:在root权限下使用fdisk进行磁盘管理55.4.2 方法二:在root权限下使用LVM进行磁盘管理…

【C语言】基础语法1:变量和数据类型

❤️‍🔥前情提要❤️‍🔥   欢迎来到C语言基本语法教程   在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断…

MySQL调优笔记——慢SQL优化记录(2)

今天调优的原因是,有一个统计报表业务,查询的时间太慢;同时由于数据库的压力是随机性的,这个业务的执行下限和上限相差近20倍;快的时候可以达到600ms,慢的时候有9秒之多; 接下来详细介绍&#x…

STL--string

一、string介绍 string是表示字符序列的对象。 标准字符串类通过类似于标准字节容器的接口为此类对象提供支持,但添加了专门设计用于处理单字节字符字符串的功能。 字符串类是 basic_string 类模板的实例化,该模板使用char作为其字符类型,以…

【云原生进阶之容器】第五章容器运行时5.7--容器逃逸原理

《云原生进阶之容器》专题索引: 第一章Docker核心技术1.1节——Docker综述第一章Docker核心技术1.2节——Linux容器LXC第一章Docker核心技术1.3节——命名空间Namespace第一章Docker核心技术1.4节——chroot技术第一章Docker核心技术1.5.1节——cgroup综述

为什么要对员工行为进行安全管控?

ChatGPT的火热已不是一件新鲜事了。而现在更让大家热议的是,ChatGPT带来的网络安全风险,不少安全人员对此担心不已。因ChatGPT引起的网络安全事件,媒体也多有报道。 例如,近日,外媒就报道了三星因ChatGPT泄露了机密信息…

ChatGPT - 基于 Visual Studio Code 进行 AI 编码

2023-04-15 周六 杭州 晴 前情提要 ChatGPT ,AutoGPT , AgentGPT 现在各种人工智能编码工具层出不穷,通过人工智能编码再也不用记大量的技术知识点了,现在所谓开发人员的经验性的东西也好像弱化了很多,我们可以更有效率的做自己…

Qt/QML编程学习之心得:QML界面设计(二)

都知道Qt是一种界面设计语言,那么它有几种设计方式UI technologies呢?答案是5种。 1、传统桌面所见即所得Classic desktop look-and-feel• Qt Widgets 2、 流畅、现代+触控Fluent, modern touch-based UX• Qt Quick 3、 三维3D becomes more and more important• Qt Open…

安全运营之资产安全信息管理

安全风险管理的三要素分别是资产、威胁和脆弱性,脆弱性的存在将会导致风险,而威胁主体利用脆弱性产生风险。网络攻击主要利用了系统的脆弱性。由于网络管理对象(资产)自身的脆弱性,使得威胁的发生成为可能,…

Linux 函数调用过程解析

一、Linux 函数调用过程解析 在x86的计算机系统中,内存空间中的栈主要用于保存函数的参数,返回值,返回地址,本地变量等。一切的函数调用都要将不同的数据、地址压入或者弹出栈。因此,为了更好地理解函数的调用&#xf…

QT 常见面试题

1、在Qt当中,多线程环境下,信号槽分别是在什么样的线程中执行?如何控制? 参考答案: 通过connect(...)第5个参数控制信号槽执行所在线程 connect(...)它的连接方式:队列连接、自动连接和直接连接 队列连…

EMC-MLCC电容反谐振点引起的RE辐射超标

MLCC电容反谐振点引起的RE辐射超标 对待RE辐射问题,可以按照干扰源,干扰路径,被干扰源,入手较多的是干扰源和干扰路径, 解决干扰源可以从展频,调频,屏蔽干扰源,增加RC snabber吸收…

ChatGPT颠覆者来了,能替代90%的人的工作?

前言 Auto GPT是一个实验性开源应用程序,展示了GPT-4语言模型的功能。该程序由GPT-4驱动,将LLM“思想”链接在一起,以自主实现您设定的任何目标。作为GPT-4完全自主运行的首批例子之一,Auto GPT突破了人工智能的极限。 特征 &a…

明面抵制,暗中布局 对于AI,马斯克的言行为何如此“割裂”?

最近,马斯克创建了一家叫做“X”的空壳公司,目标是将其打造成涵盖各方面的多功能应用集合平台,推特、SpaceX、特斯拉、Neuralink等公司业务都已打包加入其中。如今,“X”公司再添新丁——X.AI,即马斯克新成立的人工智能…

【硬件外设使用】——PWM

【硬件外设使用】——PWMPWM基本概念PWM使用方法pyb.pwm方法属性machine.pwm方法属性PWM可用的传感器PWM基本概念 PWM是脉冲宽度调制(Pulse Width Modulation)的缩写,是一种用数字信号控制模拟电路输出的技术。PWM通常被用来控制电压或电流的…