Nginx转发出现502的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx转发出现502的问题相关的知识,希望对你有一定的参考价值。

参考技术A nginx转发内网时候会出现502的问题,解决方法如下:
执行如下命令打开:
/usr/sbin/setsebool httpd_can_network_connect true

写入配置文件
setsebool -P httpd_can_network_connect=1

问题解决

mycat主从复制读写分离nginx负载均衡请求转发

1.主从复制

1.现有单体架构存在的问题
随着互联网发展和兴起,当大量请求涌入的时候,单节点的应用服务器(tomcat)和单节点的数据库服务器(mysql),会因为处理速度过慢,或者出现极端情况导致宕机.

单节点故障
     当一台服务器宕机,导致整个应用的瘫痪
单节点压力

2.解决 :单节点故障,解决高并发的问题

3.集群(cluster):及众多的服务器去完成一项工作
     节点(node):指一台服务器

4.单节点的数据库服务器需要解决的问题
  第一个问题  负载均衡  
  第二个问题  数据同步

在这里插入图片描述

1.搭建主从复制

1.配置网卡
  只需要修改静态网卡

2.crt连接

3.关闭网络防火墙

4.安装mysql并开启mysql远程访问权限

5.搭建主从复制
  a.配置mysql配置文件 /etc/my.cnf
   server-id=1       唯一标识
   log-bin=mysql-bin 日志文件的名字
   log-slave-updates 从机随着日志文件的变化而变化
   slave-skip-errors=all 从机跳过错误的sql语句
   
  b.测试配置文件是否配置成功
     重新启动mysql服务
     systemctl restart mysqld
     登录到mysql客户端
     mysql -uroot -proot
     检测配置是否生效
     SHOW VARIABLES like 'server_id';
 6.配置主从复制
 .关于该问题的解决方案其实很简单,停掉备库实例,删除备库的auto.cnf文件,启动备库实例,此时备库就会产生一个新的auto.cnf文件(产生新的UUID)。重启mysql
                        find / -name "auto.cnf"
                        rm -rf /var/lib/mysql/auto.cnf
          a.查看主机状态
           show  master status;
           b.在所用的从机中加入如下配置
               change master to 
                    master_host='192.168.65.101',
                    master_user='root',
                    master_password='root',
                    master_log_file='mysql-bin.000001',
                    master_log_pos=120;
          c.开启从机同步
               start slave;
          d.查看从机的同步状态      
           show slave status;   
           如果需要停掉从机使用 stop slave;
          

如果从机两个选项都是yes 说明同步成功

在这里插入图片描述

2.搭建读写分离

在这里插入图片描述

3. mycat 的下载与安装

1. 从官网下载mycat
wget <http://dl.mycat.io/>1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
2. 解压Mycat压缩包
3. 移动到usr目录中
4. 配置mycat环境变量(推荐配置/etc/profile)
5. 配置mycat中conf下的配置schema.xml
 <!-- 定义MyCat的逻辑库  -->       
 <schema name="给mycat起的逻辑名称" checkSQLschema="false" sqlMaxLimit="100" dataNode="testNode"></schema>   
 <!-- 定义MyCat的数据节点 -->    
 <dataNode name="testNode" dataHost="dtHost" database="真是数据库的名称" />  
 <dataHost name="dtHost" maxCon="1000" minCon="10" balance="1"                writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">                <heartbeat>select user()</heartbeat>                
              <!-- can have multi write hosts -->               
 <writeHost host="hostM1" url="192.168.28.128:3306" user="root"                        password="root">                        
 <!-- can have multi read hosts -->               
 <readHost host="hostS1" url="192.168.28.129:3306" user="root" password="root" />                </writeHost>   
 </dataHost>
6. 配置登陆mycat的权限server.xml     
<system>               
    <!-- 这里配置的都是一些系统属性,可以自己查看mycat文-->               
    <property name="defaultSqlParser">druidparser</property>     
    <!-- mycat6要将utf8mb4改为utf8-->               
    <property name="charset">utf8mb4</property>      
</system>          
<user name="root">                
    <property name="password">root</property>               
    <property name="schemas">mycat对应的逻辑名</property>      
</user>
7. 启动mycat
 mycat start
8. 测试mycat 
jdbc:mysql://192.168.216.6:8066/mycat

mycat是schema.xml的逻辑名

8066是mycat的端口号

192.168.216.6是mycat所在的虚拟机
 <!-- 定义MyCat的逻辑库  -->    
    <schema name="给mycat起的逻辑名称" checkSQLschema="false" sqlMaxLimit="100" dataNode="testNode"></schema> 
     <!-- 定义MyCat的数据节点 -->    <dataNode name="testNode" dataHost="dtHost" database="真是数据库的名称" />   
     <dataHost name="dtHost" maxCon="1000" minCon="10" balance="1"   writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">       
              <heartbeat>select user()</heartbeat>                
              <!-- can have multi write hosts -->            
               <writeHost host="hostM1" url="192.168.28.128:3306" user="root"                        password="root">                                         <!-- can have multi read hosts -->           
             <readHost host="hostS1" url="192.168.28.129:3306" user="root" password="root" />                </writeHost>  
     </dataHost>

2.搭建应用服务器集群

在这里插入图片描述

1. 准备应用服务器  3台tomcat
  a.三台tomcat 在同一个服务器上,保证端口不一致
  b.创建3个虚拟机,并且安装tomcat
2. 配置网卡
 
3. 关闭防火墙

4. 安装tomcat

5. 网页访问

6. 安装nginx
  a. 下载nginx安装包
  
  b. 上传到linux系统中
  
  c. 解压tar
  
  d. 使用./configure检查环境的完整性
  
  e. 安装gcc
    报错cc is not found 
    yum install -y gcc
    报错 error: the HTTP rewrite module requires the PCRE library.
    yum install -y  pcre-devel
    error: the HTTP gzip module requires the zlib library.
    yum install -y zlib-devel
  f .编译并安装nginx
   make  编译
   make install 安装
  
   make && make install  编译并安装   
   默认安装目录为  /usr/local/nginx
   
   g. 进入nginx的安装目录
     conf    配置文件目录
     html    静态页面目录
     logs    日志文件目录
     sbin    可执行文件目录   
      ./nginx
      启动nginx服务

      ./nginx -s stop
      关闭nginx
  
   h.访问nginx的web页面
 	 http://192.168.65.10:80
 	 
   i.配置nginx管理tomcat服务器
     vim /usr/local/nginx/conf/nginx.conf
        1.配置tomcat的ip和端口的列表
         
        upstream tomcat-servers {
		server 192.168.174.101:8989;  
		server 192.168.174.102:8989; 
		server 192.168.174.103:8989;  
        }
        注意:不要放置在server标签的内部
        2.配置nginx代理tomcat-servers
        location / {
			 proxy_pass http://tomcat-servers;
			 proxy_redirect    off;
			 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
			 proxy_set_header X-Real-IP $remote_addr;
			 proxy_set_header Host $http_host;
			 proxy_next_upstream http_502 http_504 error timeout invalid_header;
		   }
        
           scp  index.jsp root@192.168.65.9:/usr/tom3/webapps/ROOT 远程拷贝
nginx的负载均衡策略
轮询:
   每个请求会按时间顺序逐一分配到不同的后端服务器。(默认)
weight(权重):
  权重方式,在轮询策略的基础上指定轮询的几率。
  配置方式
   weight=2;
ip_hash(解决session共享的问题)
 会根据当前服务器的ip取hash值然后取模运算
 ip_hash;
 
least_conn
  把请求转发给连接数较少的后端服务器。
least_conn;    

以上是关于Nginx转发出现502的问题的主要内容,如果未能解决你的问题,请参考以下文章

nginx 502

nginx请求转发配置

Nginx 502 坏网关节点 JS

一次悲催的nginx转发白屏经历

nginx配置记录

Nginx优化解决问题