服务器搭建 相关博客-Java技术分享站

    服务器搭建 server jvm123.com 是一个java技术分享站,内容涉及java、jvm、程序开发,单元测试框架Spock教程,测试视频教程,spring框架教程等, 以及服务器搭建、linux、docker等相关技术。

MeiliSearch 索引和文档操作http请求示例

<!-- wp:paragraph --> <p>和elasticsearch一样,melisearch也使用http请求对索引和文档进行操作,常用的http请求如下:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>以下示例的url中,“http://jvm123.com:7700”为MeilisSearch的地址和端口,“movies”为索引的名称。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>MeiliSearch 索引操作</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3>查询所有索引信息</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>查询一个索引信息</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>创建索引</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>POST </strong>http://jvm123.com:7700/indexes <em>Content-Type</em>: application/json { // uid是必需的字段 "uid" : "movies", "primaryKey": "id" }</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>更新索引</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>PUT </strong>http://jvm123.com:7700/indexes <em>Content-Type</em>: application/json { "uid" : "movies", "primaryKey": "id" }</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>删除索引</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>DELETE </strong>http://jvm123.com:7700/indexes/pets</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>MeiliSearch 文档操作</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3>查询索引下的所有文档</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>参数 offset、limit、attributesToRetrieve=*</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies/documents</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>查询的单个文档</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>2 为文档的<code>primaryKey</code></p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies/documents/2</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>添加或替换文档 </h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>添加或替换文档(如果id存在,则替换文档),如果指定的index不存在,则自动创建index。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>POST </strong>http://jvm123.com:7700/indexes/movies/documents <em>Content-Type</em>: application/json [ { "id": "5", "title" : "暖的抱抱", "des" : "对整洁和计划有着超乎常人执念的鲍抱(常远 饰),本以为自己是一个友情爱情的绝缘体,但在遇到个性率真的宋温暖(李沁 饰) 、妙手“神经”的贾医生(沈腾 饰)和假仁假义的王为仁(乔杉 饰)之后,上演了一段阴差阳错的喜剧故事……", "actors" : "常远,李沁,沈腾,乔杉" }, { "id": "6", "名称" : "缉魂", "剧情简介" : "著名集团董事长王世聪惨死家中,负责此案的检察官梁文超(张震 饰)与妻子刑警阿爆(张钧甯 饰)在调查中得知:死者的儿子王天佑(林晖闵 饰),年轻的新婚妻子李燕(孙安可 饰),多年合伙人万宇凡(李铭顺 饰),甚至死去的前妻唐素贞(张柏嘉 饰),每个人之间都有着错综复杂的关联。阿爆更是发现隐藏在案件背后的惊人秘密……", "演员" : "张震,张钧甯,孙安可" } ]</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>添加或更新文档 </h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>添加或更新文档 (如果id存在,则更新文档)</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>PUT </strong>http://jvm123.com:7700/indexes/posts/documents <em>Content-Type</em>: application/json [ { "id": 1, "author" : "yawn", "观后感" : "这部电影很好看。", "演员" : "张震,张钧甯,孙安可" } ]</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>删除索引下的所有文档</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>DELETE </strong>http://jvm123.com:7700/indexes/movies/documents</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>删除单个文档</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>DELETE </strong>http://jvm123.com:7700/indexes/movies/documents/1</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>批量删除文档</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>批量删除文档,请求体为id的数组。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>POST </strong>http://jvm123.com:7700/indexes/movies/documents/delete-batch <em>Content-Type</em>: application/json ["1", "2", "3"]</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>MeiliSearch搜索文档</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>搜索有get和post两种方式,官方推荐使用post方法。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>POST </strong>http://jvm123.com:7700/indexes/movies/search<br><em>Content-Type</em>: application/json<br><br>{<br> "q": "一",<br> "limit": 3,<br> "offset": 1<br>// "filters": "age &gt; 18" // 要求字段事数值类型的<br>}</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>MeiliSearch 的 update (异步更新)</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>每个create/update/delete请求,都会将操作放入一个队列中,并返回一个updateId,使用这个updateId,就可以查询这次操作的结果状态。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>查询一个异步更新的状态</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies/updates/5 // 5 为操作后返回的 updateId // status 为 processed/failed 表示成功或失败的状态 // type.name 为 DocumentsAddition/DocumentsPartial/DocumentsDeletion,分别对应post/put/delete方法的操作</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>查询所有异步更新的状态</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies/updates</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>其它请求操作</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3>查询keys</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/keys</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>查询索引的settings信息</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies/settings</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>stats 查询MeiliSearch的指标信息</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/stats</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>索引的指标信息</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/indexes/movies/stats</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>health</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/health</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>version</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/version</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>dump 备份</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>POST </strong>http://jvm123.com:7700/dumps</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>返回结果如下,“20210118-103935567”为这次备份的uid,.dump备份文件 在MEILI_DUMPS_DIR所指定的位置</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">{ "uid": "20210118-103935567", "status": "in_progress" }</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>查询dump 备份的完成状态</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"><strong>GET </strong>http://jvm123.com:7700/dumps/20210118-103935567/status // status 为 done 已完成</pre> <!-- /wp:preformatted -->

分类:服务器搭建数据库搜索引擎
标签:搜索服务器Meilisearch搜索引擎搜索

2021-01-20 14:25:07.0
MeiliSearch 索引和文档操作http请求示例  meilisearch-http

MeiliSearch 轻量级搜索引擎基础和安装

<!-- wp:paragraph --> <p>下载后执行以下命令启动:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">./meilisearch</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>启动时添加参数</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">./meilisearch --db-path ./meilifiles --master-key jvm123</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>参数也可以在环境变量中指定</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">export MEILI_DB_PATH=./meilifiles export MEILI_MASTER_KEY=jvm123 ./meilisearch</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>MeiliSearch 启动后,默认监听7700端口,可以在7700端口使用http请求进行操作。</p> <!-- /wp:paragraph --> <!-- wp:image {"id":2980} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2021/01/image-1024x680.png" alt="meilisearch" class="wp-image-2980"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>其他参数</h2> <!-- /wp:heading --> <!-- wp:table --> <table class="wp-block-table"><thead><tr><th>参数</th><th>说明</th><th>默认值</th></tr></thead><tbody><tr><td>--db-path</td><td>数据存储的位置</td><td></td></tr><tr><td>--master-key</td><td>访问Meilisearch的master key</td><td>无</td></tr><tr><td>--http-addr</td><td>监听的地址和端口</td><td>"127.0.0.1:7700"</td></tr><tr><td>--env</td><td>运行环境(development/production) 为production时,必须要设置master-key</td><td>development</td></tr><tr><td>--dumps-dir</td><td>dumps运行后,创建.dump文件的目录</td><td>dumps/</td></tr><tr><td>--import-dump</td><td>运行时导入.dump文件中的数据</td><td></td></tr></tbody></table> <!-- /wp:table --> <!-- wp:heading --> <h2>数据类型</h2> <!-- /wp:heading --> <!-- wp:list --> <ul><li>String</li><li>Numeric types <code>integer</code>, <code>float</code></li><li>Boolean</li><li>Array</li><li>Object</li><li><code>null</code> type</li></ul> <!-- /wp:list --> <!-- wp:heading --> <h2>melisearch 索引、文档操作</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>和elasticsearch一样,melisearch也使用http请求对索引和文档进行操作,下一节将介绍。</p> <!-- /wp:paragraph -->

分类:服务器搭建数据库搜索引擎
标签:搜索服务器Meilisearch搜索引擎搜索

2021-01-20 04:48:09.0
MeiliSearch 轻量级搜索引擎基础和安装  meilisearch-qing

Docker compose

<!-- wp:paragraph --> <p>Compose 使用的三个步骤:</p> <!-- /wp:paragraph --> <!-- wp:list --> <ul><li>使用 Dockerfile 定义应用程序的环境。</li><li>使用 docker-compose.yml 定义构成应用程序的服务,这样它们可以在隔离环境中一起运行。</li><li>最后,执行 docker-compose up 命令来启动并运行整个应用程序。</li></ul> <!-- /wp:list --> <!-- wp:heading --> <h2>示例</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p> docker-compose.yml </p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">version: "3.8"<br>services:<br> redis:<br> &nbsp; image: redis:alpine<br> &nbsp; ports:<br> &nbsp; &nbsp; - "6379"<br> &nbsp; networks:<br> &nbsp; &nbsp; - frontend<br> &nbsp; deploy:<br> &nbsp; &nbsp; replicas: 2<br> &nbsp; &nbsp; update_config:<br> &nbsp; &nbsp; &nbsp; parallelism: 2<br> &nbsp; &nbsp; &nbsp; delay: 10s<br> &nbsp; &nbsp; restart_policy:<br> &nbsp; &nbsp; &nbsp; condition: on-failure<br> db:<br> &nbsp; image: postgres:9.4<br> &nbsp; volumes:<br> &nbsp; &nbsp; - db-data:/var/lib/postgresql/data<br> &nbsp; networks:<br> &nbsp; &nbsp; - backend<br> &nbsp; deploy:<br> &nbsp; &nbsp; placement:<br> &nbsp; &nbsp; &nbsp; constraints:<br> &nbsp; &nbsp; &nbsp; &nbsp; - "node.role==manager"<br> vote:<br> &nbsp; image: dockersamples/examplevotingapp_vote:before<br> &nbsp; ports:<br> &nbsp; &nbsp; - "5000:80"<br> &nbsp; networks:<br> &nbsp; &nbsp; - frontend<br> &nbsp; depends_on:<br> &nbsp; &nbsp; - redis<br> &nbsp; deploy:<br> &nbsp; &nbsp; replicas: 2<br> &nbsp; &nbsp; update_config:<br> &nbsp; &nbsp; &nbsp; parallelism: 2<br> &nbsp; &nbsp; restart_policy:<br> &nbsp; &nbsp; &nbsp; condition: on-failure<br> result:<br> &nbsp; image: dockersamples/examplevotingapp_result:before<br> &nbsp; ports:<br> &nbsp; &nbsp; - "5001:80"<br> &nbsp; networks:<br> &nbsp; &nbsp; - backend<br> &nbsp; depends_on:<br> &nbsp; &nbsp; - db<br> &nbsp; deploy:<br> &nbsp; &nbsp; replicas: 1<br> &nbsp; &nbsp; update_config:<br> &nbsp; &nbsp; &nbsp; parallelism: 2<br> &nbsp; &nbsp; &nbsp; delay: 10s<br> &nbsp; &nbsp; restart_policy:<br> &nbsp; &nbsp; &nbsp; condition: on-failure<br> worker:<br> &nbsp; image: dockersamples/examplevotingapp_worker<br> &nbsp; networks:<br> &nbsp; &nbsp; - frontend<br> &nbsp; &nbsp; - backend<br> &nbsp; deploy:<br> &nbsp; &nbsp; mode: replicated<br> &nbsp; &nbsp; replicas: 1<br> &nbsp; &nbsp; labels: [APP=VOTING]<br> &nbsp; &nbsp; restart_policy:<br> &nbsp; &nbsp; &nbsp; condition: on-failure<br> &nbsp; &nbsp; &nbsp; delay: 10s<br> &nbsp; &nbsp; &nbsp; max_attempts: 3<br> &nbsp; &nbsp; &nbsp; window: 120s<br> &nbsp; &nbsp; placement:<br> &nbsp; &nbsp; &nbsp; constraints:<br> &nbsp; &nbsp; &nbsp; &nbsp; - "node.role==manager"<br> visualizer:<br> &nbsp; image: dockersamples/visualizer:stable<br> &nbsp; ports:<br> &nbsp; &nbsp; - "8080:8080"<br> &nbsp; stop_grace_period: 1m30s<br> &nbsp; volumes:<br> &nbsp; &nbsp; - "/var/run/docker.sock:/var/run/docker.sock"<br> &nbsp; deploy:<br> &nbsp; &nbsp; placement:<br> &nbsp; &nbsp; &nbsp; constraints:<br> &nbsp; &nbsp; &nbsp; &nbsp; - "node.role==manager"<br>networks:<br> frontend:<br> backend:<br>volumes:<br> db-data:</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>参考:https://docs.docker.com/compose/compose-file/</p> <!-- /wp:paragraph -->

分类:服务器搭建docker
标签:dockerdocker容器docker compose

2020-04-20 09:55:36.0
Docker compose  docker-compose

Docker构建镜像--DockerFile

<!-- wp:heading --> <h2>Docker 构建自定义的镜像:</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">$ docker build -t shykes/myapp . <br>$ docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest . </pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>其中“.”为上下文路径,dockerFile中构建指令的上下文。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>DockerFile指令:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p><strong>FROM</strong>:自定义的镜像都是基于 FROM 的镜像,后面是基础镜像。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>RUN</strong>: 用于执行后面跟着的命令行命令。有以下俩种格式: </p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">FROM nginx<br>RUN ["./test.php", "dev", "offline"] <br>RUN ./test.php dev offline # 与上一行等价</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>多个RUN指令可以如下写,使用&amp;&amp;:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">FROM centos<br>RUN yum install wget \<br> &nbsp; &amp;&amp; wget -O redis.tar.gz "http://.../redis.tar.gz" \<br> &nbsp; &amp;&amp; tar -xvf redis.tar.gz</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p><strong>CMD</strong>:同RUN,但是后面的命令在容器运行时才会执行。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>COPY</strong>:从上下文目录中复制文件或者目录到容器里指定路径 。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">COPY demo3-0.0.1-SNAPSHOT.jar app.jar</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p><strong>ADD</strong>:同COPY,推荐使用COPY。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>ENTRYPOINT</strong>:同CMD,如果docker提供服务,则优先使用entrypoint。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>ENV</strong>:设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。 </p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">ENV NODE_VERSION 7.2.0<br>ENV NODE_VERSION=7.2.0 # 与上一行等价<br>​<br>RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/linux-x64.tar.xz"</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>在运行容器的时候,可以使用 <code>docker run -e NODE_VERSION=7.3.1</code>改变环境变量。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>VOLUME</strong>:定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>作用:</p> <!-- /wp:paragraph --> <!-- wp:list --> <ul><li>避免重要的数据,因容器重启而丢失,这是非常致命的。</li><li>避免容器不断变大。</li></ul> <!-- /wp:list --> <!-- wp:paragraph --> <p>volume是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下每个容器的volume都在host机器上的指定目录下/var/lib/docker/volumes。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">VOLUME /tmp</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p><strong>EXPOSE</strong>:声明端口。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>作用:</p> <!-- /wp:paragraph --> <!-- wp:list --> <ul><li>帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。</li><li>在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。</li></ul> <!-- /wp:list --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">EXPOSE 8082</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>示例,memcached的dockerFile</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">FROM debian:buster-slim<br>​<br># add our user and group first to make sure their IDs get assigned consistently, regardless of whatever dependencies get added<br>RUN groupadd --system --gid 11211 memcache &amp;&amp; useradd --system --gid memcache --uid 11211 memcache<br>​<br># ensure SASL's "libplain.so" is installed as per https://github.com/memcached/memcached/wiki/SASLHowto<br>RUN set -eux; \<br> apt-get update; \<br> apt-get install -y --no-install-recommends \<br> libsasl2-modules \<br> ; \<br> rm -rf /var/lib/apt/lists/*<br>​<br>ENV MEMCACHED_VERSION 1.6.5<br>ENV MEMCACHED_SHA1 1ddb5f37f69946b63512ad0f89dc448ff7ba5713<br>​<br>RUN set -x \<br> \<br> &amp;&amp; savedAptMark="$(apt-mark showmanual)" \<br> &amp;&amp; apt-get update \<br> &amp;&amp; apt-get install -y --no-install-recommends \<br> ca-certificates \<br> dpkg-dev \<br> gcc \<br> libc6-dev \<br> libevent-dev \<br> libio-socket-ssl-perl \<br> libsasl2-dev \<br> libssl-dev \<br> make \<br> perl \<br> wget \<br> &amp;&amp; rm -rf /var/lib/apt/lists/* \<br> \<br> &amp;&amp; wget -O memcached.tar.gz "https://memcached.org/files/memcached-$MEMCACHED_VERSION.tar.gz" \<br> &amp;&amp; echo "$MEMCACHED_SHA1 memcached.tar.gz" | sha1sum -c - \<br> &amp;&amp; mkdir -p /usr/src/memcached \<br> &amp;&amp; tar -xzf memcached.tar.gz -C /usr/src/memcached --strip-components=1 \<br> &amp;&amp; rm memcached.tar.gz \<br> \<br> &amp;&amp; cd /usr/src/memcached \<br> \<br> &amp;&amp; gnuArch="$(dpkg-architecture --query DEB_BUILD_GNU_TYPE)" \<br> &amp;&amp; enableExtstore="$( \<br># https://github.com/docker-library/memcached/pull/38<br> case "$gnuArch" in \<br># https://github.com/memcached/memcached/issues/381 "--enable-extstore on s390x (IBM System Z mainframe architecture) fails tests"<br> s390x-*) ;; \<br> *) echo '--enable-extstore' ;; \<br> esac \<br> )" \<br> &amp;&amp; ./configure \<br> --build="$gnuArch" \<br> --enable-sasl \<br> --enable-sasl-pwdb \<br> --enable-tls \<br> $enableExtstore \<br> &amp;&amp; make -j "$(nproc)" \<br> \<br># see https://github.com/docker-library/memcached/pull/54#issuecomment-562797748 and https://bugs.debian.org/927461 for why we have to munge openssl.cnf<br> &amp;&amp; sed -i.bak 's/SECLEVEL=2/SECLEVEL=1/g' /etc/ssl/openssl.cnf \<br># TODO https://github.com/memcached/memcached/issues/382 "t/chunked-extstore.t is flaky on arm32v6"<br> &amp;&amp; make test \<br> &amp;&amp; mv /etc/ssl/openssl.cnf.bak /etc/ssl/openssl.cnf \<br> &amp;&amp; make install \<br> \<br> &amp;&amp; cd / &amp;&amp; rm -rf /usr/src/memcached \<br> \<br> &amp;&amp; apt-mark auto '.*' &gt; /dev/null \<br> &amp;&amp; apt-mark manual $savedAptMark &gt; /dev/null \<br> &amp;&amp; find /usr/local -type f -executable -exec ldd '{}' ';' \<br> | awk '/=&gt;/ { print $(NF-1) }' \<br> | sort -u \<br> | xargs -r dpkg-query --search \<br> | cut -d: -f1 \<br> | sort -u \<br> | xargs -r apt-mark manual \<br> &amp;&amp; apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \<br> \<br> &amp;&amp; memcached -V<br>​<br>COPY docker-entrypoint.sh /usr/local/bin/<br>RUN ln -s usr/local/bin/docker-entrypoint.sh /entrypoint.sh # backwards compat<br>ENTRYPOINT ["docker-entrypoint.sh"]<br>​<br>USER memcache<br>EXPOSE 11211<br>CMD ["memcached"]</pre> <!-- /wp:preformatted --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"># docker-entrypoint.sh 文件<br>#!/bin/sh<br>set -e<br>​<br># first arg is `-f` or `--some-option`<br>if [ "${1#-}" != "$1" ]; then<br> set -- memcached "$@"<br>fi<br>​<br>exec "$@"</pre> <!-- /wp:preformatted --> <!-- wp:code --> <pre class="wp-block-code"><code># Dockerfile example FROM centos MAINTAINER John Doe (J.D.) &lt;jd@example.com> ENV PORT_TO_EXPOSE=4242 RUN echo Scratch running ... RUN echo Scratch running ... RUN echo Scratch running ... RUN echo "String.... run line1"\ &amp;&amp; echo "String.... run line2"\ &amp;&amp; echo "String.... run line3" CMD ["sh", "-c", "echo String....cmd"] #ENTRYPOINT ["sh", "-c", "java -jar app.jar"] EXPOSE $PORT_TO_EXPOSE 8080 VOLUME ["/my_files"] </code></pre> <!-- /wp:code -->

分类:服务器搭建docker
标签:dockerdockerFiledocker容器docker compose

2020-04-20 09:53:15.0
Docker构建镜像--DockerFile  docker-gou-jian

Mycat 常用的分片规则

<!-- wp:heading --> <h2>分片枚举</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> &lt;tableRule name="sharding-by-intfile"&gt;<br> &lt;rule&gt;<br> &lt;columns&gt;id&lt;/columns&gt;<br> &lt;algorithm&gt;hash-int&lt;/algorithm&gt;<br> &lt;/rule&gt;<br> &lt;/tableRule&gt;<br> &lt;function name="hash-int"<br> class="io.mycat.route.function.PartitionByFileMap"&gt;<br> &lt;property name="mapFile"&gt;partition-hash-int.txt&lt;/property&gt;<br> &lt;/function&gt;</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>partition-hash-int.txt</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">10000=0<br>10010=1</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>如上,id为10000的存在0节点,id为10010的存在1节点。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>范围约定</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> &lt;tableRule name="auto-sharding-long"&gt;<br> &lt;rule&gt;<br> &lt;columns&gt;id&lt;/columns&gt;<br> &lt;algorithm&gt;rang-long&lt;/algorithm&gt;<br> &lt;/rule&gt;<br> &lt;/tableRule&gt;<br> &lt;function name="rang-long"<br> class="io.mycat.route.function.AutoPartitionByLong"&gt;<br> &lt;property name="mapFile"&gt;autopartition-long.txt&lt;/property&gt;<br> &lt;/function&gt;</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>autopartition-long.txt</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"># range start-end ,data node index<br># K=1000,M=10000.<br>0-500M=0<br>500M-1000M=1<br>1000M-1500M=2</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>id在0--500万之间的存在0分片;</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>id在500万--1000万之间的存在1分片;</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>id在1000万--1500万之间的存在2分片。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>取 模</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>此规则为对分片字段求摸运</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> &lt;tableRule name="mod-long"&gt;<br> &lt;rule&gt;<br> &lt;columns&gt;id&lt;/columns&gt;<br> &lt;algorithm&gt;mod-long&lt;/algorithm&gt;<br> &lt;/rule&gt;<br> &lt;/tableRule&gt;<br> &nbsp; &nbsp;&lt;function name="mod-long" class="io.mycat.route.function.PartitionByMod"&gt;<br> &lt;!-- how many data nodes --&gt;<br> &lt;property name="count"&gt;3&lt;/property&gt;<br> &lt;/function&gt;</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>按日期(天)分片</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> &nbsp; &nbsp;&lt;tableRule name="sharding-by-date"&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;rule&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;columns&gt;create_time&lt;/columns&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&lt;algorithm&gt;sharding-by-date&lt;/algorithm&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;/rule&gt;<br> &nbsp; &nbsp;&lt;/tableRule&gt;<br> &nbsp; &nbsp;&lt;function name="sharding-by-date" class="io.mycat.route.function.PartitionByDate"&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="dateFormat"&gt;yyyy-MM-dd&lt;/property&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="sBeginDate"&gt;2014-01-01&lt;/property&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="sEndDate"&gt;2014-10-01&lt;/property&gt;<br> &nbsp; &nbsp; &nbsp; &nbsp;&lt;property name="sPartionDay"&gt;10&lt;/property&gt;<br> &nbsp; &nbsp;&lt;/function&gt; </pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>按照create_time,从2014-01-01开始,每10天的数据存在一个分片。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如果配置了 sEndDate 则代表数据达到了这个日期的分片后循环从开始分片存储。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>按月分片</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> &lt;tableRule name="sharding-by-month"&gt;<br> &lt;rule&gt;<br> &lt;columns&gt;create_time&lt;/columns&gt;<br> &lt;algorithm&gt;partbymonth&lt;/algorithm&gt;<br> &lt;/rule&gt;<br> &lt;/tableRule&gt;<br> &lt;function name="partbymonth"<br> class="io.mycat.route.function.PartitionByMonth"&gt;<br> &lt;property name="dateFormat"&gt;yyyy-MM-dd&lt;/property&gt;<br> &lt;property name="sBeginDate"&gt;2015-01-01&lt;/property&gt;<br> &lt;/function&gt;</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>每月一个分片。</p> <!-- /wp:paragraph -->

分类:服务器搭建数据库
标签:mysql分库分片分片算法mycat

2020-04-17 03:25:33.0
Mycat 常用的分片规则  mycat-chang-yong-de

Mycat使用入门Windows环境

<!-- wp:heading --> <h2>尝试启动mycat</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>下载解压后,运行startup_nowrap.bat:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1815,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2020/04/image.png" alt="" class="wp-image-1815"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>如果报错找不到主类 **/mycat,需要将mycat文件夹放在没特殊字符或空格的路径下。例如,如果放在D:\Program Files\mycat路径下,就会找不到主类Files/mycat。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如果启动没有异常退出即可,日志中还会有一些错误,需要进行下一步配置。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>配置用户、权限</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在server.xml中,配置如下,默认就有:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>&lt;user name="root"> &lt;property name="password">123456&lt;/property> &lt;property name="schemas">TESTDB&lt;/property> &lt;/user> &lt;user name="user"> &lt;property name="password">user&lt;/property> &lt;property name="schemas">TESTDB&lt;/property> &lt;property name="readOnly">true&lt;/property> &lt;/user></code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>这里的用户名和密码就可以用来连接mycat服务器。可以使用navicat连接,注意默认端口是8066。</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1817,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2020/04/image-1.png" alt="" class="wp-image-1817"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>连接成功后,发现有许多表和视图,但是都打不开,这就需要我们下一步的配置。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>配置schema、table、节点、主机、分片规则</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在schema.xml中:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>&lt;schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100"> &lt;!-- mod rule --> &lt;table name="travelrecord" dataNode="dn1,dn2,dn3" rule="mod-long" /> &lt;!-- global table is auto cloned to all defined data nodes ,so can join with any table whose sharding node is in the same data node --> &lt;table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" /> &lt;!-- &lt;table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate" /> --> &lt;/schema></code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>上面配置了一个数据库TESTDB,两张数据表travelrecord和company,其中company为全局表(global),会在dn1,dn2,dn3三个节点上各存储一份, travelrecord 是需要按照mod-long算法 分节点 存储的表。 mod-long 算法的配置在rule.xml中,后面再说。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>节点、主机配置</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>&lt;dataNode name="dn1" dataHost="localhost1" database="db1" /> &lt;dataNode name="dn2" dataHost="localhost1" database="db2" /> &lt;dataNode name="dn3" dataHost="localhost1" database="db3" /> &lt;dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> &lt;heartbeat>select user()&lt;/heartbeat> &lt;!-- can have multi write hosts --> &lt;writeHost host="hostM1" url="localhost:3306" user="root" password="root"> &lt;!-- can have multi read hosts --> &lt;readHost host="hostS2" url="127.0.0.1:3306" user="root" password="root" /> &lt;/writeHost> &lt;!-- &lt;writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> &lt;/dataHost></code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>在一个主机上配置了三个节点:dn1、dn2、dn3,这就是前面配置table时的dataNode。此外readHost可以不用配置,如果配置,需要在mysql层面与writeHost数据同步,即主从复制同步。或者也可以像我这样保持数据同步。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>此外,还需要在本地主机创建三个数据库,并在每个数据库都创建company和 travelrecord 表。脚本如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>CREATE TABLE `company` ( `id` int(11) NOT NULL, `name` varchar(64) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE TABLE `travelrecord` ( `id` int(11) NOT NULL, `name` varchar(64) DEFAULT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>配置完这些后,重启mycat,刷新navicat,就可以看到数据库只剩下两张表。再使用insert语句,插入测试数据:插入company表的数据,分别复制到了三个本地mysql数据库;插入 travelrecord 时,却报错了。这是因为 travelrecord 表的数据需要分片存储到三个mysql数据库,插入数据时,还需要配置分片存储的规则,需要以下配置。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>分片规则</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>上面配置travelrecord table节点时,指定的rule,在rule.xml文件中,如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> &lt;tableRule name="mod-long"> &lt;rule> &lt;columns>id&lt;/columns> &lt;algorithm>mod-long&lt;/algorithm> &lt;/rule> &lt;/tableRule> &lt;function name="mod-long" class="io.mycat.route.function.PartitionByMod"> &lt;!-- how many data nodes --> &lt;property name="count">3&lt;/property> &lt;/function></code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>其中,id为travelrecord表的主键,3需要与 travelrecord表 的dataNode个数一致。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>配置好这个规则,再执行insert语句,即可插入成功。注意,insert语句不能省略列名,否则会出现以下错误:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1820,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2020/04/image-2.png" alt="" class="wp-image-1820"/><figcaption> [42000][1064] partition table, insert must provide ColumnList </figcaption></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>在mycat端执行select语句验证:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1821,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2020/04/image-3.png" alt="" class="wp-image-1821"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>再查看本地的三个数据库节点,数据的分布如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1823,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2020/04/image-5.png" alt="" class="wp-image-1823"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>所以,travelrecord表的数据按照规则分别存储在三个节点对应的数据库表上。</p> <!-- /wp:paragraph -->

分类:服务器搭建数据库
标签:数据库配置mysqlmycatwindows分库

2020-04-14 13:46:03.0
Mycat使用入门Windows环境  mycat-shi-yong-windowns

Redis数据类型和常用命令操作

<!-- wp:paragraph --> <p>redis是以set/get方式存储和获取数据的key-value存储系统 。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>redis有五种数据类型:string、list、hash、set、zset。对于不同的数据类型,又不同的操作。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>Redis常用操作</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3>string类型操作</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>SET key value [EX seconds] [PX milliseconds] [NX|XX] GET key MSET key value [key value ...] MGET key [key ...] SETEX key seconds value SETNX key value # 常用来实现分布式锁 INCR key # 如果value时数值类型,则对value自增1,并返回 DECR key # INCRBY key increment DECRBY key decrement</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>hash类型操作</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>HSET key field value HGET key field HMGET key field [field ...] HMSET key field value [field value ...] HDEL key filed [field ...] HEXISTS key field HGETALL key # 返回key下所有的feild和value HINCRYBY key filed increment HKEYS key # 返回key下所有的feild HLEN key # 返回key下feild的数量 HVALS key # 返回key下所有的feild和value</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>list类型操作</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>LPUSH key value [value ...] # 将多个值依次插入到表头 LPUSHX key value # 存在时push LPOP key # 移除后返回左边的值 LRANGE key start stop # 返回start和stop之间的元素 LLEN key # 返回list的长度 RPUSH key value [value ...] RPUSHX key value RPOP key RPOPLPUSH source destination # 将source的尾元素弹出并插入到destination的头部,并返回该元素</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>set类型操作</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>SADD key number [member ...] SCARD key # 返回集合中元素的数量 SISMEMBER key member # 是否为此集合的成员 SMEMBERS key # 返回所有成员 SMOVE source desination member # 将member元素从source集合移动到destination集合 SPOP key [count] # 随机移除并返回集合中count个值 SRANDMEMBER key [count] # 同上,但不移除 SREM key member [member ...] # 移除集合中的多个元素 ## 集合运算 SUNION key [key ...] # 多个集合的并集 SUNIONSTORE destination key [key ...] # 多个集合的并集并存储在destination中 SINTER key [key ...] # 交集 SINTERSTORE destination key [key ...] SDIFF key [key ...] # 差集 SDIFFSTORE destionation key [key ...]</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>zset类型操作</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>zset类型中的每个元素都有一个score</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>ZADD key score member [[score member] [score member] ...] # 添加 ZCARD key # 返回个数 ZCOUNT key min max # 返回score在min到max之间的元素个数 ZREM key member [member ...] # 删除 ZRANGE key start stop [WITHSCORES] # 返回score在start和stop之间的元素 ZRANK key mumber # 返回member的score排名 ZREMRANGEBYRANK key start stop # 根据排名删除 ZREMRANGEBYSCORE key min max # 根据score删除 ## score运算 zincrby key -1 # ## 集合运算 </code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>Redis的Key相关操作</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>EXISTS key DEL key [key ...] EXPIRE key seconds # 设置key的鬼泣时间 KEYS pattern # 返回匹配的keys PERSIST key # 移除key的过期时间(不过期) RANDOMKEY # 随机返回一个key RENAME key newkey # 重命名一个key TYPE key # key中存储数据的类型(5种类型) TTL key # 返回key的剩余生存时间(秒) PTTL key # 返回key的剩余生存时间(毫秒)</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>Redis 发布订阅操作</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>PUBLISH channel message # 将信息发送到指定的频道。 SUBSCRIBE channel [channel ...] # 订阅给定的一个或多个频道的信息。 UNSUBSCRIBE [channel [channel ...]] # 退订</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>redis数据备份和恢复 </h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>1. dump : 手动执行或者配置save </p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>SAVE # 备份 # 该命令将在 redis 安装目录中创建dump.rdb文件,将数据进行备份 BGSAVE # 后台备份 # 创建 redis 备份文件也可以使用命令 BGSAVE,该命令在后台执行。 # 如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>2. aof日志 :手动执行bgrewriteaof 或者配置 </p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p> aof默认是关闭的,需要以下配置: </p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>appendonly yes # appendfsync always appendfsync everysec # appendfsync no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb # 重启redis即可根据aof日志恢复</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2> redis分布式高可用 </h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>每个节点如下配置:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>port 7000 # 端口7000,7001,7002,与目录对应 bind 172.28.37.29 #默认ip为127.0.0.1,需要改为其他节点机器可访问的ip,否则创建集群时无法访问对应的端口,无法创建集群 daemonize yes #redis后台运行 cluster-enabled yes #开启集群 cluster-config-file nodes_7000.conf #集群的配置,配置文件首次启动自动生成 7000,7001,7002 cluster-node-timeout 8000 #请求超时,默认15秒,可自行设置 appendonly yes #开启aof持久化模式,每次写操作请求都追加到appendonly.aof文件中 appendfsync always #每次有写操作的时候都同步 logfile "/data/redis/logs/redis.log" #redis服务日志 pidfile /var/run/redis_7000.pid #pidfile文件对应7000,7001,7002</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>启动时可用脚本:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code># 启动脚本 for((i=0;i&lt;3;i++)); do /usr/local/bin/redis-server /usr/local/redis/redis-cluster/700$i/redis.conf; done</code></pre> <!-- /wp:code -->

分类:服务器搭建数据库redis
标签:集合数据类型redis数据redisredis操作数据类型

2020-04-02 04:28:46.0
Redis数据类型和常用命令操作  redis-shu-ju-lei

MinIO spring boot starter 1.2.1 自定义Clinet和缓存清理

<!-- wp:paragraph --> <p><code> minio-spring-boot-starter </code>为一个在springboot中引入即可使用的spring boot starter,提供了对minio的基本操作,进行文件的存储获取等。自1.2.1版本之后,可以很容易对其中使用的minio客户端、缓存清理服务根据需要进行自定义。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p> minio-spring-boot-starter 提供的主要功能是使用minio服务,对文件进行存储、获取、删除等,而在此过程中需要使用到MinioClient,以及对获取文件时产生的本地缓存进行清理。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如果需要自定义MinioClient,则只需要自己重新定义<code>MinioClientProvider</code>即可,如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>import com.jvm123.minio.service.client.MinioClientProvider; import io.minio.MinioClient; import io.minio.errors.InvalidEndpointException; import io.minio.errors.InvalidPortException; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @SpringBootApplication public class DemoMinioApplication { public static void main(String[] args) { SpringApplication.run(DemoMinioApplication.class, args); } @Bean MinioClientProvider minClient() { return (endpoint, accessKey, secretKey) -> { try { return new MinioClient("http://petdy.cn:9000", "admin", ""); } catch (InvalidEndpointException | InvalidPortException e) { e.printStackTrace(); return null; } }; } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>如果需要自定义清理缓存逻辑,需要重新实现接口<code>TempCleanService</code>,如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>/** * 清理缓存 * @author yawn http://jvm123.com * 2020/1/18 10:54 */ public interface TempCleanService { void cleanTemp(String tmpDir, Long tmpAliveDuration); }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>而接口中方法的参数就是配置文件中的值。</p> <!-- /wp:paragraph -->

分类:服务器搭建源码项目分享MinIO
标签:springbootMinIO文件上传文件存储starter文件服务器

2020-03-16 07:37:35.0
MinIO spring boot starter 1.2.1 自定义Clinet和缓存清理  minio-spring-boot-4

Redis内存淘汰回收策略

<!-- wp:paragraph --> <p>redis在存储KV值时,如果内存满了会怎么样?这取决与我们对于redis的<code> maxmemory-policy </code>的配置,具体配置如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>maxmemory-policy volatile-lru</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>此项配置的值有如下</p> <!-- /wp:paragraph --> <!-- wp:list --> <ul><li>noeviction:当内存使用达到阈值的时候,所有引起申请内存的命令会报错。</li><li> allkeys-lru:在主键空间中,优先移除最近未使用的key。 </li><li> volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。 </li><li> allkeys-random:在主键空间中,随机移除某个key。 </li><li> volatile-random:在设置了过期时间的键空间中,随机移除某个key。 </li><li> volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。 </li></ul> <!-- /wp:list --> <!-- wp:paragraph --> <p>redis对于这个问题的解决方法分为两种,一种是提示错误,另一种就是移除已有的键值对。根据不同的配置,移除键值对时,可以在所有键值对范围内,也可以仅在设置了过期时间的键值对范围内;移除的策略,可以是随机移除,也可使用LRU(最近最少使用)策略移除;此外,对于设置了过期时间的键值对,可以从最早过期的开始移除。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph -->

分类:服务器搭建数据库
标签:redis移除键值对LRU内存淘汰策略

2020-03-13 14:29:06.0
Redis内存淘汰回收策略  redis-nei-cun-tao

MinIO简介和java Api的使用

<!-- wp:paragraph --> <p>MinIO是一个对象存储服务,非常轻量,也提供了多种语言的api,可以非常方便使用。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>存储桶</h2> <!-- /wp:heading --> <!-- wp:image {"id":1742} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2020/02/image.png" alt="" class="wp-image-1742"/><figcaption>minio中的bucket桶</figcaption></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>MinIO将存储空间分为多个部分,称为bucket桶,文件(对象)就存储在各个bucket桶中。如上图所示。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>桶策略</h2> <!-- /wp:heading --> <!-- wp:image {"id":1743} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2020/02/image-1.png" alt="" class="wp-image-1743"/></figure> <!-- /wp:image --> <!-- wp:image {"id":1744} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2020/02/image-2.png" alt="" class="wp-image-1744"/><figcaption>桶策略</figcaption></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>这些bucket桶可以根据用户的需要进行创建和删除。此外可以对每个bucket桶设置匿名用户访问的策略,具体策略说明如下:</p> <!-- /wp:paragraph --> <!-- wp:list --> <ul><li>ReadOnly - 允许匿名下载访问包括能够列出所需前缀的对象</li><li>WriteOnly - 允许匿名上传包括能够列出所需前缀的不完整上传</li><li>读写 - 匿名访问以上载和下载所有对象</li><li>无 - 是默认值(无策略),这意味着所有操作都需要针对所需的存储桶和前缀进行身份验证 </li></ul> <!-- /wp:list --> <!-- wp:heading --> <h2>Java Api</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>依赖:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>&lt;dependency> &lt;groupId>io.minio&lt;/groupId> &lt;artifactId>minio&lt;/artifactId> &lt;version>3.0.10&lt;/version> &lt;/dependency></code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>java api 通过一个http客户端进行存储和获取对象文件,所以java代码中可以通过以下的步骤进行存储和获取:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>1 实例化一个MinioClient客户端:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>MinioClient minioClient = new MinioClient(endpoint, accessKey, secretKey);</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>2 创建存储桶bucket:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> String bucket = "demo-bucket"; boolean isExist = minioClient.bucketExists(bucket); if(isExist) { LOGGER.info("Bucket {} already exists.", bucket); } else { minioClient.makeBucket(bucket); }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>3 存储文件对象(需要指定存储的桶):</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>minioClient.putObject(bucket, destFileName, file.getAbsolutePath());</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>因为MinioClient使用http客户端,并不是长连接,所以不需要进行关闭连接和释放资源的操作。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>至此,文件已经存储完毕,可以在Minio服务器查询看到,如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1745} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2020/02/image-3-1024x440.png" alt="" class="wp-image-1745"/><figcaption>bucket中的文件</figcaption></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>4 获取对象文件如下(获取输入流InputStream):</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> public InputStream getStream(String bucket, String fileName) { InputStream is = null; try { MinioClient minioClient = ...; // 再实例化一个客户端 is = minioClient.getObject(bucket, fileName); } catch(MinioException | NoSuchAlgorithmException | IOException | XmlPullParserException | InvalidKeyException e) { LOGGER.error("error: {}", e.getMessage()); } return is; }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>如果需要获取File对象:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> public File getFile(String bucket, String fileName) { InputStream is = getStream(bucket, fileName); File dir = new File(tmpDir); if (!dir.exists() || dir.isFile()) { dir.mkdirs(); } File file = new File(tmpDir + fileName); try { FileUtils.copyToFile(is, file); } catch (IOException e) { e.printStackTrace(); } return file; }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>如果需要下载文件,可以直接将输入流写入servlet输出流即可:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">public void writeTo(String bucket, String fileName, OutputStream os) throws IOException { InputStream is = getStream(bucket, fileName); byte[] bytes = new byte[1024]; int len; while ((len = is.read(bytes)) != -1) { os.write(bytes, 0, len); } os.flush(); }</pre> <!-- /wp:preformatted -->

分类:服务器搭建javaMinIO
标签:文件上传文件存储MinIO存储桶bucket

2020-02-20 04:11:59.0
MinIO简介和java Api的使用  minio-jian-jie-java-api

分布式软件系统基础介绍

<!-- wp:heading --> <h2>分布式应用</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>多个软件应用服务协作,共同对外提供服务。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>实际开发中,这些应用一般在内网中,每个应用各司其职。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>每个应用服务可能存在多个实例。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>应用之间的调用RPC:</h3> <!-- /wp:heading --> <!-- wp:image --> <figure class="wp-block-image"><img src="https://gitee.com/yawensilence/demo-zookeeper/raw/master/distributed/dubbo-protocol.jpg" alt=""/></figure> <!-- /wp:image --> <!-- wp:heading {"level":4} --> <h4>协议</h4> <!-- /wp:heading --> <!-- wp:paragraph --> <p>1 webservice</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>基于http,使用soap协议</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>2 http</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>直接通过http调用</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>3 dubbo</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>直接使用单一tcp长连接</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":4} --> <h4>调用feign:</h4> <!-- /wp:heading --> <!-- wp:list --> <ul><li>通过调用接口中定义的方法,就可以实现RPC远程调用</li><li>可自定义翻译器、编码器、解码器、http客户端</li></ul> <!-- /wp:list --> <!-- wp:code --> <pre class="wp-block-code"><code>/** * @author yawn http://jvm123.com * 2019/12/1 11:13 */ public interface SearchClient { @RequestLine("GET /post/s/{wd}") List&lt;PostVo> search(@Param("wd") String wd); @RequestLine("POST /post/s") @Headers("Content-Type: application/json") List&lt;PostVo> search(@Param("t") String t, @Param("c") String c); }</code></pre> <!-- /wp:code --> <!-- wp:code --> <pre class="wp-block-code"><code>package com.jvm123.blog.config import com.jvm123.blog.client.FeignRequestInterceptor import com.jvm123.blog.client.HttpFeignClient import feign.Feign import feign.gson.GsonDecoder import feign.gson.GsonEncoder import org.springframework.beans.factory.annotation.Value import org.springframework.context.annotation.Bean import org.springframework.context.annotation.Configuration import com.jvm123.blog.client.SearchClient /** * * @author yawn http://jvm123.com * 2019/10/30 14:46 */ @Configuration class FeignConfig { @Value('${feign.host}') String host = "https://api.jvm123.com" @Bean SearchClient searchClient() { return Feign.builder() .encoder(new GsonEncoder()) .decoder(new GsonDecoder()) .requestInterceptor(new FeignRequestInterceptor()) .client(new HttpFeignClient()) .target(SearchClient.class, host) } } /** * 自己实现的客户端 * @author yawn http://jvm123.com * 2019/12/3 9:52 */ public class HttpFeignClient implements Client { @Override public Response execute(Request request, Request.Options options) throws IOException { CloseableHttpClient httpClient = HttpClients.createDefault(); HttpRequestBase httpRequest = new HttpRequestBase() { @Override public String getMethod() { return request.method(); } }; try { httpRequest.setURI(new URI(request.url())); } catch (URISyntaxException ignored) { } CloseableHttpResponse httpResponse = httpClient.execute(httpRequest); HttpEntity entity = httpResponse.getEntity(); byte[] body = EntityUtils.toByteArray(entity); Response response = Response.builder() .body(body) .headers(new HashMap&lt;String, Collection&lt;String>>()) .status(httpResponse.getStatusLine().getStatusCode()) .build(); return response; } }</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>应用通信:</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>消息中间件:jms规范</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>topic模式:publish/subscribe</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>queue模式:producer/consumer (send/onMessage)</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>应用管理及组件:</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>注册中心:redis、eureka、zookeeper</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>网关:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>配置中心:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>监控、日志:zipkin、logstash</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>负载均衡:客户端负载均衡ribbon(Server,IRule),服务端的nginx配置upstream</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>常用分布式服务器</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>数据库:cassandra,mysql,redis,mongodb</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>搜索服务器:elasticsearch</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>消息中间件:kafka</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>目标:</strong>高可用、没有单点故障。通常通过以下方法实现</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>多节点(nodes)</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>多节点,故障自动切换。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>节点越多,可用性越高。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>但在节点有限的情况下,可通过分片和副本技术实现。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>分片(shards)</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>存储数据时,将数据按照一定的规则存储在不同的分片上,这就需要在查询时也能很快找到该数据所在的分片。一般可使用以下方法:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">shard = hash(routing) % number_of_shards</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>routing为数据的唯一标识,一般是id。过程类似于根据key寻找hashmap节点所在的bin。</p> <!-- /wp:paragraph --> <!-- wp:image --> <figure class="wp-block-image"><img src="https://gitee.com/yawensilence/demo-zookeeper/raw/master/distributed/%E5%88%86%E7%89%87%E5%AD%98%E5%82%A8.jpg" alt=""/></figure> <!-- /wp:image --> <!-- wp:heading {"level":3} --> <h3>副本</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>将分片复制,作为副本存储,一般副本不存储在与主分片相同的节点上</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>特点总结</h3> <!-- /wp:heading --> <!-- wp:list --> <ul><li>多节点、多副本、分片存储</li><li>各分片和副本分片均匀分布在各个节点上</li><li>原数据主分片和副本分片存储在不同的节点上</li></ul> <!-- /wp:list --> <!-- wp:image --> <figure class="wp-block-image"><img src="https://gitee.com/yawensilence/demo-zookeeper/raw/master/distributed/elas-head.jpg" alt="http://jvm123.com/wp-content/uploads/2019/11/elas-head.jpg"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>分布式锁</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>主流实现方式:redis、zookeeper</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>redis: setnx key value expr 100ms</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>zookeeper:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>/** * 1.客户端连接zookeeper,并在/lock下创建临时的且有序的子节点, * 第一个客户端对应的子节点为/lock/***-lock-0000000000,第二个 * 为/lock/***-lock-0000000001,以此类推。 * 2.客户端获取/lock下的子节点列表,判断自己创建的子节点是否为 * 当前子节点列表中序号最小的子节点,如果是则认为获得锁,否则 * 监听刚好在自己之前一位的子节点删除消息,获得子节点变更通知 * 后重复此步骤直至获得锁; * 3.执行业务代码; * 4.完成业务流程后,删除对应的子节点释放锁。 * * 此锁能保证公平性,非公平锁的实现可参考: * @see ZkLock2Controller */ private void buyWithLock() throws Exception { //创建分布式锁, 锁空间的根节点路径为/lock InterProcessMutex lock = new InterProcessMutex(curator, "/lock"); lock.acquire(); //获得了锁, 进行业务流程 buy(); //完成业务流程, 释放锁 lock.release(); }</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>分布式事务</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>XA两阶段提交、事务最终一致</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>最终一致事务使用消息中间件实现:消息中间件 onMessage 确认机制,自动确认、手动确认、批量确认、单条确认</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>eg:添加用户后,需要初始化用户的积分,因为用户和积分在不同的服务中,所以需要进行分布式的事务。</p> <!-- /wp:paragraph --> <!-- wp:image --> <figure class="wp-block-image"><img src="https://gitee.com/yawensilence/demo-zookeeper/raw/master/distributed/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A11.jpg" alt=""/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>增加事件(event)表,定时处理事件,如下:</p> <!-- /wp:paragraph --> <!-- wp:image --> <figure class="wp-block-image"><img src="https://gitee.com/yawensilence/demo-zookeeper/raw/master/distributed/%E5%88%86%E5%B8%83%E5%BC%8F%E4%BA%8B%E5%8A%A12.jpg" alt=""/></figure> <!-- /wp:image -->

分类:服务器搭建分布式javaElasticsearchspringcloud消息中间件
标签:分布式feignwebservice分布式事务消息中间件ribbonrpczookeeper分布式系统soap分布式锁

2019-12-12 23:03:08.0
分布式软件系统基础介绍  fen-bu-shi-ruan

Jconsole-java监视和管理控制台的使用

<!-- wp:paragraph --> <p>Jconsole 监控java程序时,在启动java程序时,加上以下选项就可以进行远程监控:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>-Djava.rmi.server.hostname=192.168.80.123 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=fasle -Dcom.sun.management.jmxremote.authenticate=false </code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>例如使用java -jar 启动 springboot项目的jar包,可以使用如下命令:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>java -Xms512m -Xmx512m -Djava.rmi.server.hostname=192.168.80.123 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=fasle -Dcom.sun.management.jmxremote.authenticate=false -jar abc.jar</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>80.123为服务器的地址,部署了java程序。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>我们可以使用自己的电脑进行监控:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>先在cmd输入jconsole,打开jconsle工具,输入 192.168.80.123:12345 进行连接,如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1401,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/10/jconsole1.jpg" alt="" class="wp-image-1401"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>连接成功后,监控界面如下,和本地进程的监控一致。</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1402,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/10/jconsole2.jpg" alt="" class="wp-image-1402"/></figure></div> <!-- /wp:image --> <!-- wp:spacer --> <div style="height:100px" aria-hidden="true" class="wp-block-spacer"></div> <!-- /wp:spacer -->

分类:JVMspringboot服务器搭建java
标签:javajava进程JMXspringbootjava进程监控jconsole内存监控

2019-10-10 11:15:42.0
Jconsole-java监视和管理控制台的使用  jconsole-java

Docker中的mysql乱码问题解决

<!-- wp:paragraph --> <p>在使用docker的mysql时,存入的中文字符全部变成了问号,这是由于mysql服务的默认编码并不支持中文的汉字。可以在以下过程中设置mysql的编码方式:</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>windows 上 mysql 编码</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>windows上,在安装mysql时,有选择编码方式的步骤,可以直接选utf-8。如果在安装的时候没有注意这个选项,可以找到mysql的配置文件(mysql.ini或者my.ini),修改其中的的如下几句重启服务即可:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>[mysqld] character-set-server=utf8 collation-server=utf8_general_ci [client] default-character-set=utf8 [mysql] default-character-set=utf8</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>linux和docker 上 mysql 乱码</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>linux或者docker上,找到 mysql.ini或者my.ini 修改,然后重启服务肯定可以解决问题,但是,在docker中,官方镜像说明已经提供了配置编码的方法。旨在不修改原有的配置文件,如下:</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>docker容器挂载自定义的配置文件</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>使用如下的命令启动容器,并挂载配置文件:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>$ docker run --name some-mysql -v /my/custom:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>在自己的文件夹中自定义一个 mysql.cnf ,如上文所说,配置编码即可,这个配置会优先于my.ini中的配置。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>docker容器的启动参数中设置</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>使用如下命令启动容器即可设置编码参数:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci</code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3>覆盖docker容器中的配置文件设置编码</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>就是自己新建mysql.cnf文件,并写好编码的配置,将它复制到容器内部,使用如下命令:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>docker cp mysql.cnf docker-mysql:/etc/mysql/conf.d/</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>重启即可。</p> <!-- /wp:paragraph -->

分类:服务器搭建linuxdocker日常报错数据库
标签:dockercentosmysql乱码mysqldocker容器character-set-serverlinux中文乱码

2019-10-07 19:51:35.0
Docker中的mysql乱码问题解决  docker-zhong-de

Tomcat报错Invalid character found in method name. HTTP method names must be tokens 的处理

<!-- wp:paragraph --> <p>项目在启动后,无缘无故报错,大意就是说tomcat接收到了不合法的字符,在解析http请求的方法时出错了,完整报错如下:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">o.apache.coyote.http11.Http11Processor : Error parsing HTTP request header Note: further occurrences of HTTP header parsing errors will be logged at DEBUG level. java.lang.IllegalArgumentException: Invalid character found in method name. HTTP method names must be tokens at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:430) ~[tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:684) ~[tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) [tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:808) [tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498) [tomcat-embed-core-8.5.43.jar:8.5.43] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-8.5.43.jar:8.5.43] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [na:1.8.0_102] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [na:1.8.0_102] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-8.5.43.jar:8.5.43] at java.lang.Thread.run(Thread.java:745) [na:1.8.0_102]</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>处理方法:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p><strong>换端口</strong>,目前已知普通用户使用8888端口会报错,可能与常用的内网,或者某些常用软件通信有关。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>原因分析:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>既然是tomcat收到不合法的字符,所以我写了一个简单的 nio socket 服务器,想看看究竟收到了什么,nio socket 服务器代码如下,如果使用 ServerSocket 则接收不到,所以这个报错应该是出现在支持nio的tomcat服务器上。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.nio.charset.Charset; import java.util.Iterator; import java.util.Set; public class NioServer { public static void main(String[] args) throws IOException { ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); serverSocketChannel.bind(new InetSocketAddress(8888)); serverSocketChannel.configureBlocking(false); Selector selector = Selector.open(); serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { // 注册完之后Selector就可以通过select方法来等等请求, // select方法有一个long类型的参数,代表最长等待时间, // 如果在这段时间里接收到了相应操作的请求则返回可以处理 // 的请求的数量,否则在超时后返回0 // // eg: 如果没接收到请求,10000毫秒后回返回0 // int num = selector.select(10000L); int num = selector.select(); // 没有超时时间 // System.out.println("selector获取到" + num + "个channel"); if (num == 0) continue; Set&lt;SelectionKey> selectionKeys = selector.selectedKeys(); Iterator&lt;SelectionKey> iterator = selectionKeys.iterator(); while (iterator.hasNext()) { SelectionKey selectionKey = iterator.next(); iterator.remove(); boolean connectable = selectionKey.isConnectable(); boolean valid = selectionKey.isValid(); boolean acceptable = selectionKey.isAcceptable(); boolean readable = selectionKey.isReadable(); boolean writable = selectionKey.isWritable(); // System.out.println(connectable ? "connectable" : ""); // System.out.println(valid ? "valid" : ""); // System.out.println(acceptable ? "acceptable" : ""); // System.out.println(readable ? "readable" : ""); // System.out.println(writable ? "writable" : ""); if (acceptable) { System.out.println("连接成功!"); SocketChannel socketChannel = serverSocketChannel.accept(); socketChannel.configureBlocking(false); ByteBuffer byteBuffer = Charset.forName("UTF-8").encode("你已经成功连接服务器!"); socketChannel.write(byteBuffer); socketChannel.register(selector, SelectionKey.OP_READ); } if (readable) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); socketChannel.configureBlocking(false); try { ByteBuffer buffer = ByteBuffer.allocate(1024); // 写入buffer socketChannel.read(buffer); // 从buffer读取并转换为char buffer.flip(); System.out.println(Charset.defaultCharset().decode(buffer)); } catch (Exception e) { } socketChannel.register(selector, SelectionKey.OP_WRITE); } if (writable) { SocketChannel socketChannel = (SocketChannel) selectionKey.channel(); socketChannel.configureBlocking(false); try { socketChannel.write(Charset.defaultCharset().encode("server已经收到你的信息。")); System.out.println("server write"); } catch (Exception e) { } socketChannel.register(selector, SelectionKey.OP_READ); } } } } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>启动之后,每隔几秒就会收到如下字符:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1353} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/tomcat-error.jpg" alt="" class="wp-image-1353"/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>这很明显不是http请求的格式,tomcat解析当然会出错。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然后我在浏览器请求了localhost:8888/test123,则会打印处http请求的内容,如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1354} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/10/tomcat-error2-1024x441.jpg" alt="" class="wp-image-1354"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>验证:</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>之后,我将 nio server 的端口修改为8000,重启后,等待一段时间,并未收到任何信息。由此说明,在网络中,有设备在向我电脑的8888端口发送信息,而且这些信息比较短,则很可能是检测心跳的信息。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>而我把项目的端口换为8000之后,也不会出现这个错误了。</p> <!-- /wp:paragraph -->

分类:服务器搭建日常报错java开发笔记
标签:tomcat原理http请求tomcatnio socketnio

2019-10-04 17:30:12.0
Tomcat报错Invalid character found in method name. HTTP method names must be tokens 的处理  invalid-character-found

vsftpd配置禁用匿名用户并设置登陆用户

<!-- wp:paragraph --> <p>vsftpd是一个linux的ftp服务器,启动这个服务后,默认开启了匿名用户登陆,可以按照以下方式禁用匿名用户并设置登陆用户。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>vsftpd禁用匿名用户</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>修改vasftpd服务的配置文件/etc/vsftpd.conf(或/etc/vsftpd/vsftpd.conf)</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>anonymous_enable=NO</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>重启vsftpd服务即可生效:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>service vsftpd rstart </code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>vsftpd设置登陆用户</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>设置系统登陆用户可分为以下几步:</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>添加系统用户</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>useradd -s /sbin/nologin ftpadmin </code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>添加系统用户ftpadmin,<code>-s /sbin/nologin</code>表示此用户不允许系统登陆,只能用作类似于vsftpd的服务登陆。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>设置用户密码</h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>passwd ftpadmin</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>输入以上命令后回车,就会提示修改此用户的密码,输入两次密码即可。期间会提示密码太简单不安全等,忽略就行了。最终后出现密码成功更新。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>ftp访问</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>可以在windows文件系统或者浏览器访问 ftp://192.168.xx.xx,验证时否可以登陆。如果关闭了匿名用户登陆功能,访问时就会弹出用户名和密码的输入框,输入后就可以访问了。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>但是,此时访问的是此系统用户的主目录,即 /home/ftpadmin 目录,由于之前项目的ftp文件夹并不在这里,所以可使用以下方法设置访问。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>设置ftp用户的访问目录</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>原项目名称为cba,其ftp文件夹为 /var/ftp/cba,现在需要让 ftpadmin 用户也能访问这个目录。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>可以在 /home/ftpadmin 下新建一个文件夹 cba,将 /var/ftp/cba 挂载到这个 cba文件夹就可以访问了。</strong></p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>mkdir cba mount --bind /var/ftp/cba cba</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>之前我也尝试过使用软链接的方式,但是ftp访问到的只是一个类似快捷方式图标的文件,并不能跳转到目标。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>另外看过一些技术文章介绍的 ,大都是配置 local_root ,但是我这里,对于系统用户,配置 local_root=/var/ftp后,并不会生效,还不知道是什么原因,所以目前就先使用mount挂载的方式。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph -->

分类:服务器搭建linux开发笔记
标签:服务器文件上传ftp匿名登陆linuxftpcentosvsftpd

2019-09-29 15:53:10.0
vsftpd配置禁用匿名用户并设置登陆用户  vsftpd-pei-zhi-jin

Springboot 上传文件系统找不到指定的路径

<!-- wp:heading --> <h2>上传报错信息</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>Springboot 上传文件报错,在使用 MultipartFile 的 transferTo 方法时报错,代码如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> public String tmpMdbFile(MultipartFile file) { File dest = new File(TMP_DIR + System.currentTimeMillis() + "_" + file.getOriginalFilename()); try { file.transferTo(dest); } catch (IOException e) { e.printStackTrace(); } return dest.getAbsolutePath(); }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>报错信息如下:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>java.io.IOException: java.io.FileNotFoundException: C:\Users\yawn\AppData\Local\Temp\tomcat.5222418755956874474.8095\work\Tomcat\localhost\ROOT\tmp\xxx (No such file or directory) 或</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>java.io.IOException: java.io.FileNotFoundException: C:\Users\yawn\AppData\Local\Temp\tomcat.5222418755956874474.8095\work\Tomcat\localhost\ROOT\tmp\xxx (系统找不到指定的路径。) </p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>解决方法</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>原因是我们使用了相对路径,MultipartFile 在使用transferTo的路径就会出现问题。解决办法如下:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>1 解决这个问题可以使用绝对路径。即代码中的常量 TMP_DIR 设置为绝对路经。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>2 或者不使用transferTo方法,而从multipartFile的输入流读取文件内容。代码如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> public String tmpMdbFile(InputStream is, String fileName) { File dest = new File(TMP_DIR + System.currentTimeMillis() + "_" + fileName); saveFile(is, dest); return dest.getAbsolutePath(); } private void saveFile(InputStream is, File dest) { try(FileOutputStream fos = new FileOutputStream(dest)) { int len; byte[] buffer = new byte[1024]; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); } } catch (IOException e) { e.printStackTrace(); } }</code></pre> <!-- /wp:code -->

分类:服务器搭建开发笔记javaspringbootspring日常报错
标签:springbootMultipartFilespring日常报错文件上传

2019-09-18 11:05:34.0
Springboot 上传文件系统找不到指定的路径  springboot-shang

MYSQL 的 case when ... then ... else ... end 语句

<!-- wp:heading --> <h2><strong>格式</strong>: </h2> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>case when 条件1 then 值1 when 条件2 then 值2 else 值3 end</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p><strong>说明</strong>: 当“条件”成立时,语句等同于值1,否则值3</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>Mysql的case when语句举例1 </h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p> 当user表的loked字段为1时设置为0,当其为0时设置为1 </p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> update user set locked=(case when locked=1 then 0 else 1 end) where id=1;</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>Mysql的case when语句举例2</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>查询用户是否锁定的状态</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>select username, case when LOCKED=1 then '已锁定' when LOCKED=0 or LOCKED is null then '未锁定' else '未知' end from user limit 10</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>结果如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":1015} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/09/case-when.jpg" alt="" class="wp-image-1015"/></figure> <!-- /wp:image -->

分类:JVM开发笔记服务器搭建数据库
标签:数据库case语句mysqlcase whensql语句sql

2019-09-11 15:49:06.0
MYSQL 的 case when ... then ... else ... end 语句  mysql-de-case-when

docker nginx 配置ssl,实现https

<!-- wp:heading --> <h2>nginx配置https总览</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在nginx配置ssl实现https,简单来说分为三个步骤:</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>1 上传ssl证书等文件</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>将 1_www.domain.com_bundle.crt 和 2_www.domain.com.key 上传到nginx配置文件的目录旁边。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>这两个文件分别为 证书文件和密钥文件 。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>2 配置server节点监听443端口</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>进行以下配置</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>server { listen 443; #SSL 访问端口号为 443 server_name www.domain.com; #填写绑定证书的域名 ssl on; #启用 SSL 功能 ssl_certificate 1_www.domain.com_bundle.crt; #证书文件名称 ssl_certificate_key 2_www.domain.com.key; #私钥文件名称 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #请按照这个套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_prefer_server_ciphers on; location / { root /var/www/www.domain.com; #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。 index index.html index.htm; } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>或较高版本的nginx可如下配置:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>server { listen 443 ssl; #SSL 访问端口号为 443 并启用 SSL 功能 server_name www.domain.com; #填写绑定证书的域名 ssl_certificate 1_www.domain.com_bundle.crt; #证书文件名称 ssl_certificate_key 2_www.domain.com.key; #私钥文件名称 ssl_session_timeout 5m; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #请按照这个协议配置 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE; #请按照这个套件配置,配置加密套件,写法遵循 openssl 标准。 ssl_prefer_server_ciphers on; location / { root /var/www/www.domain.com; #网站主页路径。此路径仅供参考,具体请您按照实际目录操作。 index index.html index.htm; } }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p><strong>注意:</strong></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>这里要确保两个文件的位置是相对与nginx.conf配置文件的位置。如果在nginx.conf 文件中使用了incude,而这个server节点配置在其他文件中,则路径还是相对于nginx.conf文件的位置。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>3 修改80端口的配置</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>修改80端口的配置可以让http的url转发到https的url。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>server { listen 80; server_name www.domain.com; #填写绑定证书的域名 rewrite ^(.*)$ https://$host$1 permanent; #把http的域名请求转成https }</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>常见文件位置问题</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p> 证书文件和密钥文件的位置是相对与nginx.conf配置文件的位置。如果在nginx.conf 文件中使用了incude,而这个server节点配置在其他文件中,则路径还是相对于nginx.conf文件的位置。 如下图:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":986,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/ssl.jpg" alt="" class="wp-image-986"/></figure></div> <!-- /wp:image --> <!-- wp:heading --> <h2>docker中ssl文件的位置</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>docker 中,nginx容器如果没有挂载ssl文件所在的目录,则需要手动将这两个文件复制在容器内部的nginx.conf文件旁边。如下图:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":987,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/ssl2-1024x419.jpg" alt="" class="wp-image-987"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>复制可使用 <code>docker cp</code> 命令。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>验证ssl配置的正确性</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在sbin目录下,执行 <code>nginx -t</code></p> <!-- /wp:paragraph --> <!-- wp:image {"id":988,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/ssl3.jpg" alt="" class="wp-image-988"/></figure></div> <!-- /wp:image --> <!-- wp:heading --> <h2>开放https 443端口</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在主机的防火墙需要开放443端口,此外,如果还配置了云服务其的安全组,也需要开放443端口。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>在docker容器中,需要重新运行nginx,并添加443端口的端口映射。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>这些都配置完成之后,就可以访问了,效果示例地址: <a href="https://api.jvm123.com/index.html#" target="_blank" rel="noreferrer noopener" aria-label="(在新窗口打开)">https://api.jvm123.com/index.html</a></p> <!-- /wp:paragraph -->

分类:服务器搭建dockerlinux
标签:docker networklinuxssldockernginxdocker网络https

2019-09-05 16:06:35.0
docker nginx 配置ssl,实现https  docker-nginx-pei

java socket通信与tomcat原理

<!-- wp:heading --> <h2>1 socket网络通信基础</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>客户端使用主机地址和端口实例化一个socket,此socket通过输出流将字符串等传向服务器主机。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>服务器使用端口号实例化一个serverSocket,调用accept()方法监听此端口,等待客户端的连接。一旦连接成功,就可以获取到输入流,将客户端通过网络发送的字符串读取到;也可以获取输出流,将自己的反馈信息发给客户端(客户端获取输入流就可以读到反馈信息)。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>ServerSocket serverSocket = new ServerSocket("8080",1,"客户机1"); Socket socket = serverSocket.accept(); input = socket.getInputStream(); // 处理 // ... output = socket.getOutputStream();</code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>2 Http服务器的原理(tomcat)</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>http服务器就是通过以上介绍的原理来接收HTTP请求的,只是它接收到的是完全按照http协议格式的请求字符串。在服务器被连接(accept())后,就可以获得输入流和输出流,使用它们可以实例化一个请求和一个响应对象。</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>ServerSocket serverSocket = new ServerSocket("8080",1,"客户机1"); Socket socket = serverSocket.accept(); input = socket.getInputStream(); Request request = new Request(input); service(request,response); output = socket.getOutputStream(); Response response = new Response(output); </code></pre> <!-- /wp:code --> <!-- wp:heading --> <h2>3 Request类</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>Request类要做的事情就是从输入流中接收字符串,并将一个完全符合http协议的请求字符串分解为一个Request对象。</p> <!-- /wp:paragraph --> <!-- wp:image {"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="https://static.oschina.net/uploads/img/201703/07093450_hkYa.jpg" alt=""/><figcaption>http 请求</figcaption></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>根据上图,使用indexOf()以及subString()等方法就可以将字符串分解,并将各部分的值封装在Request对象中。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>4 Response类</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>Response类需要将响应的字符串按照http响应的格式写到输出流中去。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>5 连接器</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在tomcat中,最主要的是连接器和容器,而连接器就是用来监听客户端的连接,并完成连接的。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>HttpConnector &nbsp;等待 HTTP 请求并建立连接</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>HttpProcessor 创建请求和响应对象,详细解析请求,并填充httpRequest</p> <!-- /wp:paragraph --> <!-- wp:image {"id":967,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/tomcat-connector.png" alt="" class="wp-image-967"/><figcaption>tomcat 连接器</figcaption></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p> 连接器的工作就是连接请求、创建request和response、调用container的invoke()方法,并把request和response传给invoke()。</p> <!-- /wp:paragraph -->

分类:服务器搭建javajava源码
标签:服务器连接器tomcat原理java sockettomcatsocket通信

2019-09-04 00:16:09.0
java socket通信与tomcat原理  java-socket-tong

windows端口占用、查看端口、结束进程

<!-- wp:paragraph --> <p>在日常开发过程中,我们常常遇到端口占用的问题,如果使用的是windows开发,则可以按照以下方法解决:</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>windows查看某个端口是否被占用</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>windows 查看某个端口是否被占用,可使用以下命令:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>netstat -ano | findstr 8080</code></pre> <!-- /wp:code --> <!-- wp:image {"id":957,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/win-port.jpg" alt="" class="wp-image-957"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>如上图可以看到PID为17964的进程占用了监听者8080端口,所以只需要结束这个进程即可。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>windows结束进程</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>windows结束进程有两种方法:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p><strong>1 使用命令行:</strong></p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>taskkill /pid 17964 /f</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>强制结束17964进程,如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":959,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/win-port3.jpg" alt="" class="wp-image-959"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p><strong>2 使用任务管理器</strong></p> <!-- /wp:paragraph --> <!-- wp:image {"id":958,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/09/win-port2.jpg" alt="" class="wp-image-958"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>在任务管理器,打开“ 详细信息 ”,点击“PID”就可以按照进程号排序,然后很容易找到17964进程,右键结束运行即可。</p> <!-- /wp:paragraph -->

分类:未分类服务器搭建开发笔记
标签:端口查看端口netstatwindows结束进程端口占用pid

2019-09-02 16:33:56.0
windows端口占用、查看端口、结束进程  windows-duan-kou

nginx 配置负载均衡

<!-- wp:paragraph --> <p>windows下载nginx解压后如下:</p> <!-- /wp:paragraph --> <!-- wp:image --> <figure class="wp-block-image"><img src="https://static.oschina.net/uploads/space/2017/1019/170307_Ixwd_2342105.png" alt=""/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>配置文件为conf目录下的nginx.conf</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>在http节点下加入upstream如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> upstream tomcats { server 127.0.0.1:8081; server 127.0.0.1:8082; #server 127.0.0.1:8082 weight=2 fail_timeout=20s; #server 127.0.0.1:8081 weight=1 fail_timeout=20s; #ip_hash; }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>&nbsp; &nbsp; 在server节点下修改location如下,加入proxy_pass :</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code> location / { root html; index index.html index.htm; proxy_pass http://tomcats; #这里和upstream的名称相同 }</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>启动(重启)nginx.exe,并请求server节点配置的server_name和端口port就可以将请求轮流发到8081和8082去处理。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>其中nginx的启动停止可以使用一下cmd命令:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>    nginx.exe -s stop     nginx.exe -s reload #重新加载配置文件     nginx.exe #启动</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>在linux中使用nginx:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>&nbsp; &nbsp; 安装:sudo apt-get install nginx</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>&nbsp; &nbsp; 启动: sudo nginx (如果由于log文件权限问题启动失败,则可以在对应log目录下执行sudo chmod 777 xxx.log修改文件的权限)</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>配置负载均衡与windows差不多,在/etc/nginx目录下有配置文件nginx.conf,里面默认使用include导入了conf.d/文件夹下的所有*.conf文件,所以就可以将server节点以及upstream节点需要配置的东西分别在conf.d/目录下建立配置文件写入。若有权限问题,可以使用chmod修改权限。</p> <!-- /wp:paragraph -->

分类:服务器搭建linux
标签:linuxwindowsnginx负载均衡

2019-08-21 20:19:26.0
nginx 配置负载均衡  nginx-pei-zhi-fu

mysql查询过程和执行计划

<!-- wp:heading --> <h2 id="h3_2">MySQL 连接状态</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3><strong>1 查看所有客户端的连接状态</strong></h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>show processlist;</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>输出结果:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">+----+------+-----------------+-------+---------+------+----------+------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+------+-----------------+-------+---------+------+----------+------------------+ | 9 | root | localhost:49386 | NULL | Sleep | 37 | | NULL | | 10 | root | localhost:49391 | test | Sleep | 22 | | NULL | | 11 | root | localhost:49396 | test | Sleep | 31 | | NULL | | 12 | root | localhost:49401 | sonar | Sleep | 28 | | NULL | | 13 | root | localhost:49414 | test | Sleep | 21 | | NULL | | 14 | root | localhost:49432 | test | Query | 0 | starting | show processlist | +----+------+-----------------+-------+---------+------+----------+------------------+</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3><strong>2 断开客户端连接</strong></h3> <!-- /wp:heading --> <!-- wp:code --> <pre class="wp-block-code"><code>kill 12; -- 12为连接的id </code></pre> <!-- /wp:code --> <!-- wp:heading {"level":3} --> <h3><strong>3 连接线程的command</strong></h3> <!-- /wp:heading --> <!-- wp:quote --> <blockquote class="wp-block-quote"><p><strong>Sleep 等待刻划断的查询</strong></p><p><strong>Query 正在执行查询</strong></p><p><strong>Locked 等待表锁的释放</strong></p><p><strong>Sorting result 正在对结果排序</strong></p><p><strong>Sending data 正在发挥数据</strong></p></blockquote> <!-- /wp:quote --> <!-- wp:heading --> <h2 id="h3_3">MySQL的查询过程</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3><strong>1 mysql的架构图:</strong></h3> <!-- /wp:heading --> <!-- wp:image {"align":"center","width":660,"height":381} --> <div class="wp-block-image"><figure class="aligncenter is-resized"><img src="https://oscimg.oschina.net/oscnet/bff1a470c6e274ad2ede555e84d77bdb2be.jpg" alt="mysql的架构图" width="660" height="381"/></figure></div> <!-- /wp:image --> <!-- wp:heading {"level":3} --> <h3><strong>2 mysql的查询流程图</strong></h3> <!-- /wp:heading --> <!-- wp:image {"id":798,"align":"center","width":500,"height":512} --> <div class="wp-block-image"><figure class="aligncenter is-resized"><img src="http://jvm123.com/wp-content/uploads/2019/08/mysql-process-999x1024.jpg" alt="" class="wp-image-798" width="500" height="512"/></figure></div> <!-- /wp:image --> <!-- wp:heading {"level":3} --> <h3><strong>3 mysql的查询流程</strong></h3> <!-- /wp:heading --> <!-- wp:quote --> <blockquote class="wp-block-quote"><p><strong>1 接收查询sql</strong></p><p><strong>2 查询缓存,如果未命中,则会继续进行下一步</strong></p><p><strong>3 解析器(parser)解析sql语句,生成解析树</strong></p><p><strong>4 预处理器进行预处理,检查数据表和数据列是否存在,解析名字和别名等</strong></p><p><strong>5 查询优化器()进行优化处理,生成最优的执行计划</strong></p><p><strong>6 调用存储引擎进行查询</strong></p><p><strong>7 返回结果(生成第一条查询结果时就开始逐步返回,所以服务器不需要暂存结果)</strong></p></blockquote> <!-- /wp:quote --> <!-- wp:heading --> <h2 id="h3_4">mysql缓存</h2> <!-- /wp:heading --> <!-- wp:list {"ordered":true} --> <ol><li><strong>开启缓存 my.ini 文件中修改:</strong><ul><li><code>query_cache_type=ON </code></li><li><code>query_cache_size=1024 </code></li></ul></li><li><strong>由于mysql的缓存时基于表的,所以表中的数据有任何更新,就会使缓存失效</strong></li></ol> <!-- /wp:list --> <!-- wp:heading --> <h2 id="h3_5">mysql执行计划的type(访问类型)</h2> <!-- /wp:heading --> <!-- wp:quote --> <blockquote class="wp-block-quote"><p><strong>system:</strong></p><p><strong>const:根据主键活唯一索引查询到一条数据</strong></p><p><strong>eq_ref:根据唯一索引访问</strong></p><p><strong>ref:根据非唯一索引访问</strong></p><p><strong>range:根据索引访问一定的范围</strong></p><p><strong>index:根据索引访问全表</strong></p><p><strong>ALL:无索引访问全表</strong></p></blockquote> <!-- /wp:quote --> <!-- wp:heading --> <h2 id="h3_6">mysql慢查询日志</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>开启:修改my.ini中的以下配置</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>slow_query_log=ON long_query_time=0.1 log_queries_not_using_index=ON </code></pre> <!-- /wp:code -->

分类:服务器搭建数据库
标签:mysqlmysql执行计划执行计划mysql慢查询mysql缓存

2019-08-20 00:03:04.0
mysql查询过程和执行计划  mysql-cha-xun

Mysql 的 bit 类型与二进制的应用

<!-- wp:heading --> <h2>bit类型</h2> <!-- /wp:heading --> <!-- wp:quote --> <blockquote class="wp-block-quote"><p>首先,bit 类型不是对应true和false,也不是只有一位,而是0和1组成的串,即存储二进制的序列</p></blockquote> <!-- /wp:quote --> <!-- wp:heading --> <h2>示例</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3>1 新建数据表test </h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">CREATE TABLE `test` ( `id` int(20) NOT NULL, `codes` bit(8) NOT NULL, `remark` varchar(32) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; // 其中 codes 字段为8位的bit类型</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>2 插入数据 </h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">delete from test; insert into test(id, codes, remark) values (1, 1, 'number 1'), (2, 2, 'number 2'), (3, '1', 'string 1'), (4, 'a', 'string a'), (5, true, 'boolean true'), (6, false, 'boolean false'); // 给 codes 字段查入不同类型的值:数字、字符、布尔</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>3 存储结果如下</h3> <!-- /wp:heading --> <!-- wp:image {"id":282,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://www.jvm123.com/wp-content/uploads/2019/07/mysql-bit.jpg" alt="" class="wp-image-282"/></figure></div> <!-- /wp:image --> <!-- wp:heading --> <h2>结论</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>通过上述示例,我们可以得到以下结论:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>在bit类型的字段中,插入数据时:</p> <!-- /wp:paragraph --> <!-- wp:list --> <ul><li>数字被转换成二进制;</li><li>字符将被转换成二进制的ascii码;</li><li>boolean 类型被转换成0或1 。</li></ul> <!-- /wp:list --> <!-- wp:heading --> <h2>应用</h2> <!-- /wp:heading --> <!-- wp:heading {"level":3} --> <h3>1 用来表示多选字段</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>某题目有以下多选项:苹果(1),梨(2),西瓜(4),香蕉(8),可以选中其中任意几项,并使用一个字段保存。我们可以使用一个bit类型的字段将多选项存在数据库中,如下:</p> <!-- /wp:paragraph --> <!-- wp:list {"ordered":true} --> <ol><li>分别使用数字表示选项代码:苹果(1),梨(2),西瓜(4),香蕉(8);</li><li>转换成二进制为:苹果(0001),梨(0010),西瓜(0100),香蕉(1000);</li><li>将选中的数字相加(或进行位或运算),在数据库中存成bit字段即可;</li><li>读取结果时,将保存的字段与选项的代码进行位与运算即可;</li><li>其实就是规定了长度位4的bit类型,每一位表示一个选项,若选中位1,未选中为0,表示非常直观。</li></ol> <!-- /wp:list --> <!-- wp:heading {"level":3} --> <h3>2 Linux中的权限表示</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在Linux中,权限的表示也使用了这种方式:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>linux的权限rwx表示可读、可写、可执行,三种权限有8种组合方式,熟悉二进制的人常常使用0~7表示权限的组合:</p> <!-- /wp:paragraph --> <!-- wp:table --> <table class="wp-block-table"><tbody><tr><td>标志</td><td>名称</td><td>十进制</td><td>二进制</td></tr><tr><td>r</td><td> 可读 </td><td>4</td><td>100</td></tr><tr><td>w</td><td> 可写 </td><td>2</td><td>010</td></tr><tr><td>x</td><td> 可执行 </td><td>1</td><td>001</td></tr></tbody></table> <!-- /wp:table --> <!-- wp:paragraph --> <p>例如: <code>chmod 777 start.sh</code> 表示给所有用户对文件 start.sh 添加了rwx的权限。</p> <!-- /wp:paragraph -->

分类:服务器搭建数据库开发笔记
标签:数据库二进制服务器多选mysqlbit类型

2019-07-30 13:52:52.0
Mysql 的 bit 类型与二进制的应用  mysql-bit

常用ping服务列表

<!-- wp:paragraph --> <p>ping是基于XML_RPC标准协议的更新通告服务,是用于blog在内容更新时通知博客搜索引擎及时进行抓取、更新的方式。博客搜索引擎在成功接受到ping以后,会立刻进行抓取并更新。使用ping服务,可以让博客搜索引擎在第一时间抓取到您博客上的新内容。 </p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p> 以下是收集的ping服务的列表:</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">http://ping.baidu.com/ping/RPC2  http://blogsearch.google.com/ping/RPC2  http://ping.feedburner.com/  http://rpc.technorati.com/rpc/ping  http://www.feedsky.com/api/RPC2  http://api.my.yahoo.com/RPC2  http://www.xianguo.com/xmlrpc/ping.php  http://rpc.pingomatic.com  http://www.blogpeople.net/servlet/weblogUpdates  http://ping.myblog.jp  http://ping.bloggers.jp/rpc/  http://bblog.com/ping.php  http://api.moreover.com/RPC2  http://xping.pubsub.com/ping/  http://ping.feedburner.com  http://ping.syndic8.com/xmlrpc.php  http://ping.weblogalot.com/rpc.php  http://rpc.weblogs.com/RPC2  http://topicexchange.com/RPC2  http://www.wasalive.com/ping/  http://rpc.pingomatic.com/  http://api.feedster.com/ping  http://api.moreover.com/ping  http://api.my.yahoo.com/rss/ping  http://ping.amagle.com/  http://ping.bitacoras.com  http://ping.blo.gs/  http://ping.rootblog.com/rpc.php  http://rcs.datashed.net/RPC2/  http://rpc.blogbuzzmachine.com/RPC2  http://rpc.blogrolling.com/pinger/  http://rpc.icerocket.com:10080/  http://rpc.newsgator.com/  http://www.blogdigger.com/RPC2  http://www.blogoole.com/ping/  http://www.blogoon.net/ping/  http://www.blogsnow.com/ping  http://www.blogstreet.com/xrbin/xmlrpc.cgi  http://www.lasermemory.com/lsrpc/  http://www.newsisfree.com/RPCCloud  http://www.popdex.com/addsite.php  http://www.snipsnap.org/RPC2  http://www.weblogues.com/RPC/  http://www.pingoat.com/  http://rpc.weblogs.com/pingSiteForm  http://bitacoras.net/ping/  http://blog.goo.ne.jp/XMLRPC  http://pingomatic.com/  http://www.feedping.com  http://www.rssping.com/  http://fgiasson.com/pings/ping.php  http://blogdb.jp/xmlrpc  http://bulkfeeds.net/rpc  http://coreblog.org/ping/  http://ping.cocolog-nifty.com/xmlrpc  http://ping.weblogs.se/  http://rcs.datashed.net/RPC2  http://www.a2b.cc/setloc/bp.a2b  http://www.bitacoles.net/ping.php  http://xmlrpc.blogg.de/  http://rpc.feedsky.com/ping  http://blogmatcher.com/u.php  http://trackback.bakeinu.jp/bakeping.php  http://ping.blogmura.jp/rpc/  http://xmlrpc.blogg.de  http://1470.net/api/ping  http://rpc.pingomatic.com/  http://rpc.blogrolling.com/pinger/  http://www.blogdigger.com/RPC2  http://www.bitacoles.net/ping.php  http://rpc.wpkeys.com  http://rpc.technorati.com/rpc/ping  http://rpc.britblog.com  http://pingoat.com/goat/RPC2  http://bulkfeeds.net/rpc  http://rpc.weblogs.com/RPC2  http://api.my.yahoo.com/RPC2  http://services.newsgator.com/ngws/xmlrpcping.aspx  http://api.moreover.com/ping  http://api.moreover.com/RPC2  http://www.blogpeople.net/servlet/weblogUpdates  http://ping.fakapster.com/rpc  http://www.blogoon.net/ping/  http://ping.bloggers.jp/rpc/  http://bblog.com/ping.php  http://rpc.tailrank.com/feedburner/RPC2  http://ping.bitacoras.com  http://ping.feedburner.com  http://ping.myblog.jp  http://ping.syndic8.com/xmlrpc.php  http://ping.weblogalot.com/rpc.php  http://pinger.blogflux.com/rpc  http://blogsearch.google.com/ping/RPC2  http://blog.goo.ne.jp/XMLRPC  http://rpc.icerocket.com:10080  http://rpc.pingomatic.com  http://api.feedster.com/ping.php  http://1470.net/api/ping  http://www.a2b.cc/setloc/bp.a2b  http://api.feedster.com/ping  http://api.my.yahoo.com/rss/ping  http://bitacoras.net/ping  http://blogdb.jp/xmlrpc  http://blogmatcher.com/u.php  http://www.blogoole.com/ping/  http://www.blogroots.com/tb_populi.blog?id=1  http://www.blogshares.com/rpc.php  http://www.blogsnow.com/ping  http://www.blogstreet.com/xrbin/xmlrpc.cgi  http://coreblog.org/ping/  http://www.lasermemory.com/lsrpc/  http://mod-pubsub.org/kn_apps/blogchatt  http://www.mod-pubsub.org/kn_apps/blogchatter/ping.php  http://www.newsisfree.com/xmlrpctest.php  http://ping.amagle.com/  http://ping.blo.gs/  http://ping.blogmura.jp/rpc/  http://ping.cocolog-nifty.com/xmlrpc  http://ping.exblog.jp/xmlrpc  http://ping.rootblog.com/rpc.php  http://ping.weblogs.se/  http://www.popdex.com/addsite.php  http://rcs.datashed.net/RPC2/  http://rpc.blogbuzzmachine.com/RPC2  http://rpc.icerocket.com:10080/  http://www.snipsnap.org/RPC2  http://trackback.bakeinu.jp/bakeping.php  http://topicexchange.com/RPC2  http://www.weblogues.com/RPC/  http://xping.pubsub.com/ping/  http://xmlrpc.blogg.de/  http://rpc.newsgator.com/  http://www.newsisfree.com/RPCCloud  http://xmlrpc.blogg.de  http://rpc.twingly.com/  http://api.feedster.com/ping.php  http://www.syndic8.com/xmlrpc.php </pre> <!-- /wp:preformatted -->

分类:未分类服务器搭建
标签:

2019-07-30 10:18:11.0
常用ping服务列表  ping-list

服务器数据库被攻击记录

<!-- wp:heading --> <h2>数据库服务被攻</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在本网站还未正式备案上线之前,有一次访问特别慢,后来直接提示数据库连接失败。检查服务器发现,数据库已经停止运行了,于是重启了数据库。当时天真,觉得没有人会盯上一个还未出生的网站。第二天数据库再次停止,这次我没有急着恢复服务,而是先查看了数据库的日志(docker logs xxx)。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如下:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":146} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/07/server-mysql-log-1024x212.jpg" alt="jvm123" class="wp-image-146"/></figure> <!-- /wp:image --> <!-- wp:image {"id":147} --> <figure class="wp-block-image"><img src="http://www.jvm123.com/wp-content/uploads/2019/07/server-mysql-log2-1024x278.jpg" alt="jvm123" class="wp-image-147"/></figure> <!-- /wp:image --> <!-- wp:image {"id":149} --> <figure class="wp-block-image"><img src="http://www.jvm123.com/wp-content/uploads/2019/07/server-mysql-log4-1024x591.jpg" alt="jvm123" class="wp-image-149"/></figure> <!-- /wp:image --> <!-- wp:image {"id":148} --> <figure class="wp-block-image"><img src="http://www.jvm123.com/wp-content/uploads/2019/07/server-mysql-log3-1024x433.jpg" alt="jvm123" class="wp-image-148"/></figure> <!-- /wp:image --> <!-- wp:heading --> <h2>分析原因</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>一看一大跳,这就是DDOS攻击。DOS(deny offer service)就是通过不断访问服务器,使得服务器不堪重负,最终不能正常提供服务或者<strong>拒绝提供服务</strong>。 这些ip分布于德国、美国、河南、云南、浙江等地 ,即分布式的DOS攻击。甚至这些主机所有者很可能不知道自己的主机已经沦为黑客的工具。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>解决方法</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>而这个问题通过关闭公网的端口就可以解决,由于我的数据库服务是使用docker部署的,所以关闭端口后,需要通过内网来提供服务,详见:<a href="/2019/07/docker-network/">使用docker network 组建docker容器之间的网络</a>。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>又一个DDOS实例</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>此外,我又想起曾经使用redis的端口也没有关闭,所以就看了一眼数据,果然有被别人使用过的痕迹。</p> <!-- /wp:paragraph --> <!-- wp:image {"id":153} --> <figure class="wp-block-image"><img src="http://www.jvm123.com/wp-content/uploads/2019/07/server-redis.jpg" alt="" class="wp-image-153"/></figure> <!-- /wp:image --> <!-- wp:image {"id":154} --> <figure class="wp-block-image"><img src="http://jvm123.com/wp-content/uploads/2019/07/server-redis2.jpg" alt="" class="wp-image-154"/></figure> <!-- /wp:image --> <!-- wp:paragraph --> <p>不但清空了我的数据,还被写入了两条linux命令。就是定时使用curl或wget下载一段脚本并执行。细思极恐,如果这两条命令执行成功,我的主机就很可能被用作进行分布式拒绝服务(DDOS)的工具,甚至被用作挖矿。所以我马上关闭了端口,并把redis服务加入docker局域网中使用。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>为了确认,我在服务器ping了这个下载脚本的主机,发现这个俄罗斯域名并不能被正常解析,忽然觉得自己也并不需要很排斥大局域网,起码这次保护了我的主机。</p> <!-- /wp:paragraph -->

分类:服务器搭建docker
标签:dockerDOS服务器DDOS端口

2019-07-27 14:34:11.0
服务器数据库被攻击记录  db-attack

docker 迁移(容器和镜像导入、导出)

<!-- wp:heading --> <h2>docker容器的迁移</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>运行一段时间后的容器,其中包含了新的内容,如果想把这些内容数据一并迁移到新的主机上,可以按照以下步骤进行(以迁移wordpress为例):</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>1. 提交容器快照生成新的镜像 wordpress-backup<br><code> docker commit -p docker-wordpress wordpress-backup</code></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>2. 将镜像保存成一个tar压缩包<br><code> docker save -o wordpress-backup.tar wordpress-backup</code></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>3.将tar压缩包复制到另一台主机<br> <code>spc wordpress-backup.tar root@49.xxx.xxx.xx:/root/docker/</code></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>4.在另一台主机上加载镜像的tar压缩包<br> <code>docker load -i wordpress-backup.tar</code></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>5.使用这个加载的镜像运行容器<br> <code>docker run -d -p 80:80 wordpress-backup</code></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如果有docker仓库的权限,则可以直接将第1步生成的快照镜像push到docker仓库,然后在另一台主机上pull镜像并运行为容器即可。</p> <!-- /wp:paragraph -->

分类:服务器搭建docker
标签:docker镜像导出迁移容器导出

2019-07-27 13:37:56.0
docker 迁移(容器和镜像导入、导出)  docker-export

linux远程登陆和上传文件(putty、pscp)

<!-- wp:paragraph --> <p>在windows主机上远程登陆linux和上传文件,使用putty和pscp则非常方便,这两个工具小巧易用。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>工具下载</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>官方地址: https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html </p> <!-- /wp:paragraph --> <!-- wp:image {"id":596,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/08/putty3.jpg" alt="" class="wp-image-596"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>直接点击就可以下载 putty.exe 和 pscp.exe 文件。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>下载后无须安装,可以直接使用。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>远程登陆(putty)</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>putty可以用来通过ssh登陆linux的工具,直接双击,就会出现以下界面:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":597,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/08/putty.jpg" alt="" class="wp-image-597"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>填写主机地址和session名称(自定义),点击“open”就可以进行登陆</p> <!-- /wp:paragraph --> <!-- wp:image {"id":598,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/08/putty2.jpg" alt="" class="wp-image-598"/></figure></div> <!-- /wp:image --> <!-- wp:paragraph --> <p>再输入用户名和密码,就可以登陆linux主机,进行操作了。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">注:主机地址可以填写ip,也可以填写域名。</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>上传文件 (pscp)</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>pscp是一个用于linux和windows之间复制文件的工具。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>如果下载了pscp.exe,则可以通过windows的cmd命令行窗口上传下载文件。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>使用 pscp命令 的时候,需要将cmd命令行的路径切换到pscp.exe所在的路径(如果把这个路径配置到环境变量中,则没必要切换路径)。具体命令使用格式如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>pscp &lt;源文件> &lt;目标目录> // 类似于 copy 命令</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>写linux系统的路径的时候,一般格式如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>&lt;用户名>@&lt;主机名或ip>:&lt;路径></code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>所以上传和下载文件的命令可以写成:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>// 上传文件 pscp abc.txt root@192.168.50.234:/root/uploaded/ // 下载文件 pscp root@192.168.50.234:/root/uploaded/abc.zip . // "." 代表当前目录</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p><strong>注意</strong>:</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>在powershell窗口,写pscp则不会生效,需要以下格式:</p> <!-- /wp:paragraph --> <!-- wp:image {"id":602,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/08/pscp-cmd-1.jpg" alt="" class="wp-image-602"/></figure></div> <!-- /wp:image --> <!-- wp:image {"id":600,"align":"center"} --> <div class="wp-block-image"><figure class="aligncenter"><img src="http://jvm123.com/wp-content/uploads/2019/08/pscp-ps-1024x403.jpg" alt="" class="wp-image-600"/></figure></div> <!-- /wp:image -->

分类:服务器搭建linux
标签:linux远程登陆putty文件上传pscp

2019-08-11 16:36:41.0
linux远程登陆和上传文件(putty、pscp)  linux-yuan-cheng

docker network (docker 网络的组建)

<!-- wp:paragraph --> <p>“docker 网络的组建” 就是需要解决docker容器之间的网络访问以及其他主机访问docker容器的问题。根据实践验证,具体列举以下方法:</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>1 映射主机端口</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>映射主机端口,也就是将docker容器提供服务的端口映射到主机的某一个端口,消费者直接访问主机即可。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">docker run --name docker-nginx -d -p 8080:80 -v /root/service/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/service/nginx/conf.d:/etc/nginx/conf.d -v /root/service/nginx/html:/usr/share/nginx/html nginx</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>使用以上命令运行容器的时候,将容器docker-nginx的80端口映射到了主机的8080端口,其中 -p 8080:80 就是指定端口的映射关系。 消费者可以直接访问主机的8080端口,此外,还必须开启主机防火墙的8080端口。(防火墙的设置方法在上篇文章已经介绍到了)</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>然而,在Docker Hub的大多常用的镜像实例说明中,基本都不会使用这种方式来运行一个容器,因为在公网中,多开一个端口,就意味着主机在网络世界中多了一个弱点。<a href="http://www.jvm123.com/2019/07/db-attack/" target="_blank" rel="noreferrer noopener" aria-label="(在新窗口打开)">我主机上的服务就因为防火墙未关闭端口被攻击过。</a>所以,使用docker network组建容器之间的网络是很有必要的。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>2 docker network 组建容器之间的网络 </h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>在docker中,docker network 是主要是用做容器之间的通信,即组建容器之间的局域网。其实使用 -link 可以实现容器之间简单的网络,但是容器较多而且通信关系较为复杂时,使用network就更又条理。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>docker network 即在容器之间组建一个局域网,然后各个容器可以加入这个网络,之后容器之间的访问就如同局域网中主机之间的访问。</p> <!-- /wp:paragraph --> <!-- wp:heading {"level":3} --> <h3>创建一个network</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">docker network create docker-network // docker-network是局域网的名字,自定义 docker network ls // 查看已有的network</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>将容器连接到network</h3> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">// 运行新的容器,并加入到docker-network网络中 // --network 表示这个容器要连接到的网络 // --network-alias 表示这个容器在此网络中的名称,也可以使用--ip来指定容器的ip docker run --name docker-nginx -d --network docker-network --network-alias nginx-network nginx // 已经在运行的容器加入网络使用以下命令 // docker network connect [OPTIONS] NETWORK CONTAINER docker network connect --alias nginx-network docker-network docker-nginx docker network connect --alias wp-network docker-network docker-wordpress</pre> <!-- /wp:preformatted --> <!-- wp:heading {"level":3} --> <h3>容器之间的访问</h3> <!-- /wp:heading --> <!-- wp:paragraph --> <p>经过以上命令,我们已经创建了一个名为 docker-network 的网络,并且有两个容器加入了这个网络,在网络中的名称分别为:nginx-network 和 wp-network。现在需要使用 nginx 作为反向代理来访问 wordpress(wp-network),可直接修改 nginx 的配置文件,设置代理的主机地址为 wp-network 即可,( wp-network 为容器在network中的名称)如下:</p> <!-- /wp:paragraph --> <!-- wp:code --> <pre class="wp-block-code"><code>location / { proxy_pass http://wp-network:80/; } // 注意:这里的80端口为wordpress镜像暴露的端口,(即DockerFile中expose的端口), // 并不是映射到主机的端口。(其实也没必要映射端口了)</code></pre> <!-- /wp:code --> <!-- wp:paragraph --> <p>至此,docker网络的组建以及容器之间访问的问题已经解决了。</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>最重要的一点:本机防火墙状态改变后,一定要<strong>重启docker服务</strong>,否则对于docker网络的设置不会生效。</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">systemctl restart docker</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph -->

分类:服务器搭建docker
标签:docker networkdocker容器dockerdocker内网docker网络

2019-07-27 02:42:28.0
docker network (docker 网络的组建)  docker-network

CentOS 7 防火墙端口配置

<!-- wp:heading --> <h2>查看防火墙状态</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">firewall-cmd --state</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>开启(关闭)防火墙</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">systemctl enable firewalld.service<br>systemctl start firewalld.service<br>systemctl stop firewalld.service<br>systemctl disable firewalld.service </pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>enable/disable 表示启用或禁用的意思,即重启服务器之后,防火墙会不会默认启动。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>添加(移除)防火墙端口</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">firewall-cmd --zone=public --add-port=80/tcp --permanent<br>firewall-cmd --zone=public --remove-port=80/tcp --permanent</pre> <!-- /wp:preformatted --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">--zone&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;#作用域<br>--add-port=80/tcp&nbsp; &nbsp; &nbsp;#添加端口,格式为:端口/通讯协议<br>--permanent&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; #永久生效,没有此参数重启后失效 </pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>重启防火墙</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">firewall-cmd --reload</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>注意:执行了上一步的 add 或 remove 命令后,需要执行reload才能生效</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>查看允许的端口</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">netstat -ntlp<br>firewall-cmd --list-ports </pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>此外,firewall还可以根据服务来设置,可以参考以下常用的命令。</p> <!-- /wp:paragraph --> <!-- wp:heading --> <h2>常用的命令</h2> <!-- /wp:heading --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">firewall-cmd --state &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看防火墙状态,是否是running firewall-cmd --reload &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 重新载入配置,比如添加规则之后,需要执行此命令 firewall-cmd --get-zones &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 列出支持的zone firewall-cmd --get-services &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 列出支持的服务,在列表中的服务是放行的 firewall-cmd --query-service ftp &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 查看是否支持ftp服务,返回yes或者no firewall-cmd --add-service=ftp &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 临时开放服务ftp firewall-cmd --add-service=ftp --permanent &nbsp;&nbsp;&nbsp;&nbsp;# 永久开放服务ftp firewall-cmd --remove-service=ftp --permanent &nbsp;# 永久移除服务ftp firewall-cmd --add-port=80/tcp --permanent &nbsp;&nbsp;&nbsp;&nbsp;# 永久添加端口80 firewall-cmd --list-ports&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; # 查看允许的端口列表</pre> <!-- /wp:preformatted --> <!-- wp:heading --> <h2>使用 iptables</h2> <!-- /wp:heading --> <!-- wp:paragraph --> <p>CentOS 7.0 默认使用的是 firewall 作为防火墙,使用 iptables 必须先关闭 firewall,再安装 iptables</p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>1、直接关闭防火墙</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted"> systemctl stop firewalld.service systemctl disable firewalld.service </pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph --> <!-- wp:paragraph --> <p>2、设置 iptables service</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">yum -y install iptables-services</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>如果要修改防火墙配置,如增加防火墙端口 8080</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">vi /etc/sysconfig/iptables&nbsp;</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>增加规则</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT</pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p>保存退出后</p> <!-- /wp:paragraph --> <!-- wp:preformatted --> <pre class="wp-block-preformatted">systemctl restart iptables.service&nbsp; # 重启防火墙使配置生效<br>systemctl enable iptables.service&nbsp; # 设置防火墙开机启动 </pre> <!-- /wp:preformatted --> <!-- wp:paragraph --> <p></p> <!-- /wp:paragraph -->

分类:服务器搭建linux
标签:防火墙centos端口linux防火墙linux

2019-07-25 21:51:55.0
CentOS 7 防火墙端口配置  centos-7-port