谷粒商城分布式高级(一)—— 环境搭建(高级篇补充)(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测试

原文地址:https://www.cnblogs.com/javahr/p/15704733.html