首页 文章 精选 留言 我的

精选列表

搜索[搭建],共10007篇文章
优秀的个人博客,低调大师

Nacos的环境搭建

Nacos是阿里开源的一款服务治理方案的中间件,提供了服务发现和服务健康监测、动态配置服务、动态 DNS 服务、服务及其元数据管理等特性功能。 Nacos最新版本地址 https://github.com/alibaba/nacos/releases 下载后解压的目录如下 单机部署模式 1.进入到bin目录中 startup.sh -m standalone 2.访问http://ip:8848/nacos 如下,默认登录密码nacos/nacos 登录后管理页面如下 数据库模式 1.修改conf/application.propertis增加配置内容 spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://ip:3306/nacos_config?useUnicode=true&characterEncoding=utf-8 db.user= db.password= 2.创建数据库nacos_config,执行/config/nacos-mysql.sql数据库脚本 2.进入到bin目录中 startup.sh -m standalone 3.访问效果如同上 集群模式(在数据库模式下增加如下操作) 1.复制两个nacos命名为nacos1 nacos2 2.修改application.properties里面的启动端口,分别为8847,8848,8849 3.分别在config目录下创建cluster.config内容如下 10.136.15.122:8848 10.136.15.122:8849 10.136.15.122:8847 4.启动 ./startup.sh 5.查看集群情况

优秀的个人博客,低调大师

DockerSwarm 集群环境搭建

文章首发于公众号《程序员果果》地址:https://mp.weixin.qq.com/s/RSNL-V4jLE8YVMSWZlJ_Vw 一、简介 1. 什么是docker swarm? Swarm 在 Docker 1.12 版本之前属于一个独立的项目,在 Docker 1.12 版本发布之后,该项目合并到了 Docker 中,成为 Docker 的一个子命令。目前,Swarm 是 Docker 社区提供的唯一一个原生支持 Docker 集群管理的工具。它可以把多个 Docker 主机组成的系统转换为单一的虚拟 Docker 主机,使得容器可以组成跨主机的子网网络。 Docker Swarm 是一个为 IT 运维团队提供集群和调度能力的编排工具。用户可以把集群中所有 Docker Engine 整合进一个「虚拟 Engine」的资源池,通过执行命令与单一的主 Swarm 进行沟通,而不必分别和每个 Docker Engine 沟通。在灵活的调度策略下,IT 团队可以更好地管理可用的主机资源,保证应用容器的高效运行。 Swarm的基本架构如下图所示: ![](https://yqfile.alicdn.com/e1fdf3829188f211cc01c1536fda5e283e1434a7.png 2. Docker Swarm 优点 任何规模都有高性能表现对于企业级的 Docker Engine 集群和容器调度而言,可拓展性是关键。任何规模的公司——不论是拥有五个还是上千个服务器——都能在其环境下有效使用 Swarm。经过测试,Swarm 可拓展性的极限是在 1000 个节点上运行 50000 个部署容器,每个容器的启动时间为亚秒级,同时性能无减损。 灵活的容器调度 Swarm 帮助 IT 运维团队在有限条件下将性能表现和资源利用最优化。Swarm 的内置调度器(scheduler)支持多种过滤器,包括:节点标签,亲和性和多种容器部策略如 binpack、spread、random 等等。 服务的持续可用性 Docker Swarm 由 Swarm Manager 提供高可用性,通过创建多个 Swarm master 节点和制定主 master 节点宕机时的备选策略。如果一个 master 节点宕机,那么一个 slave 节点就会被升格为 master 节点,直到原来的 master 节点恢复正常。此外,如果某个节点无法加入集群,Swarm 会继续尝试加入,并提供错误警报和日志。在节点出错时,Swarm 现在可以尝试把容器重新调度到正常的节点上去。 和 Docker API 及整合支持的兼容性 Swarm 对 Docker API 完全支持,这意味着它能为使用不同 Docker 工具(如 Docker CLI,Compose,Trusted Registry,Hub 和 UCP)的用户提供无缝衔接的使用体验。 Docker Swarm 为 Docker 化应用的核心功能(诸如多主机网络和存储卷管理)提供原生支持 开发的 Compose 文件能(通过 docker-compose up )轻易地部署到测试服务器或 Swarm 集群上。Docker Swarm 还可以从 Docker Trusted Registry 或 Hub 里 pull 并 run 镜像。 二、相关概念 1. 节点 有两种类型的节点: managers 和 workers. 管理节点(managers) 管理节点用于 Swarm 集群的管理,docker swarm 命令基本只能在管理节点执行(节点退出集群命令 docker swarm leave 可以在工作节点执行)。一个 Swarm 集群可以有多个管理节点,但只有一个管理节点可以成为 leader,leader 通过 raft 协议实现。 为了利用swarm模式的容错功能,Docker建议您根据组织的高可用性要求实现奇数个节点。当您拥有多个管理器时,您可以从管理器节点的故障中恢复而无需停机。 N个管理节点的集群容忍最多损失 (N-1)/2 个管理节点。 Docker建议一个集群最多7个管理器节点。 重要说明:添加更多管理节点并不意味着可扩展性更高或性能更高。一般而言,情况正好相反。 工作节点(workers) 工作节点是任务执行节点,管理节点将服务 (service) 下发至工作节点执行。管理节点默认也作为工作节点。你也可以通过配置让服务只运行在管理节点。下图展示了集群中管理节点与工作节点的关系。 2. 服务和任务 任务 (Task)是 Swarm 中的最小的调度单位,目前来说就是一个单一的容器。服务 (Services) 是指一组任务的集合,服务定义了任务的属性。服务有两种模式: replicated services (复制服务)按照一定规则在各个工作节点上运行指定个数的任务。 global services (全局服务)每个工作节点上运行一个任务。 两种模式通过 docker service create 的 --mode 参数指定。下图展示了容器、任务、服务的关系。 三、Swarm 集群 准备工作 三个可以通过网络进行通信的Linux主机或虚拟机,并安装了Docker,或者使用docker-machine 创建三台虚拟机。 已安装Docker Engine 1.12或更高版本 在主机之间打开端口(2377、7946、4789) 创建一个集群 1. 创建虚拟机(已经有Linux主机或虚拟机的跳过此步) 本文通过docker-machine使用VirtualBox驱动程序创建3个VM (已经有Linux主机或虚拟机的跳过此步): docker-machine create --driver virtualbox myvm-1 docker-machine create --driver virtualbox myvm-2 docker-machine create --driver virtualbox myvm-3 列出虚拟机并获取其IP地址: docker-machine ls 以下是此命令的示例输出: $docker-machine ls NAME ACTIVE DRIVER STATE URL SWARM DOCKER ERRORS myvm-1 - virtualbox Running tcp://192.168.99.100:2376 v18.09.1-beta2 myvm-2 - virtualbox Running tcp://192.168.99.101:2376 v18.09.1-beta2 myvm-3 - virtualbox Running tcp://192.168.99.102:2376 v18.09.1-beta2 2. 初始化swarm 把第一台机器myvm-1充当管理节点,第二台myvm-2 、第三台myvm-3为工作节点。 使用 docker-machine ssh 连接 myvm-1,Linux主机直接ssh连接就行。 docker-machine ssh myvm-1 初始化swarm docker swarm init --advertise-addr 192.168.99.100 Swarm initialized: current node (4a8mo8cekpe0vpk0ze963avw9) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions. 上面输出的这一段就是工作节点加入集群的命令: docker swarm join --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u 192.168.99.100:2377 如果你的 Docker 主机有多个网卡,拥有多个 IP,必须使用 --advertise-addr 指定 IP。 执行 docker swarm init 命令的节点自动成为管理节点。 命令 docker info 可以查看 swarm 集群状态: Server Version: 18.09.1-beta2 Storage Driver: overlay2 Backing Filesystem: extfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: active NodeID: ib1498ex2q18i7gznb2zgicqq Is Manager: true ClusterID: fbyxxjzrtcxc53op35jnyzl7t Managers: 3 Nodes: 3 Default Address Pool: 10.0.0.0/8 命令 docker node ls 可以查看集群节点信息: $docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ib1498ex2q18i7gznb2zgicqq * myvm-1 Ready Active Leader 18.09.1-beta2 3. 工作节点加入 swarm 集群 连接机器myvm-2 docker-machine ssh myvm-2 加入 swarm 集群 $docker swarm join \ --token SWMTKN-1-4lzr2216s61ecbyayyqynjwybmxy5y5th5ru8aal2a0d1t2vn3-ekdgf4swlz8fiq4nnzgnbhr5u \ 192.168.99.100:2377 This node joined a swarm as a worker. 节点myvm-3,执行myvm-2相同的操作加入集群。 集群的大部分命令需要在管理节点中才能运行 我们进入管理节点 myvm-1 ,查看集群的节点信息。 docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ib1498ex2q18i7gznb2zgicqq * myvm-1 Ready Active Leader 18.09.1-beta2 vels0fe3eh5s5cxj1s573v9wx myvm-2 Ready Active 18.09.1-beta2 obxnnqelh4p16wajrwvyn6j8v myvm-3 Ready Active 18.09.1-beta2 为了高可用,我们升级工作节点为管理节点。 docker node promote myvm-2 docker node promote myvm-3 这时我们再看集群的节点信息 $ docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION ib1498ex2q18i7gznb2zgicqq * myvm-1 Ready Active Leader 18.09.1-beta2 vels0fe3eh5s5cxj1s573v9wx myvm-2 Ready Active Reachable 18.09.1-beta2 obxnnqelh4p16wajrwvyn6j8v myvm-3 Ready Active Reachable 18.09.1-beta2 myvm-2、myvm-3的 集群状态变为 Reachable(选举者),因为集群中节点Leader只能有一个,这个类似zookeeper,只不过zookeepers用的算法是paxos,Swarm用的算法是raft。 4. 退出 Swarm 集群 如果 Manager 想要退出 Swarm 集群, 在 Manager Node 上执行如下命令: docker swarm leave 如果集群中还存在其它的 Worker Node,还希望 Manager 退出集群,则加上一个强制选项,命令行如下所示: docker swarm leave --force 工作节点进行退出集群,需要在工作节点上执行命令: docker swarm leave 退出后的节点,依然可以使用 上面的 docker swarm join --token 重新加入集群。 集群上部署应用 命令 $ docker service create --replicas 1 --name 别名 镜像ID replicas 指定运行服务的数量。 实例1 创建一个alpine服务(alpine是一个小型liunx系统) #运行一个alpine镜像,并执行ping命令 docker service create --replicas 1 --name test1 alpine ping docker.com 查看集群上的服务 $docker service ls ID NAME MODE REPLICAS IMAGE PORTS rnu10rprrwzv test1 replicated 1/1 alpine:latest 实例2 以下命令将nginx容器中的端口80发布到群集中任何节点的端口8080 docker service create \ --name my-web \ --publish published=8080,target=80 \ --replicas 2 \ nginx 查看集群上的服务 $ docker service ls ID NAME MODE REPLICAS IMAGE PORTS q6wfiizzosmd nginx replicated 3/3 nginx:latest *:8080->80/tcp rnu10rprrwzv test1 replicated 1/1 alpine:latest service 通过 ingress load balancing 来发布服务,且 swarm 集群中所有 node 都参与到 ingress 路由网格(ingress routing mesh) 中,访问任意一个 node+PublishedPort 即可访问到服务。 当访问任何节点上的端口8080时,Docker将您的请求路由到活动容器。在群节点本身,端口8080可能并不实际绑定,但路由网格知道如何路由流量,并防止任何端口冲突的发生。 路由网格在发布的端口上监听分配给节点的任何IP地址。对于外部可路由的IP地址,该端口可从主机外部获得。对于所有其他IP地址,只能从主机内部访问。 所以访问 192.169.99.100:8080、192.169.99.101:8080、192.169.99.102:8080 ,都可以访问到nginx,这样就实现了负载均衡。因为我们指定--replicas 3 启动了3个运行nginx的容器 ,所以三个节点myvm-1、myvm-2、myvm-3 上都运行了一个 nginx 的容器,可以通过改其中一个节点上的nginx的欢迎页 ,然后再访问,来检查是否实现了负载均衡。 可以通过scale 来指定运行容器的数量。 docker service scale nginx=2 我通过docker service ls 可以看出 nginx 的副本变成了2个 $docker service ls ID NAME MODE REPLICAS IMAGE PORTS q6wfiizzosmd nginx replicated 2/2 nginx:latest *:8080->80/tcp overlay 网络 1. 概述 初始化swarm或将Docker主机加入现有swarm时,会在该Docker主机上创建两个新网络: ingress:称为覆盖网络ingress,处理与群集服务相关的控制和数据流量。创建群组服务并且不将其连接到用户定义的覆盖网络时,ingress 是默认连接的网络。 docker_gwbridge:称为桥接网络docker_gwbridge,它将各个Docker守护程序连接到参与该群集的其他守护进程。 在管理节点上查看网络 $ docker network ls NETWORK ID NAME DRIVER SCOPE cb0ccb89a988 bridge bridge local 0174fb113496 docker_gwbridge bridge local 541b62778c0e host host local 8n7xppn5z4j2 ingress overlay swarm 369d459f340d none null local overlay网络驱动程序会创建多个Docker守护主机之间的分布式网络。该网络位于(覆盖)特定于主机的网络之上,允许连接到它的容器(包括群集服务容器)安全地进行通信。Docker透明地处理每个数据包与正确的Docker守护程序主机和正确的目标容器的路由。 2. 自定义 overlay 网络 创建用于swarm服务的overlay网络,使用如下命令: docker network create -d overlay my-overlay 我们再次查看网络,发现可以看到自定义 overlay了。 $docker network ls NETWORK ID NAME DRIVER SCOPE cb0ccb89a988 bridge bridge local 0174fb113496 docker_gwbridge bridge local 541b62778c0e host host local 8n7xppn5z4j2 ingress overlay swarm a23htz7n0pvp my-overlay overlay swarm 369d459f340d none null local 集群中部署了两个服务 nginx、alpine,现在我们进入alpine,去访问nginx。 docker exec -it test1.1.oonwl8c5g4u3p17x8anifeubi bash / # ping nginx ping: bad address 'nginx' wget 192.168.99.100:8080 Connecting to 192.168.99.100:8080 (192.168.99.100:8080) index.html 100% |*************************************************************************************************************| 612 0:00:00 ETA 我们发现集群中的各个服务不能用名称访问的,只能用集群服务发现的路由网络访问,那么集群中的服务怎么能通过名称进行访问呢,这就需要用到上面自定义的 overlay 网络。 删除我们启动的服务,重新创建指定使用自定义网络的服务。 docker service rm nginx test1 docker service create --name nginx -p 8080:80 --network my-overlay --replicas 3 nginx docker service create --name test1 --network my-overlay alpine ping www.baidu.com 进入test1容器中,重新测试下: / # ping nginx PING nginx (10.0.0.2): 56 data bytes 64 bytes from 10.0.0.2: seq=0 ttl=64 time=0.120 ms 64 bytes from 10.0.0.2: seq=1 ttl=64 time=0.094 ms 64 bytes from 10.0.0.2: seq=2 ttl=64 time=0.108 ms / # wget nginx Connecting to nginx (10.0.0.2:80) index.html 100% |*************************************************************************************************************| 612 0:00:00 ETA 发现可以通过名称进行集群中的容器间的访问了。

优秀的个人博客,低调大师

Linux——LNMP环境搭建

一、LNMP环境概述 1、什么是LNMP环境 LNMP 是 Linux + Nginx + MySQL/Mariadb + PHP 的组合缩写。 Nginx:是一个web服务器,提供HTTP 服务。MySQL/MariaDB:关系型数据库,用来存放数据(例如账号信息等)PHP:是一种编程语言。常用来做网站(例如qq.com 、 baidu.com)。 2、网站访问原理 用户通过web浏览器访问网站,即访问Nginx服务。此时会处理图片、js、css(叫做静态请求);接收PHP请求但不处理,会将PHP的请求转发给php-fpm服务,由此服务来处理PHP请求(叫做动态请求) 3、静态请求 & 动态请求 静态请求:指Nginx可以直接处理的图片、js、css、视频、音频、flash等 动态请求:指需要和数据库打交道的请求。例如:用户登录过程,查看文章或者写一篇文章。 二、Mariadb数据库安装 1、Mariadb数据库概述 Mariadb数据库是MySQL的一个分支。MySQL被 SUN公司收购后,又被 Oracle公司收购,因为Oracle公司专门做关系型商业收费数据库,所以很有可能在未来的某年MySQL也会变成商业版收费软件。为了避免这一情况,现在很多公司开始转向使用Mariadb数据库。 Mariadb数据库完全兼容MySQL数据库,包括API和命令行。目前最新的稳定版是10.3版。 2、下载 官方网站 https://mariadb.org/ 下载界面 https://downloads.mariadb.org/ 本次学习使用10.3版本 可以保存对应的下载链接在Linux中使用wget命令获取镜像。 3、解压缩文件 tar zxvf mariadb-10.3.13-linux-x86_64.tar.gz 3.1 常用的解压缩命令 解压.tar.gz文件 tar zxvf mariadb-10.3.13-linux-x86_64.tar.gz解压.tar.bz2文件 tar jxvf mariadb-10.3.13-linux-x86_64.tar.bz2解压.tar.xz文件 tar Jxvf mariadb-10.3.13-linux-x86_64.tar.xz 3.2 常用的压缩打包命令 tar zcvf mariadb-10.tar.gz 123/tar jcvf mariadb-10.tar.bz2 123/命令解析:将目录123/ 压缩打包为mariadb-10.tar.gz/bz2 4、拷贝解压后的文件至对应的目录并改名,方便后期维护 mv mariadb-10.3.13-linux-x86_64 /usr/local/mysql 5、查看安装步骤 [root@JSH-01 local]# cd mysql/[root@JSH-01 mysql]# less INSTALL-BINARY 6、创建目录 mkdir -p /data/mysql (其中参数 -p 是级联创建) 7、创建用户 useradd -M -s /sbin/nologin mysql (其中参数 -M 不创建家目录;-s 指定shell) 8、改变文件的拥有者和群组 chown -R mysql:mysql /data/mysql (其中参数 -R 指定目录以及其子目录下的所有文件) 命令解析: 目录/data/mysql及其子目录下的所有文件的拥有者和群组都是mysql。 8、初始化mariadb 生成自己的库文件 报错信息如下:此时需要安装 yum install -y libaio-devel 安装完依赖包后,再次执行初始化命令。输入 echo $? 查看安装结果 9、拷贝启动脚本并改名为mysqld,编辑拷贝后的文件。 [root@JSH-01 mysql]# cp support-files/mysql.server /etc/init.d/mysqld[root@JSH-01 mysql]# vi /etc/init.d/mysqld basedir=/usr/local/mysql #定义mysql程序存放目录datadir=/data/mysql #定义mysql数据库存放位置 10、系统服务与启动 10.1 chkconfig --list 列出系统所有的服务(针对 CentOS 6系统) 增加mysqld服务至系统服务列表 chkconfig --add mysqld前提:mysqld 在/etc/init.d 目录下;其次mysqld的权限为 755设置其随系统启动而启动:chkconfig mysqld on 10.2 systemctl list-unit-files 列出系统所有的服务(针对 CentOS 7系统) 11、启动mysqld服务 /etc/init.d/mysqld start 或者 service mysqld start(只要将其加入系统服务列表,就可以用后者启动) 报错信息: 编辑默认配置文件 vi /etc/my.cnf 修改对应的参数(如图) 一般讲socket放在 /tmp/ 目录下; 修改完成后,再次启动mysqld 如图所示,表示成功 12、查看进程 ps aux|grep mysql 13、查看3306端口 netstat -lnp 14、连接MySQL/MariaDB服务 15、首次连接需要输入的命令太长,怎么办? 解决方法1:软连接 解决方法2:系统环境变量(重启系统后会失效) 只有存在于/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin里面的命令才可以直接用。 将 /usr/local/mysql/bin 目录添加至系统环境变量中 解决方法3:系统环境变量(永久有效) [root@JSH-01 mysql]# echo "PATH=$PATH:usr/local/mysql/bin" >> /etc/profile 解析:/etc/profile 初始环境系统变量配置文件 16、别名 alias (可以理解为外号) 例如1:定义别名(仅针对当前窗口有效;重启或重新连接后就失效了) [root@JSH-01 ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 [root@JSH-01 ~]# alias vieth0='vi /etc/sysconfig/network-scripts/ifcfg-eth0' ##当重启或重新连接后就失效了 [root@JSH-01 ~]# ls -a . .bash_history .bash_profile .cache .mysql_history .pydistutils.cfg .tcshrc .. .bash_logout .bashrc .cshrc .pip .ssh [root@JSH-01 ~]# vi .bashrc 需要将别名写入当前用户家目录下的 .bashrc 文件中才能永久有效(针对当前用户) 需要将别名写入root用户/etc/bashrc 文件中才能永久有效(针对所有用户) 三、编译安装PHP 1、下载 官网 www.php.net 点击对应的文件格式后,会跳转至镜像站,选择国家后点击下载。复制对应的下载链接,在Linux中使用wget命令获取。 2、解压缩 [root@JSH-01 src]# tar zxvf php-7.3.2.tar.gz [root@JSH-01 src]# ls mariadb-10.3.13-linux-x86_64.tar.gz php-7.3.2 php-7.3.2.tar.gz 3、编译 3.1 编译第一步: ./configure配置编辑参数 进入PHP目录,vi INSTALL 可以看到编译指引链接https://php.net/install 编译参数如下: ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-pdo-mysql=/usr/local/mysql --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl 编译参数详解: --prefix=/usr/local/php-fpm 指定安装路径--with-config-file-path=/usr/local/php-fpm/etc 指定配置文件路径--enable-fpm 开启fpm功能(因为要对接Nginx)--with-fpm-user=php-fpm 指定fpm的用户--with-fpm-group=php-fpm 指定fpm的组--with-mysql=/usr/local/mysql 连接MySQL(兼容老版本)--with-mysqli=/usr/local/mysql/bin/mysql_config 连接MySQL(新版本)--with-pdo-mysql=/usr/local/mysql 连接MySQL的一种方式--with-mysql-sock=/tmp/mysql.sock 指定MySQL的socket 添加PHP的各种模块--with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl 编译过程中的错误与解决方法 错误1: checking for cc ... no checking for gcc ... no 解决方法:安装编译器 yum install -y gcc 错误2: configure: error: libxml2 not found. Please check your libxml2 installation. 解决方法:yum list |grep libxml2(一般都是缺少开发包devel,所以此处安装 yum install -y libxml2-devel ) [root@JSH-01 php-7.3.2]# yum list |grep libxml2 libxml2.x86_64 2.9.1-6.el7_2.3 @anaconda libxml2.i686 2.9.1-6.el7_2.3 base libxml2-devel.i686 2.9.1-6.el7_2.3 base libxml2-devel.x86_64 2.9.1-6.el7_2.3 base libxml2-python.x86_64 2.9.1-6.el7_2.3 base libxml2-static.i686 2.9.1-6.el7_2.3 base libxml2-static.x86_64 2.9.1-6.el7_2.3 base mingw32-libxml2.noarch 2.9.3-1.el7 epel mingw32-libxml2-static.noarch 2.9.3-1.el7 epel mingw64-libxml2.noarch 2.9.3-1.el7 epel mingw64-libxml2-static.noarch 2.9.3-1.el7 epel 错误3: configure: error: Cannot find OpenSSL's <evp.h> 解决方法:yum install -y openssl-devel [root@JSH-01 php-7.3.2]# yum list |grep -i OpenSSL (-i参数:忽略大小写) openssl.x86_64 1:1.0.2k-8.el7 @anaconda openssl-libs.x86_64 1:1.0.2k-8.el7 @anaconda apr-util-openssl.x86_64 1.5.2-6.el7 base globus-gsi-openssl-error.x86_64 4.0-1.el7 epel globus-gsi-openssl-error-devel.x86_64 4.0-1.el7 epel globus-gsi-openssl-error-doc.noarch 4.0-1.el7 epel globus-openssl-module.x86_64 5.0-1.el7 epel globus-openssl-module-devel.x86_64 5.0-1.el7 epel globus-openssl-module-doc.noarch 5.0-1.el7 epel mingw32-openssl.noarch 1.0.2h-1.el7 epel mingw32-openssl-static.noarch 1.0.2h-1.el7 epel mingw64-openssl.noarch 1.0.2h-1.el7 epel mingw64-openssl-static.noarch 1.0.2h-1.el7 epel openssl.x86_64 1:1.0.2k-16.el7 base openssl-devel.i686 1:1.0.2k-16.el7 base openssl-devel.x86_64 1:1.0.2k-16.el7 base openssl-libs.i686 1:1.0.2k-16.el7 base openssl-libs.x86_64 1:1.0.2k-16.el7 base openssl-perl.x86_64 1:1.0.2k-16.el7 base openssl-pkcs11.x86_64 0.4.8-1.el7 epel openssl-static.i686 1:1.0.2k-16.el7 base openssl-static.x86_64 1:1.0.2k-16.el7 base openssl098e.i686 0.9.8e-29.el7.centos.3 base openssl098e.x86_64 0.9.8e-29.el7.centos.3 base perl-Crypt-OpenSSL-Bignum.x86_64 0.04-18.el7 base perl-Crypt-OpenSSL-RSA.x86_64 0.28-7.el7 base perl-Crypt-OpenSSL-Random.x86_64 0.04-21.el7 base perl-Crypt-OpenSSL-X509.x86_64 1.803-4.el7 epel pyOpenSSL.x86_64 0.13.1-4.el7 base pyOpenSSL-doc.noarch 0.13.1-4.el7 base rubygem-openssl_cms_2_0_0.x86_64 0.0.2-1.20140212git7fea071.el7 epel rubygem-openssl_cms_2_0_0-doc.noarch 0.0.2-1.20140212git7fea071.el7 epel xmlsec1-openssl.i686 1.2.20-7.el7_4 base xmlsec1-openssl.x86_64 1.2.20-7.el7_4 base xmlsec1-openssl-devel.i686 1.2.20-7.el7_4 base xmlsec1-openssl-devel.x86_64 1.2.20-7.el7_4 base 错误4: checking for cURL 7.15.5 or greater... configure: error: cURL version 7.15.5 or later is required to compile php with cURL support 解决方法:yum install -y libcurl-devel [root@JSH-01 ~]# yum list |grep curl curl.x86_64 7.29.0-42.el7 @anaconda libcurl.x86_64 7.29.0-42.el7 @anaconda python-pycurl.x86_64 7.19.0-19.el7 @anaconda collectd-curl.x86_64 5.8.1-1.el7 epel collectd-curl_json.x86_64 5.8.1-1.el7 epel collectd-curl_xml.x86_64 5.8.1-1.el7 epel curl.x86_64 7.29.0-51.el7 base curlftpfs.x86_64 0.9.2-14.el7 epel flickcurl.x86_64 1.25-2.el7 epel flickcurl-devel.x86_64 1.25-2.el7 epel libcurl.i686 7.29.0-51.el7 base libcurl.x86_64 7.29.0-51.el7 base libcurl-devel.i686 7.29.0-51.el7 base libcurl-devel.x86_64 7.29.0-51.el7 base mingw32-curl.noarch 7.47.0-1.el7 epel mingw32-curl-static.noarch 7.47.0-1.el7 epel mingw64-curl.noarch 7.47.0-1.el7 epel mingw64-curl-static.noarch 7.47.0-1.el7 epel nbdkit-plugin-curl.x86_64 1.2.7-2.el7 epel ocaml-curl.x86_64 0.7.5-3.el7 epel ocaml-curl-devel.x86_64 0.7.5-3.el7 epel python34-pycurl.x86_64 7.43.0-5.el7 epel uwsgi-alarm-curl.x86_64 2.0.17.1-1.el7 epel uwsgi-plugin-curl-cron.x86_64 2.0.17.1-1.el7 epel [root@JSH-01 ~]# yum install -y libcurl-devel 错误5: configure: error: jpeglib.h not found. 解决方法:yum install -y libjpeg-turbo-devel [root@JSH-01 php-7.3.2]# yum list |grep jpeg jpeginfo.x86_64 1.6.1-2.el7 epel jpegoptim.x86_64 1.4.6-1.el7 epel libjpeg-turbo.i686 1.2.90-6.el7 base libjpeg-turbo.x86_64 1.2.90-6.el7 base libjpeg-turbo-devel.i686 1.2.90-6.el7 base libjpeg-turbo-devel.x86_64 1.2.90-6.el7 base libjpeg-turbo-static.i686 1.2.90-6.el7 base libjpeg-turbo-static.x86_64 1.2.90-6.el7 base libjpeg-turbo-utils.x86_64 1.2.90-6.el7 base mingw32-libjpeg-turbo.noarch 1.3.1-4.el7 epel mingw32-libjpeg-turbo-static.noarch 1.3.1-4.el7 epel mingw64-libjpeg-turbo.noarch 1.3.1-4.el7 epel mingw64-libjpeg-turbo-static.noarch 1.3.1-4.el7 epel openjpeg.x86_64 1.5.1-18.el7 base openjpeg-devel.i686 1.5.1-18.el7 base openjpeg-devel.x86_64 1.5.1-18.el7 base openjpeg-libs.i686 1.5.1-18.el7 base openjpeg-libs.x86_64 1.5.1-18.el7 base openjpeg2.x86_64 2.3.0-6.el7 epel openjpeg2-devel.x86_64 2.3.0-6.el7 epel openjpeg2-devel-docs.noarch 2.3.0-6.el7 epel openjpeg2-tools.x86_64 2.3.0-6.el7 epel turbojpeg.i686 1.2.90-6.el7 base turbojpeg.x86_64 1.2.90-6.el7 base turbojpeg-devel.i686 1.2.90-6.el7 base turbojpeg-devel.x86_64 1.2.90-6.el7 base 错误6: configure: error: png.h not found. 解决方法: yum install -y libpng-devel [root@JSH-01 php-7.3.2]# yum list |grep png|grep devel libpng-devel.i686 2:1.5.13-7.el7_2 base libpng-devel.x86_64 2:1.5.13-7.el7_2 base libpng12-devel.i686 1.2.50-10.el7 base libpng12-devel.x86_64 1.2.50-10.el7 base pnglite-devel.x86_64 0.1.17-1.el7.8 epel 错误7: configure: error: freetype-config not found. 解决方法:yum install -y freetype-devel [root@JSH-01 php-7.3.2]# yum list |grep freetype|grep devel freetype-devel.i686 2.8-12.el7_6.1 updates freetype-devel.x86_64 2.8-12.el7_6.1 updates 错误8:提示mysql的版本不对,即安装的mysql版本太新 configure: error: wrong mysql library version or lib not found. Check config.log for more information. 解决方法:下载一个低版本的MySQL或者MariaDB(不需要安装)在 /usr/local/src/ 目录中下载MySQL5.6版本的二进制包、并解压缩,修改编译参数 [root@JSH-01 src]# wget http://mirrors.163.com/mysql/Downloads/MySQL-5.6/mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz [root@JSH-01 src]# tar zxf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz [root@JSH-01 src]# mv mysql-5.6.43-linux-glibc2.12-x86_64 /usr/local/mysql5.6 新编译参数:./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql5.6 --with-mysqli=/usr/local/mysql5.6/bin/mysql_config --with-pdo-mysql=/usr/local/mysql5.6 --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --with-pear --with-curl --with-openssl 警告:新版本的编译已经不需要如下的参数。所以可以在编译参数中删除。当然加上也不影响编译。 configure: WARNING: unrecognized options: --with-mysql, --with-mcrypt, --enable-gd-native-ttf 3.2 编译第二步:make将源码文件编译为二进制文件(通过使用GCC编译) Build complete. #看到该提示,表示编译完成 Don't forget to run 'make test'. [root@JSH-01 php-7.3.2]# echo $? #查看编译过程是够成功,如果是0则表示成功 0 3.3 编译第三步:make install 安装 [root@JSH-01 php-7.3.2]# ls /usr/local/php-fpm/ #安装完成后查看该目录的内容 bin etc include lib php sbin var #配置文件在 /etc/目录中 [root@JSH-01 php-7.3.2]# cd /usr/local/php-fpm/etc/ [root@JSH-01 etc]# ls pear.conf php-fpm.conf.default php-fpm.d 4、拷贝生成配置文件 php-fpm.conf 否则PHP无法启动 [root@JSH-01 etc]# cp php-fpm.conf.default php-fpm.conf #复制生成配置文件,否则PHP无法启动 [root@JSH-01 etc]# ls pear.conf php-fpm.conf php-fpm.conf.default php-fpm.d 5、拷贝生成配置文件 php.ini 到 /usr/local/php-fpm/etc/目录下 默认PHP的源码包中有:php.ini-development(开发环境) 和 php.ini-production(生产环境)根据需要拷贝生成。如果用于开发、测试环境则拷贝php.ini-development(开发环境)生成配置文件 php.ini;如果用于生产环境则拷贝php.ini-production(生产环境)生成配置文件 php.ini; [root@JSH-01 php-7.3.2]# cp php.ini-development /usr/local/php-fpm/etc/php.ini 5、配置启动脚本并设置权限 [root@JSH-01 php-7.3.2]# cp sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm [root@JSH-01 php-7.3.2]# chmod 755 /etc/init.d/php-fpm 6、设置PHP开机启动 [root@JSH-01 php-7.3.2]# chkconfig --add php-fpm [root@JSH-01 php-7.3.2]# chkconfig php-fpm on 7、启动PHP服务 service php-fpm start 报错1: [root@JSH-01 php-7.3.2]# service php-fpm start Starting php-fpm [01-Mar-2019 11:17:58] WARNING: Nothing matches the include pattern '/usr/local/php-fpm/etc/php-fpm.d/*.conf' from /usr/local/php-fpm/etc/php-fpm.conf at line 143. [01-Mar-2019 11:17:58] ERROR: No pool defined. at least one pool section must be specified in config file [01-Mar-2019 11:17:58] ERROR: failed to post process the configuration [01-Mar-2019 11:17:58] ERROR: FPM initialization failed failed 解决方法:在目录 /usr/local/php-fpm/etc/php-fpm.d/ 拷贝生成配置文件 www.conf [root@JSH-01 php-7.3.2]# cd /usr/local/php-fpm/etc/php-fpm.d/ [root@JSH-01 php-fpm.d]# ls www.conf.default [root@JSH-01 php-fpm.d]# cp www.conf.default www.conf 报错2: [root@JSH-01 php-fpm.d]# service php-fpm start Starting php-fpm [01-Mar-2019 11:28:07] ERROR: [pool www] cannot get uid for user 'php-fpm' [01-Mar-2019 11:28:07] ERROR: FPM initialization failed failed 解决方法:创建用户 php-fpm (因为编译的时候未创建) [root@JSH-01 php-fpm.d]# useradd php-fpm 8、再次启动,成功后检查服务及端口 9000 [root@JSH-01 php-fpm.d]# service php-fpm start Starting php-fpm done [root@JSH-01 php-fpm.d]# ps aux |grep php-fpm root 15099 0.0 0.2 127020 4220 ? Ss 11:29 0:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf) php-fpm 15100 0.0 0.2 127020 4152 ? S 11:29 0:00 php-fpm: pool www php-fpm 15101 0.0 0.2 127020 4152 ? S 11:29 0:00 php-fpm: pool www root 16510 0.0 0.0 112632 660 pts/0 D+ 11:31 0:00 grep --color=auto php-fpm [root@JSH-01 php-fpm.d]# netstat -lntp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3207/sshd tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 15099/php-fpm: mast tcp6 0 0 :::3306 :::* LISTEN 19939/mysqld 四、编译安装Nginx 1、Nginx官网 http://nginx.org/ Mainline version:Mainline 是 Nginx 目前主力在做的版本,可以说是开发版Stable version:最新稳定版,生产环境上建议使用的版本Legacy versions:遗留的老版本的稳定版 2、下载 [root@JSH-01 php-fpm.d]# cd /usr/local/src [root@JSH-01 src]# wget http://nginx.org/download/nginx-1.14.2.tar.gz 本次学习安装使用 Stable version 1.14.2 版本 3、解压缩 [root@JSH-01 src]# tar zxvf nginx-1.14.2.tar.gz 4、编译 编译参数如下: ./configure --prefix=/usr/local/nginx --with-http_ssl_module [root@JSH-01 src]# cd nginx-1.14.2 #进入文件目录 [root@JSH-01 nginx-1.14.2]# ./configure --prefix=/usr/local/nginx --with-http_ssl_module #编译 [root@JSH-01 nginx-1.14.2]# echo $? #检查编译过程是否成功,0表示成功 0 5、编译 make 6、编译安装 make install 7、Nginx配置脚本 [root@JSH-01 ~]# ls /usr/local/nginx/conf/nginx.conf 8、启动Nginx服务: /usr/local/nginx/sbin/nginx [root@JSH-01 nginx]# /usr/local/nginx/sbin/nginx [root@JSH-01 nginx]# ps aux|grep nginx #访问网站时使用的为 worker process 进程 root 12167 0.0 0.0 45896 1120 ? Ss 16:10 0:00 nginx: master process /usr/local/nginx/sbin/nginx nobody 12168 0.0 0.1 46344 1896 ? S 16:10 0:00 nginx: worker process root 13114 0.0 0.0 112660 968 pts/0 R+ 16:11 0:00 grep --color=auto nginx [root@JSH-01 nginx]# netstat -lntp |grep nginx #监控的为80端口 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 12167/nginx: master

优秀的个人博客,低调大师

搭建jenkins主从集群

1. 检查服务器包配置[可选] 一般不需要apt的额外配置, 如果有删除配置或者移动到别处, 使其不生效: sudo rm /etc/apt/apt.conf sudo apt-get update 2. 安装JDK jenkins依赖java, 安装java8+版本,并且配置java_home: sudo apt search openjdk sudo apt-get install openjdk-8-jdk sudo vim /etc/bash.bashrc export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64/ 3. 安装jenkins 在ubuntu环境下安装: wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add - sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list' sudo apt-get update sudo apt-get install jenkins 一些默认文件位置: 路径 描述 /etc/default/jenkins jenkins运行配置 jenkins 默认文件用户 /var/log/jenkins/jenkins.log 日志路径 /var/lib/jenkins/ jenkins home 4. 高级设置 Crowd 2 Integration 配置slave 新建node 配置node启动方式: 通过Java Web启动代理, 注意只有在全局安全配置中设置了JNLP代理协议的TCP端口该选项才可选 查看salve页面下载agent.jar 和 slave-agent.jnlp 文件, 并且放到salve服务器的jenkins_home目录下 登录salve服务器切换到jenkins用户, 运行上一步salve页面执行命令, 如: java -jar agent.jar -jnlpUrl http://slave.server.ip:8080/computer/slave-01/slave-agent.jnlp -secret 2a99268dbfc5d5f4c517d237d48078b1163f -workDir "/var/lib/jenkins/" GitLab和Jenkins集成 Jenkins选择一个pipeline任务, Build Triggers->高级->Secret token, 生成一个token Gitlab选择一个项目, Setting->Integrations, 新建一个webhook, 其中 URL: Jenkins的任务位置: http://jenkins-in.devops.com/project/halo-kong Securet Token: 是上一步获取的Jenkins生成的token, 穿件完可以点击Test测试一下 5. 遇到问题 空白页面 解决方式: sudo /etc/init.d/jenkins restart 配置agent的守护进程(否则java -jar agent.jar....命令中断后集群就垮了) sudo easy_install supervisor echo_supervisord_conf > supervisord.conf sudo mv supervisord.conf /etc/supervisord.conf sudo vim /etc/supervisord.conf # 修改include为files = /etc/supervisor/*.conf sudo mkdir -p /etc/supervisor sudo vim /etc/supervisor/jenkins-slave-agent.conf jenkins-slave-agent.conf: [program:jsa] directory = /var/lib/jenkins/ command = java -jar agent.jar -jnlpUrl http://slave.server.ip:8080/computer/slave-01/slave-agent.jnlp -secret 2a99268dbfc5d5f4c517d237d48078b1163f -workDir "/var/lib/jenkins/" autostart = true autorestart = true user = jenkins redirect_stderr = true stdout_logfile = /var/lib/jenkins/jenkins-slave-agent.log supervisorctl commond: sudo supervisorctl reread # 读取新配置 sudo supervisorctl update # 启动更新 sudo supervisorctl status # 查看状态 sudo supervisorctl stop jsa # 停止一个子进程 sudo supervisorctl start jsa # 启动一个子进程 sudo supervisorctl restart jsa # 重启一个子进程 在agent node 运行docker-compose build报告无法连接到http+docker://localhost docker 原因: 权限 解决方法: sudo chown jenkins:docker /var/run/docker.sock 在agent node 运行docker push报告 no basic auth credentials 原因: load credential文件位置不对 解决方案: 指定加载权限文件位置如: docker --config /var/lib/jenins/ push xxxxx 配置动态切换到推送的分支 原因: 默认配置了固定的分支, 如果需要动态配置分支就不可以了 解决方案: 使用gitlab插件内置的一些变量, 比如使用gitlabSourceBranch变量结合checkout进行切换, 如 checkout([$class: 'GitSCM', branches: [[name: '${gitlabSourceBranch}']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[credentialsId: 'gitlab-user', url: 'http://git.devops.com/devops/devops.git']]])

优秀的个人博客,低调大师

Spring Boot 项目搭建

从根本上来说,Spring Boot的项目只是普通的Spring项目,只是它们正好用到了Spring Boot的起步依赖和自动配置而已。因此,那些你早已熟悉的从头创建Spring项目的技术或工具,都能用于Spring Boot项目。然而,还是有一些简便的途径可以用来开启一个新的Spring Boot项目。 最快的方法就是安装Spring Boot CLI,安装后就可以开始写代码,接着通过CLI来运行就好。 @RestController class HelloController { @RequestMapping("/") def hello() { return "Hello World" } } Spring Boot CLI为Spring Boot提供了快速上手和构建简单原型应用程序的途径。 在正确的生产运行时环境下,它也能用于开发生产应用程序。 尽管如此,与大部分Java项目的开发相比,Spring Boot CLI的流程还是不太符合常规。通常情况下,Java项目用Gradle或Maven这样的工具构建出WAR文件,再把这些文件部署到应用服务器里。所以如果CLI模型让你感到不太舒服,你仍然可以在传统方式下充分利用大部分Spring Boot特性。Spring Initializr便是我们开始Spring Boot项目的第一步。 使用 Spring Initializr 初始化 Spring Boot 项目 Spring Initializr从本质上来说就是一个Web应用程序,它能为你生成Spring Boot项目结构。虽然不能生成应用程序代码,但它能为你提供一个基本的项目结构,以及一个用于构建代码的Maven或Gradle构建说明文件。你只需要写应用程序的代码就好了。 Spring Initializr有几种用法。 通过Web界面使用。 通过Spring Tool Suite使用。 通过IntelliJ IDEA使用。 使用Spring Boot CLI使用。 下面分别看看这几种用法,先从Web界面开始。 1. 使用Spring Initializr的Web界面 要使用Spring Initializr,最直接的办法就是用浏览器打开http://start.spring.io 表单的头两个问题是,你想用Maven还是Gradle来构建项目,以及使用Spring Boot的哪个版本。系统默认生成Maven项目,并使用Spring Boot的最新版本(非里程碑和快照版本),也可以选择其他选项。 表单左侧指定项目的一些基本信息。最起码你要提供项目的Group和Artifact,如果点击了“Switch to the full version”链接,还可以指定额外的信息,比如版本号和基础包名。这些信息是用来生成Maven的pom.xml文件(或者Gradle的build.gradle文件)的。 表单右侧要你指定项目依赖,最简单的方法就是在文本框里键入依赖的名称。随着你的输入会出现匹配依赖的列表,选中一个(或多个)依赖,选中的依赖就会加入项目。如果找不到你要的依赖,点击“Switch to the full version”就能看到可用依赖的完整列表。 其实这里的依赖和Spring Boot起步依赖是对应的。实际上,在这里选中依赖,就相当于告诉Initializr把对应的起步依赖加到项目的构建文件里。填完表单,选好依赖,点击“Generate Project”按钮,Spring Initializr就会为你生成一个项目。浏览器将会以ZIP文件的形式(文件名取决于Artifact字段的内容)把这个项目下载下来。解压后的项目结构里基本没有代码,除了几个空目录,但在Spring Boot应用程序中,就连空目录都有自己的意义。static目录放置的是Web应用程序的静态内容(JavaScript、样式表、图片等等),用于呈现模型数据的模板会放在templates目录里。 你很可能会把Initializr生成的项目导入IDE。如果你用的IDE是Spring Tool Suite,则可以直接在IDE里创建项目。下面来看看Spring Tool Suite是怎么创建Spring Boot项目的。 2. 在Spring Tool Suite里创建Spring Boot项目 Spring Tool Suite是Spring官方推出的基于Eclipse的开发工具,长久以来,Spring Tool Suite一直都是开发Spring应用程序的不二之选。从3.4.0版本开始,它就集成了Spring Initializr,这让它成为开始上手Spring Boot的好方法。要在Spring Tool Suite里创建新的Spring Boot应用程序,在File菜单里选中New > Spring Starter Project菜单项,随后Spring Tool Suite会显示一个与下图相仿的对话框。 如你所见,这个对话框要求填写的信息和Spring Initializr的Web界面里是一样的。事实上,你在这里提供的数据会被发送给Spring Initializr,用于创建项目ZIP文件,这和使用Web表单是一样的。 3. 在IntelliJ IDEA里创建Spring Boot项目 IntelliJ IDEA是非常流行的IDE,IntelliJ IDEA 14.1已经支持Spring Boot了。要在IntelliJ IDEA里创建新的Spring Boot应用程序,在File菜单里选择New > Project。你会看到几屏内容,问的问题和Initializr的Web应用程序以及Spring Tool Suite类似。 在首先显示的这一屏中,在左侧项目选择里选中Spring Initializr Spring Boot初始化向导的第二屏要求你提供项目的一些基本信息,比如项目名称、Maven Group和Artifact、Java版本,以及你是想用Maven还是Gradle来构建项目。描述好项目信息之后,点击Next按钮就能看到第三屏了 第二屏向你询问项目的基本信息,第三屏就开始问你要往项目里添加什么依赖了。和之前一样, 屏幕里的复选框和Spring Boot起步依赖是对应的。 选完之后点击Next就到了向导的最后一屏,最后一屏问你项目叫什么名字,还有要在哪里创建项目。一切准备就绪之后,点击Finish按钮,就能在IDE里得到一个空的Spring Boot项目了。 4. 在Spring Boot CLI里使用Initializr 如果你想仅仅写代码就完成Spring应用程序的开发,那么Spring Boot CLI是个不错的选择。然而,Spring Boot CLI的功能还不限于此,它有一些命令可以帮你使用Initializr,通过它上手开发更传统的Java项目。 Spring Boot CLI包含了一个init命令,可以作为Initializr的客户端界面。init命令最简单的用法就是创建Spring Boot项目的基线: $ spring init 在和Initializr的Web应用程序通信后,init命令会下载一个demo.zip文件。解压后你会看到一个典型的项目结构, 包含一个Maven的pom.xml构建描述文件。 Maven的构建说明只包含最基本的内容,即只有Spring Boot基线和测试起步依赖。你可能会想要更多的东西。 假设你想要构建一个Web应用程序,其中使用JPA实现数据持久化,使用Spring Security进行安全加固,可以用--dependencies或-d来指定那些初始依赖: $ spring init -dweb,jpa,security 这条命令会下载一个demo.zip文件,包含与之前一样的项目结构,但在pom.xml里增加了Spring Boot的Web、jpa和security起步依赖。请注意,在-d和依赖之间不能加空格,否则就变成了下载一个ZIP文件,文件名是web,jpa,security。 现在,假设你想用Gradle来构建项目。没问题,用--build参数将Gradle指定为构建类型: $ spring init -dweb,jpa,security --build gradle 默认情况下,无论是Maven还是Gradle的构建说明都会产生一个可执行JAR文件。但如果你想要一个WAR文件,那么可以通过--packaging或者-p参数进行说明: $ spring init -dweb,jpa,security --build gradle -p war 到目前为止,init命令只用来下载ZIP文件。如果你想让CLI帮你解压那个ZIP文件,可以指定一个用于解压的目录: $ spring init -dweb,jpa,security --build gradle -p war myapp 此处的最后一个参数说明你希望把项目解压到myapp目录里去。 此外,如果你希望CLI把生成的项目解压到当前目录,可以使用--extract或者-x参数: $ spring init -dweb,jpa,security --build gradle -p jar -x init命令还有不少其他参数, 包括基于Groovy构建项目的参数、 指定用Java版本编译的参数,还有选择构建依赖的Spring Boot版本的参数。可以通过help命令了解所有参数的情况: $ spring help init 你也可以查看那些参数都有哪些可选项,为init命令带上--list或-l参数就可以了: $ spring init -l 尽管spring init –l列出了一些Initializr支持的参数,但并非所有参数都能直接为Spring Boot CLI的init命令所支持。举例来说,用CLI初始化项目时,你不能指定根包的名字,它默认为demo。spring help init会告诉你CLI的init命令都支持哪些参数。 无论你是用Initializr的Web界面,在Spring Tool Suite里创建项目,还是用Spring Boot CLI来初始化项目,Spring Boot Initializr创建出来的项目都有相似的项目布局,和你之前开发过的Java项目没什么不同。 参考: http://blog.csdn.net/forezp/article/details/70341651 https://www.cnblogs.com/MaxElephant/p/8108224.html https://jingyan.baidu.com/article/48206aea8b3570216bd6b310.html http://blog.csdn.net/u013248535/article/details/55100979 http://blog.csdn.net/forezp/article/details/70437576 http://blog.csdn.net/forezp/article/details/61472783

优秀的个人博客,低调大师

XAMPP环境的搭建

XAMPP是一个强大的集成软件包(什么是集成软件包?就是多个软件打包一起安装了,比如office办公软件包括了word、Excel、PPT) XAMPP包括了Apache,MySQL,PHP,Perl,利用该软件可以直接对MySQL进行可视化操作。 ps:它的原名叫LAMPP,后面的版本为了区别,改名为XAMPP。 主要内容: 下载与安装XAMPP XAMPP的使用方法 下载与安装XAMPP 这里了由于我是win10的64位系统,所以使用xampp 7.1.1 xampp 7.1.1是一款功能强大的建站工具,是众多不懂的asp、PHP等编程的站长们想要轻松建立一个网站的软件,而且这款软件完全开源,能够让我们的用户免费创建各种网站,如果你想要拥有一个自己的网站,那就不要错过这款软件哦。 下载地址:链接:https://pan.baidu.com/s/1_aXP2FMx0zz6LgsHDfv4Vw 密码:qwf8 1、直接双击运行后缀为.exe的执行文件,进行安装,一路点击下一步,默认安装即可 XAMPP的使用方法 这里由于我之前安装过tomcat,所以出现了一点问题,请看日志,这些问题无非是权限问题(没有访问安装路径的权限),端口号被占用的问题(以前安装的软件把端口占用了) 1、运行控制面板 2、首先是安装服务,勾选service,如果一切启动正常请直接看第4步 也可以不安装服务!!! 3、解决冲突,修改端口,启动服务 关于解决冲突的方法,有一篇文章写的很详细了,不再啰嗦 解决XAMPP的冲突:https://blog.csdn.net/caoshangpa/article/details/52934927 点击config》service and port settings》修改端口号》保存》启动服务 点击explorer可以打开安装目录 中间省略一万字。。。。。(其实最好就是一个没有安装过Apache和MySQL的电脑环境) 正常启动是这样 然后安装服务,然后点击start 一切搞好,start启动apache和MySQL服务,显示绿色就是ok了。 4、第4步。。。(不要问怎么样安装不好什么的,大不了把你之前Apache,MySQL,tomcat,还有这个xampp统统卸载重装!!!MD) 我的Apache端口号改为了81,所以点击admin,要访问的地址其实是:http://localhost:81/ 进入页面之后,点击右上角的phpMyAdmin进入管理平台 到了这一步,虽然过程费劲艰辛。真是太棒了!!!

优秀的个人博客,低调大师

SSM基础框架搭建

SSM(Spring + SpringMVC + MyBatis)三个开源框架的简称,是WEB项目开发的不二之选,是码农进阶全栈工程师心路历程上的驿站。大公司开源框架和算法制定标准规范引领行业趋势,小公司拿来主义面向业务敏捷开发快速迭代在夹缝中艰难生存。SSM框架完美的符合了当下的这种行业现状,对于底层是如何实现的开发人员完全不必关注,踏踏实实梳理好业务逻辑,做好质量把控年底KPI基本问题就不大了。 Spring是一个轻量级IoC及AOP容器框架,配置又多又细,SpringBoot简化了大量通用且不常用的配置项,使构建一个微服务变得超简单;SpringMVC是目前最优秀的MVC框架,注解用得好事半功倍;MyBatis用于数据持久化,MyBatisPlus增强版内置分页功能简化开发流程自动化代码生成,唯一要做的事情就剩下写写SQL了。 无私的分享从这里开始: git clone git@gitee.com:gonglibin/kirin.git 文件夹 PATH 列表 卷序列号为 0009-68A2 D:\WORKSPACES\KIRIN │ kirin.iml │ pom.xml │ ├─.idea │ │ .name │ │ compiler.xml │ │ encodings.xml │ │ misc.xml │ │ modules.xml │ │ uiDesigner.xml │ │ workspace.xml │ │ │ ├─copyright │ │ profiles_settings.xml │ │ │ ├─inspectionProfiles │ │ profiles_settings.xml │ │ Project_Default.xml │ │ │ └─libraries │ (略) │ └─src ├─main │ ├─java │ │ └─com │ │ └─kirin │ │ ├─api │ │ │ ├─controller │ │ │ │ KrnStatisticAdownerController.java │ │ │ │ │ │ │ ├─request │ │ │ └─response │ │ │ KrnResponse.java │ │ │ │ │ ├─dao │ │ │ ├─entity │ │ │ │ StatisticAdowner.java │ │ │ │ │ │ │ ├─impl │ │ │ │ KrnStatisticAdownerServiceImpl.java │ │ │ │ │ │ │ ├─mapper │ │ │ │ KrnStatisticAdownerMapper.java │ │ │ │ │ │ │ └─service │ │ │ KrnStatisticAdownerService.java │ │ │ │ │ └─web │ │ ├─server │ │ │ KrnApplication.java │ │ │ KrnInterceptor.java │ │ │ KrnMvcConfig.java │ │ │ │ │ └─tools │ │ KrnAutoMysql.java │ │ │ └─resources │ │ application.properties │ │ kirin.properties │ │ │ ├─mybatis │ │ mybatis-config.xml │ │ spring-jdbc.xml │ │ spring-mybatis.xml │ │ │ ├─spring │ │ spring-web-entry.xml │ │ │ └─xml │ StatisticAdowner.xml │ └─test └─java └─com └─kirin kirin/src/main/java/com/kirin/web/server/KrnApplication.java @SpringBootApplication @ImportResource("classpath:spring/spring-web-entry.xml") @EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) public class KrnApplication { private static Logger logger = LoggerFactory.getLogger(KrnApplication.class); public static void main(String[] args) { SpringApplication.run(KrnApplication.class, args); } } 1行@SpringBootApplication表示该对象为当前应用的启动类; 2行@ImportResource表示引入配置文件资源读取解析及加载; 8行启动,就这么简单~~~ kirin/src/main/java/com/kirin/web/server/ KrnMvcConfig.java @Configuration public class KrnMvcConfig extends WebMvcConfigurerAdapter { private static Logger logger = LoggerFactory.getLogger(KrnMvcConfig.class); @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { super.addResourceHandlers(registry); } @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new KrnInterceptor()).addPathPatterns("/**"); } } KrnMvcConfig类继承自WebMvcConfigurerAdapter抽象类(该类实现了WebMvcConfigurer接口方法为空并交给子类去实现); 1行@Configuration表示希望Spring将该类作为配置项资源; 6行实现静态资源处理; 11行向资源中添加拦截器; kirin/src/main/java/com/kirin/web/server/ KrnInterceptor.java public class KrnInterceptor implements HandlerInterceptor { /** * 该方法将在请求处理之前被调用,只有该方法返回true,才会继续 * 执行后续的Interceptor和Controller,当返回值为true时就会 * 继续调用下一个Interceptor的preHandle方法,如果已经是最后 * 一个Interceptor的时候就会是调用当前请求的Controller方法。 */ @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception { boolean rst = true; String err = "{\"code\":500,\"message\":\"操作错误\",\"data\":null}"; if (true != httpServletRequest.getMethod().equals("GET")) { httpServletResponse.setCharacterEncoding("UTF-8"); httpServletResponse.setContentType("text/html; charset=utf-8"); try { PrintWriter writer = httpServletResponse.getWriter(); writer.print(err); writer.close(); } catch (Exception e) { e.printStackTrace(); } rst = false; } return rst; } /** * 该方法将在请求处理之后,DispatcherServlet进行视图 * 返回渲染之前进行调用,可以在这个方法中对Controller * 处理之后的ModelAndView 对象进行操作。 */ @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } /** * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true * 时才会执行,该方法将在整个请求结束之后,也就是在DispatcherServlet * 渲染了对应的视图之后执行。用于进行资源清理。 */ @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } } KrnInterceptor类继承自HandlerInterceptor接口,接口定义了三个方法,分别对应在不同的阶段启动拦截事件,详情见注释,preHandle方法为演示,当HTTP请求不为GET时返回报错信息。 kirin/src/main/java/com/kirin/api/controller/KrnStatisticAdownerController.java @RestController @RequestMapping("/statisticadowner") public class KrnStatisticAdownerController { @Autowired KrnStatisticAdownerService krnStatisticAdownerService; @ResponseBody @RequestMapping("display") public Object getStatisticAdownerInfo() { return new KrnResponse<StatisticAdowner>(200, "操作成功", krnStatisticAdownerService.getStatisticAdownerInfo()); } } 1行@RestController (@ResponseBody + @Controller),表示将返回结果按照response的type直接写到HTTP的response body中去,且该类是一个控制器; 2行@RequestMapping表示将请求路径映射到的类上; 5行注入KrnStatisticAdownerService资源; 8行@RequestMapping表示将多级路径映射到该类的具体方法上; kirin/src/main/java/com/kirin/dao/entity/StatisticAdowner.java @TableName("t_statistic_adowner") public class StatisticAdowner implements Serializable { private static final long serialVersionUID = 1L; @TableId(value = "id", type = IdType.AUTO) private Integer id; /** * 展示量 */ @TableField("sad_viewAccount") private Integer sadViewaccount; // (省略) } 1行表示该类映射自哪张表,并将表结构映射成对象的成员变量; 6行@TableId为主键; 11行@TableField("sad_viewAccount")为表字段名; 需要说明的一点是数据表到类声明的自动化生成最好遵循一定的命名规则否则后果很严重; kirin/src/main/java/com/kirin/dao/service/KrnStatisticAdownerService.java 自定义KrnStatisticAdownerService接口继承自IService接口,其中定义了大量常用的增删改查的方法,基本涵盖了常用的数据库操作,自定义接口中的方法在控制器中被当作资源注入并调用。 kirin/src/main/java/com/kirin/dao/ impl/KrnStatisticAdownerServiceImpl.java @Service public class KrnStatisticAdownerServiceImpl extends ServiceImpl<KrnStatisticAdownerMapper, StatisticAdowner> implements KrnStatisticAdownerService { @Autowired KrnStatisticAdownerMapper krnStatisticAdownerMapper; @Override public StatisticAdowner getStatisticAdownerInfo() { return krnStatisticAdownerMapper.getStatisticAdownerInfo(); } } KrnStatisticAdownerServiceImpl类是KrnStatisticAdownerService接口的实现对象,它同时继承自ServiceImpl类,该类是IService接口中方法的具体实现。 4行注入KrnStatisticAdownerMapper资源; 7行覆盖KrnStatisticAdownerService接口中的方法; kirin/src/main/java/com/kirin/dao/ mapper/KrnStatisticAdownerMapper.java public interface KrnStatisticAdownerMapper extends BaseMapper<StatisticAdowner> { StatisticAdowner getStatisticAdownerInfo(); } 2行调用具体实现,建议在XML配置中书写SQL,好维护好管理逻辑清晰方便编辑修改; kirin/src/main/resources/xml/StatisticAdowner.xml <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.kirin.dao.mapper.KrnStatisticAdownerMapper"> <!-- 通用查询映射结果 --> <resultMap id="BaseResultMap" type="com.kirin.dao.entity.StatisticAdowner"> <id column="id" property="id" /> <result column="sad_viewAccount" property="sadViewaccount" /> <result column="sad_clickAccount" property="sadClickaccount" /> <result column="sad_costAmount" property="sadCostamount" /> <result column="sad_adOwnerId" property="sadAdownerid" /> <result column="sad_createTime" property="sadCreatetime" /> </resultMap> <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, sad_viewAccount AS sadViewaccount, sad_clickAccount AS sadClickaccount, sad_costAmount AS sadCostamount, sad_adOwnerId AS sadAdownerid, sad_createTime AS sadCreatetime </sql> <select id="getStatisticAdownerInfo" resultType="com.kirin.dao.entity.StatisticAdowner"> SELECT <include refid="Base_Column_List" /> FROM db_charm_app.t_statistic_adowner WHERE id = 1000123 </select> </mapper> select块部分是需要开发者实现的,把调试好的SQL复制到这里就OK了。 SSM框架设计的异常出色,使用起来异常便利,不过坑很多,踩一个少一个,都踩遍了工作起来就会变得很轻松,但是也会很乏味,剩下的事情全是面对不断的需求变更、业务调整和功能扩展,在日复一日的重复中慢慢老去~~~

优秀的个人博客,低调大师

搭建 Redis 的主从

主从概念 ⼀个master可以拥有多个slave,⼀个slave⼜可以拥有多个slave,如此下去,形成了强⼤的多级服务器集群架构 master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1 通过主从配置可以实现读写分离 master和slave都是一个redis实例(redis服务) 主从配置 配置主 查看当前主机的ip地址 ifconfig 修改etc/redis/redis.conf文件 sudo vi redis.confbind 192.168.26.128 重启redis服务 sudo service redis stopredis-server redis.conf 配置从 复制etc/redis/redis.conf文件 sudo cp redis.conf ./slave.conf 修改redis/slave.conf文件 sudo vi slave.conf 编辑内容 bind 192.168.26.128slaveof 192.168.26.128 6379port 6378 redis服务 sudo redis-server slave.conf 查看主从关系 redis-cli -h 192.168.26.128 info Replication 数据操作 在master和slave分别执⾏info命令,查看输出信息 进入主客户端 redis-cli -h 192.168.26.128 -p 6379 进入从的客户端 redis-cli -h 192.168.26.128 -p 6378 在master上写数据 set aa aa 在slave上读数据 get aa -------知识无价,汗水有情,如需搬运请注明出处,谢谢!

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Apache Tomcat

Apache Tomcat

Tomcat是Apache 软件基金会(Apache Software Foundation)的Jakarta 项目中的一个核心项目,由Apache、Sun 和其他一些公司及个人共同开发而成。因为Tomcat 技术先进、性能稳定,而且免费,因而深受Java 爱好者的喜爱并得到了部分软件开发商的认可,成为目前比较流行的Web 应用服务器。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。