• 谷粒商城分布式高级(一)—— 环境搭建(高级篇补充)(ElasticSearch & nginx)


    一、ElasticSearch 开发环境搭建

    1、docker 安装 ElasticSearch

     (1)先检查一下虚拟机的可用内存

      (2)下载镜像文件

        docker pull elasticsearch:7.4.2 存储和检索数据
        docker pull kibana:7.4.2 可视化检索数据,后面会安装
        注意:版本要统一

      (3)创建挂载目录  

        mkdir -p /mydata/elasticsearch/plugins
        mkdir -p /mydata/elasticsearch/config
        mkdir -p /mydata/elasticsearch/data

      (4)设置es可以被远程任何机器访问

        echo "http.host: 0.0.0.0" >> /mydata/elasticsearch/config/elasticsearch.yml

      (5)递归更改权限,es需要访问

        chmod -R 777 /mydata/elasticsearch

        注意:一定要授权,否则后面启动的时候会访问拒绝,没权限

      (6)创建实例,启动 Elastic search

        docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \-e ES_JAVA_OPTS="-Xms64m -Xmx128m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2 

      注意:

        # 9200是用户交互端口 9300是集群心跳端口

        # -e指定是单阶段运行

        # -e指定占用的内存大小,生产时可以设置32G 

      以后再外面装好插件重启即可;

      特别注意:

        -e ES_JAVA_OPTS="-Xms64m -Xmx128m" \ 测试环境下,设置 ES 的初始内存和最大内存,否则导致过大启动不了 ES 

     (7)设置随docker自启动

        docker update elasticsearch --restart=always

     (8)测试访问

        查看elasticsearch版本信息:http://192.168.56.10:9200/

      显示elasticsearch 节点信息http://192.168.11.129:9200/_cat/nodes

      127.0.0.1 69 99 9 1.07 0.78 0.56 dilm * 79966af1bf0e

      79966af1bf0e代表上面的节点,*代表是主节点

    2、docker 安装 kibana

    1)创建实例并启动
        docker run --name kibana -e ELASTICSEARCH_HOSTS=http://192.168.56.10:9200 -p 5601:5601 -d kibana:7.4.2 
        注意:http://192.168.56.10:9200 一定改为自己虚拟机的地址2)设置随docker自启动
        docker update kibana --restart=always
    (3)测试
        访问:http://192.168.56.10:5601/app/kibana

    3、安装 ik 分词器

    注意:不能用默认 elasticsearch-plugin install xxx.zip 进行自动安装 
    https://github.com/medcl/elasticsearch-analysis-ik/releases?after=v6.4.2 对应 es 版本安装
    
    1)进入es容器内部 plugins 目录   docker exec -it 容器 id /bin/bash
      注意:由于我们在安装 es 的时候,已经将容器内部的 plugins 目录映射到 /mydata/elasticsearch/plugins/,所以我们直接切换到映射目录即可
    2)下载 ik 分词器
        wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.4.2/elasticsearch-analysis-ik-7.4.2.zip
      注意:
    
      (a)这一步可以使用wget命令下载,也可以直接下载下来使用xshell命令上传
    
      (b)关于wget和unzip命令找不到的问题,查看 谷粒商城分布式基础(二)—— 环境搭建(虚拟机 & JDK & Maven & docker & mysql & redis & vue) 中 “1、安装 Linux 虚拟机” 的 第13点
    
      我们还可以进入es的容器中,可以看到映射对应的文件目录里面也可以看到
    3)解压下载文件
      最后,记得删除掉原下载的压缩包 
    4)设置权限


    5)确认是否安装好了分词器


    6)重启 es

    4、修改 es 的最大内存

    我们之前设置的es的最大内存是128,启动延时严重,修改一下
    1)停止原先的 es 容器
    2)移除这个 es 容器
      注意:由于我们之前已经将 es 的数据挂载到磁盘了,所以不用担心丢失了,我们可以验证一下
    
    3)创建新的容器,指定新的内存为 512m

      docker run --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" \-e ES_JAVA_OPTS="-Xms64m -Xmx512m" -v /mydata/elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /mydata/elasticsearch/data:/usr/share/elasticsearch/data -v /mydata/elasticsearch/plugins:/usr/share/elasticsearch/plugins -d elasticsearch:7.4.2

    二、Nginx

    1、安装 nginx

    (1)随便启动一个nginx实例,只是为了复制出配置
        docker run -p 80:80 --name nginx -d nginx:1.10

     (2)创建nginx的挂载目录 /mydata/nginx 

        mkdir -p /mydata/nginx

     (3)将容器内的配置文件拷贝到当前目录

        docker container cp nginx:/etc/nginx .

      注意:别忘了后面的点

     (4)停掉之前的nginx容器,并删除掉这个容器  

        docker stop nginx
        docker rm nginx

     (5)修改文件夹nginx名称为conf,并创建新的文件夹nginx,把这个conf移动到/mydata/nginx下

     (6)创建新的nginx,执行以下命令

        docker run -p 80:80 --name nginx -v /mydata/nginx/html:/usr/share/nginx/html -v /mydata/nginx/logs:/var/log/nginx -v /mydata/nginx/conf:/etc/nginx -d nginx:1.10

      我们可以看到挂载目录 /mydata/nginx 下自动生成了下面两个文件夹

     (7)设置随docker自启动

        docker update nginx --restart=always

     (8)测试

        在/mydata/nginx/html下新建一个index.html,访问http://192.168.56.10 (默认端口是80)

      给 nginx 的 html 下面放的所有资源可以直接访问

    2、nginx 配置文件



    /mydata/nginx/conf/nginx.conf

    user nginx;
    worker_processes 1;

    error_log /var/log/nginx/error.log warn;
    pid /var/run/nginx.pid;


    events {
      worker_connections 1024;
    }


    http {
      include /etc/nginx/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 /var/log/nginx/access.log main;

      sendfile on;
      #tcp_nopush on;

      keepalive_timeout 65;

      #gzip on;

      include /etc/nginx/conf.d/*.conf;
    }

    /mydata/nginx/conf/conf.d/default.conf

    server {
      listen 80;
      server_name localhost;

      #charset koi8-r;
      #access_log /var/log/nginx/log/host.access.log main;

      location / {
        root /usr/share/nginx/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 /usr/share/nginx/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;
      #}
    }

    3、搭建域名访问环境(反向代理 & 负载均衡到网关)

      注意:请先关闭防火墙

    1)修改 Windows 的 hosts文件,映射 gulimall.com 到 192.168.56.10(虚拟机地址)
      打开 SwitchHosts 操作即可

      测试访问: http://gulimall.com:9200
      测试访问:http://gulimall.com:5601/app/kibana
       测试访问: http://gulimall.com

    2)修改nginx配置 实现 反向代理配置   按照 谷粒商城分布式高级(四)—— 商城业务(商城系统首页)  渲染完首页分类菜单之后  (a)复制 /mydata/nginx/conf/conf.d/default.conf ,名称路径为 /mydata/nginx/conf/conf.d/gulimall.conf       cp default.conf gulimall.conf
      (b)修改 gulimall.conf 文件
    
          vi gulimall.conf 
     (c)保存之后重启 nginx 容器
        
        docker restart nginx

     (d)测试
    
       启动 gulimall-product
    
       访问:http://gulimall.com
     (e)存在问题
    
        由于我们微服务的gulimall.com,商品服务可能不止一台服务器,所以这里监听gulimall.com:80,直接代理到 gulimall-product是存在问题的
    
        解决办法:配置网关
    3)修改网关配置 实现 负载均衡到网关   (a)修改 /mydata/nginx/conf/nginx.conf,将 upstream 映射到我们的网关服务
      (b)修改 /mydata/nginx/conf/conf.d/gulimall.conf,接收到gulimall.com的访问后,如果是/,转交给指定的upstream。
    
    由于nginx的转发会丢失host头,造成网关不知道原host,所以我们添加头信息
    
      (c)重启nginx容器
    
        docker restart nginx
    
      (d)配置gulimall-gateway(网关服务),将域名为**.gulimall.com转发至商品服务。配置的时候注意 网关优先匹配的原则,所以要把这个配置放到后面
    
    - id: gulimall_host_route
      uri: lb://gulimall-product
      predicates:
        - Host=**.gulimall.com
       (e)测试
    
        重启gulimall-product 、gulimall-gateway
    
        访问:http://gulimall.com/api/product/attrgroup/list/1  和 http://localhost:88/api/product/attrgroup/list/1  结果相同,说明网关服务访问正常
    
        访问:gulimall.com  nginx代理访问征程
    
      此时请求接口和请求页面都是gulimall.com 
    
    4)域名映射效果       请求接口 gulimall.com       请求页面 gulimall.com     nginx直接代理给网关,网关判断     (a)如果/api/****,转交给对应的服务器     (b)如果是 满足域名,转交给对应的服务 (5)nginx转发效果

    4、nginx 动静分离

      由于动态资源和静态资源目前都处于服务端,所以为了减轻服务器压力,我们将 js、css、img等静态资源放置在Nginx端,以减轻服务器压力

     (1)创建文件夹 static ,并且将 resources\static\index 上传到 static 中

     (2)删除 gulimall-product 中的 resources\static\index

     (3)修改index.html的静态资源路径,加上static前缀src="/static/index/img/img_09.png",包括href

     (4)修改nginx配置文件 /mydata/nginx/conf/conf.d/gulimall.conf

        如果遇到有/static为前缀的请求,转发至html文件夹

        vim /mydata/nginx/conf/conf.d/gulimall.conf

     (5)重启nginx容器并重启gulimall-product测试

  • 相关阅读:
    bzoj 1071: [SCOI2007]组队
    bzoj 4872: [Shoi2017]分手是祝愿
    (python)循环中动态产生变量
    Python中的exec、eval的区别
    MATLAB中feval与eval的区别
    用intellij idea 写第一个Java程序
    Python词云的中文问题
    python里的apply,applymap和map的区别
    Python 正则表达式匹配小数
    字典的深拷贝与浅拷贝
  • 原文地址:https://www.cnblogs.com/javahr/p/15704733.html
Copyright © 2020-2023  润新知