Nginx测试实验

Stella981
• 阅读 865

Nginx版本如何查看(windows系统下)

Nginx测试实验

使用命令 nginx -v

Nginx测试实验

试验准备--试验环境为单位局域网****

0.准备两个服务实例(借助icbm服务****

一个在自己机器上(192.168.1.120),一个在测试服务器(192.168.8.110)上。服务端口均为1008。

1.服务简述

调用rest服务时向一张表nginx_test中写入数据。

访问url:

/nginxTest/insert(接口添加到不用做验证的接口列表)

192.168.1.120服务上实例向数据库表写入字段666

192.168.8.110服务上实例向数据库写入字段8.110

2.nginx配置文件的配置

Nginx测试实验

试验代码以及文件

Nginx配置文件nginx.conf

#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/x-www-form-urlencoded;



    #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;

error_log  logs/access.log info;

    sendfile        on;

    #tcp_nopush     on;


    #keepalive_timeout  0;

    keepalive_timeout  65;


    #gzip  on;


    upstream tomcats {

        server 192.168.1.120:1008 weight=1;

        server 192.168.8.110:1008 weight=2;

    }


    server {

        listen 80;

        location / {

            proxy_pass http://tomcats;

        }

    }

}

数据库表结构

SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------

-- Table structure for nginx_test

-- ----------------------------

DROP TABLE IF EXISTS `nginx_test`;

CREATE TABLE `nginx_test` (

  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,

  `ip` varchar(20) DEFAULT NULL,

  PRIMARY KEY (`id`)

) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8;

Controller

package com.richfit.ruiche.nginxTest.controller;


import javax.servlet.http.HttpServletRequest;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.web.bind.annotation.RequestMapping;

import org.springframework.web.bind.annotation.RestController;


import com.richfit.ruiche.nginxTest.service.NginxTestService;


@RestController

@RequestMapping(value = "/nginxTest")

public class NginxTestController {


private static final String ip = "666";


// private static final String ip = "8.110";


@Autowired

private NginxTestService nginxTestService;


@RequestMapping(value = "/insert")

public void insert(HttpServletRequest request) throws NoSuchMethodException, SecurityException{

nginxTestService.insert(ip);

}

}

Service

package com.richfit.ruiche.nginxTest.service;


import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;


import com.richfit.ruiche.nginxTest.mapper.NginxTestMapper;


@Service

public class NginxTestService {


@Autowired

private NginxTestMapper nginxTestMapper;


public void insert(String ip){

nginxTestMapper.insert(ip);

}

}

Mapper

package com.richfit.ruiche.nginxTest.mapper;


import org.apache.ibatis.annotations.Mapper;

import org.apache.ibatis.annotations.Param;


@Mapper

public interface NginxTestMapper {


void insert(@Param(value="ip")String ip);

}

nginxTestMapper_sql.xml

<?xml version = "1.0" encoding = "UTF-8"?>

<!DOCTYPE mapper PUBLIC

        "-//mybatis.org//DTD com.example.Mapper 3.0//EN"

        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace = "com.richfit.ruiche.nginxTest.mapper.NginxTestMapper">


<insert id="insert" parameterType="string">

<![CDATA[

INSERT INTO nginx_test

     (

ip

     )

VALUES

(

#{ip}

)

]]>

</insert>

</mapper>

Nginx文件及位置

配置文件为nginx.conf,位置如下

Nginx测试实验

部署测试

访问地址

直接访问nginx服务器的地址(因为nginx配置的是80端口,所以这里没写):

http://localhost/nginxTest/insert

测试1:均衡测试

配置文件的关键部分写成如下这样:

upstream tomcats {

        server 192.168.1.120:1008;

        server 192.168.8.110:1008;

    }

    server {

        listen 80;

        location / {

            proxy_pass http://tomcats;

        }

}

那么默认就是按轮询的方式进行的,先服务器1,再服务器2,再服务器1,依次轮询。。。

测试2:关闭一个服务器

关闭192.168.1.120服务器(即本机),那么发现服务都转发到了192.168.8.110了。可见nginx很强大。

测试3:添加权重

    upstream tomcats {

        server 192.168.1.120:1008 weight=1;

        server 192.168.8.110:1008 weight=2;

    }

    server {

        listen 80;

        location / {

            proxy_pass http://tomcats;

        }

    }

如上weight就是权重。如上配置的话,就会访问1次192.168.1.120,然后访问2次192.168.8.110,然后访问1次192.168.1.120,然后访问2次192.168.8.110。。。

★★思考--nginx其实相当于做了代理

实际中访问的是server,

Nginx测试实验

但是server只是个代理,将请求转发给了服务器组。具体的访问策略,则根据nginx的规则自己选择。

Nginx测试实验

★Nginx配置文件分析

Nginx负载均衡有4种方案配置(或者说nginx 的 upstream目前支持 4 种方式的分配 )

1、轮询

轮询即Round Robin,根据Nginx配置文件中的顺序,依次把客户端的Web请求分发到不同的后端服务器上。如果后端服务器down掉,能自动剔除。

2、最少连接 least_conn;

Web请求会被转发到连接数最少的服务器上。

3、IP地址哈希 ip_hash;

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

4、基于权重 weight

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。

主要配置参数的实例

upstream tomcats {

        server 192.168.1.120:1008 weight=1;

        server 192.168.8.110:1008 weight=2;

    }

    server {

        listen 80;

        location / {

            proxy_pass http://tomcats;

        }

    }

主要配置参数之proxy_pass

proxy_pass http://tomcats:表示将所有请求转发到tomcats服务器组中配置的某一台服务器上。tomcats是服务器组的名称。

主要配置参数之upstream

upstream模块:配置反向代理服务器组,Nginx会根据配置,将请求分发给组里的某一台服务器。tomcats是服务器组的名称。

主要配置参数之upstream模块下的server指令

upstream模块下的server指令:配置处理请求的服务器IP或域名,端口可选,不配置默认使用80端口。

主要配置参数之weight

Nginx测试实验

使用nginx好处

可用性提高:运行多个服务实例,比如两个,由于机器故障一个down时,服务总体仍可用。

性能提高:提高并发访问数量。

使用nginx后会产生一些新的问题

参考:配置负载均衡比较简单,但是最关键的一个问题是怎么实现多台服务器之间session的共享

Nginx测试实验

Nginx测试实验

Nginx测试实验

我是如何保证服务器间共享session的

我系统中没有使用session。

★★登录用户登录掉线如何判断

我在系统中使用的不是session,而是在token中夹带了很多信息。如何判断用户是否掉线了呢?

判断用户登录掉线(离开时间超过一定的值)的基本思路

用户首次登录成功时,用redis或者guava缓存新增LoginMap<Long userId,DataTime loginTime>。

有个定时任务定时扫描LoginMap,若上次访问时间loginTime超过设置时间(比如1个小时),则将该key-value踢出LoginMap。

后面每次访问根据userId先查看LoginMap是否存在值,若存在直接可进入系统并刷新 loginTime;若不存在则需要重新登录。

单机时

使用redis或者guava存储LoginMap<Long userId,DataTime loginTime>均可。

那么,使用nginx后如何处理呢?

此时使用guava不可以了。因为guava是跟随服务实例的,不是全局的,肯定会造成混乱。

此时使用redis即可,不管几个服务实例,都使用redis存储LoginMap<Long userId,DataTime loginTime>。因为redis是全局的,所有服务实例共享redis,跟单机实际上是一样的。

补充1--实现负载均衡常用的Web服务器软件--没看没试验

实现负载均衡常用的Web服务器软件有Nginx、HAProxy、LVS、Apache。

补充2--LVS Nginx HAProxy 优缺点--没看没试验

http://blog.chinaunix.net/uid-27022856-id-3236257.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Wesley13 Wesley13
3年前
4. Nginx模块
Nginx官方模块1.ngx\_http\_stub\_status\_modulehttp://nginx.org/en/docs/http/ngx\_http\_stub\_status\_module.html。(https://www.oschina.net/action/GoToLink?urlhttp%3A%2
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Nginx反向代理upstream模块介绍
!(https://oscimg.oschina.net/oscnet/1e67c46e359a4d6c8f36b590a372961f.gif)!(https://oscimg.oschina.net/oscnet/819eda5e7de54c23b54b04cfc00d3206.jpg)1.Nginx反
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这