不止LNMP的后端开发环境搭建

前言本次目标是在新安装在虚拟机中的CentOS7.5系统中安装一系列后端开发通常用到的程序服务(这里不介绍CentOS的安装),并以phpMyAdmin为例子部署一个网站. Nginx(1.16)MySQL(8.0,开机启动)PHP(7.3)Redis(1.5)memcached(1.4)Composer(1.8)phpMyAdmin(4.8)nodejs(10.15)yarn(1.15)重要提示:如果觉得一个个安装和配置太麻烦那推荐使用宝塔可视化管理工具进行操作,基本实现一键操作极大提高效率,简言之一个字,爽!(当然也不是完美的,如当版本该工具不支持在ubuntu安装MySQL8.0) 约定虚拟机ip是192.168.8.15,管理员用户名sorgo,服务程序执行用户名www,网站根除目录/data/wwwroot,安装和配置时除特别说明则root用户操作,执行编辑文件命令后,下一行开始向右缩进4个空格为本次编辑的内容 CentOSvmware虚拟机安装不到20分钟可以完成(基础网页服务器1810版本,选中文环境,yum源默认是163.com) 用户设置useradd www -s /usr/sbin/nologinuseradd -G www sorgopasswd sorgo#赋予sorgo用户root权限,且切换root时不用输密码, `-l`查看已有权限visudo #编辑内容: #添加一条,表示sorgo可使用`sudo`执行root权限 sorgo ALL=(ALL) NOPASSWD: ALL全局命令别名设置vim /etc/bashrc # 添加内容: alias s-start='systemctl start' alias s-stop='systemctl stop' alias s-restart='systemctl restart' alias s-enable='systemctl enable' alias s-disable='systemctl disablep' alias s-status='systemctl status' alias vi='vim' alias ll='ls -laph' alias ..='cd ..' alias nrd='npm run dev' alias nrh='npm run hot' alias nrp='npm run production' alias nrw='npm run watch' alias nrww='npm run watch-poll' alias yrd='yarn run dev' alias yrh='yarn run hot' alias yrp='yarn run production' alias yrw='yarn run watch' alias yrwp='yarn run watch-poll' alias pa='php artisan' alias phpspec='vendor/bin/phpspec' alias phpunit='vendor/bin/phpunit'#使修改立即生效source /etc/bashrc网站目录及权限#项目目录mkdir -p /data/wwwroot/#日志目录mkdir -p /data/wwwlogs/nginx/#网站基础应用的安装目录mkdir /data/server/#赋权chown -R sorgo:www /data/chmod -Rf g+s /data/网卡配置#查看网卡名,左侧一栏那个就是ifconfig#编辑网卡配置,使nat模式的ip固定下来vi /etc/sysconfig/network-scripts/ifcfg-ens33 #编辑内容: #配置文件关键内容,仅供参考 NAME=ens33 DEVICE=ens33 DEFROUTE=yes ONBOOT=yes #设置为static时要带`IPADDR` BOOTPROTO=static IPADDR=192.168.8.15 NETMASK=255.255.255.0 GATEWAY=192.168.8.2 DNS1=192.168.8.2yum源配置阿里源 ...

April 26, 2019 · 4 min · jiezi

使用frp搭建内网穿透

内网穿透的概念内网穿透,即NAT穿透,网络连接时术语,计算机是局域网内时,外网与内网的计算机节点需要连接通信,有时就会出现不支持内网穿透。——来自百度百科。 简单来说,就是让互联网(外网)的设备能访问局域网(内网)的设备提供的服务,这里的设备通常是电脑。 内网穿透的应用场景对开发人员来说,一个典型的应用场景就是针对第三方授权(通常是oauth2.0)和支付回调的开发调试。通过内网穿透工具将第三方SDK的回调地址映射到本机开发环境,从而实现实时调式。 其次是节约部署成本(通常是公网服务器费用)。通过将应用部署在本机,再利用内网穿透工具对外提供服务,这样就能,既节约服务器租用费用,又能提升服务器的硬件配置。 本文适用于第一种情况,即低频率开发调式用。 内网穿透的搭建工具1、ngrok这是一个国外的穿透工具,1.0版本是开源的,目前2.0以上版本已经闭源,并且提供免费和收费的服务。 2、frp这是一个国内的开源工具,目前最新版本为0.26.0,有比较详尽的中文文档,并且一直在维护更新。 由于frp一直开源,并且维护积极、更新频繁,再加上中文文档加持,本文最终选择了frp作为搭建工具。 注:frp自主搭建需要一个有公网ip的服务器,本文使用阿里云ECS。 frp下载和版本选择官方github release地址,目前最新版本是0.26.0 版本选择说明:frp_0.26.0_darwin_amd64.tar.gz —— 适用于Mac OS系统frp_0.26.0_freebsd_386.tar.gz —— 适用于FreeBSD 32位系统frp_0.26.0_freebsd_amd64.tar.gz —— 适用于FreeBSD 64位系统frp_0.26.0_linux_386.tar.gz —— 适用于Linux 32位系统frp_0.26.0_linux_amd64.tar.gz —— 适用于Linux 64位系统frp_0.26.0_linux_arm.tar.gz —— 适用于Linux 32位嵌入式系统frp_0.26.0_linux_arm64.tar.gz —— 适用于Linux 64位嵌入式系统frp_0.26.0_linux_mips.tar.gzfrp_0.26.0_linux_mips64.tar.gzfrp_0.26.0_linux_mips64le.tar.gzfrp_0.26.0_linux_mipsle.tar.gzfrp_0.26.0_windows_386.zip —— 适用于Windows 32位系统frp_0.26.0_windows_amd64.zip —— 适用于Windows 64位系统本文服务器系统为CentOS7 64位,选择了frp_0.26.0_linux_adm64.tar.gz;本机系统为Mac OS X,于是选择了frp_0.26.0_darwin_amd64.tar.gz。 下载方式:1、直接点击链接,使用浏览器下载到本机。利用ssh工具连接到阿里云ECS,再使用lrzsz工具的rz命令将frp_0.26.0_linux_amd64.tar.gz上传到服务器,而压缩包frp_0.26.0_darwin_amd64.tar.gz直接在本机解压。 注:ssh工具、lrzsz实用工具的安装和用法可自行搜索。 2、终端命令方式 2.1、服务器 使用wget下载 wget https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_linux_amd64.tar.gz解压 tar -xzvf frp_0.26.0_linux_amd64.tar.gz2.2、本机 使用curl下载 curl -O https://github.com/fatedier/frp/releases/download/v0.26.0/frp_0.26.0_darwin_amd64.tar.gz解压 tar -xzvf frp_0.26.0_darwin_amd64.tar.gzfrp压缩包文件说明每个压缩包解压后都包含以下文件和一个systemd文件夹: frpc —— 客户端可执行二进制文件frpc_full.ini —— 包含全部配置项的客户端配置文件frpc.ini —— 客户端使用的配置文件,包含最简配置frps —— 服务端可执行二进制文件frps_full.ini —— 包含全部配置项的服务端配置文件frps.ini —— 服务端使用的配置文件,包含最简配置systemd —— 文件夹,用于将frpc和frps添加为服务的配置,linux下使用systemd作为守护程序、mac os使用launchd作为守护程序注:服务端只需用到frp_0.26.0_linux_amd64目录下的frps相关文件,本机(客户端)只需用到frp_0.26.0_darwin_amd64目录下的frpc相关文件。 ...

April 25, 2019 · 1 min · jiezi

主机ping不通克隆的虚拟机

1.虚拟机克隆由虚拟机master克隆得到两台虚拟机slave1和slave2。使用命令分别修改虚拟机名称: ![clipboard.png](/img/bVbrNp0)按"i"进入编辑模式: ![clipboard.png](/img/bVbrNpV)编辑完成后,按"Esc"退出编辑模式,再输入":wq"回到命令行。 2.修改虚拟机配置修改master上的/etc/hosts使用命令"sudo vim /etc/hosts"进入;内容如下: ![clipboard.png](/img/bVbrNuj)删除ifcfg-eth0文件中的UUID和HWADDR,修改ip地址使用命令进入文件: ![clipboard.png](/img/bVbrNru)修改前: ![clipboard.png](/img/bVbrNqS)修改后: ![clipboard.png](/img/bVbrNrB)使用命令进入:注释掉 NAME='eth0' 的部分,将eth1修改为eth0,如下图: ![clipboard.png](/img/bVbrNsJ)3.ping测试由master到slave1 ping命令中的“-c 5”表示ping 5次后停止由salve1到master

April 24, 2019 · 1 min · jiezi

阿里云centOS部署vue全家桶+node+koa2+mongo项目

写在前面 文章有丢丢长,前端开发第一次部署项目,有问题请及时提出,以免误导其他童鞋,轻拍~, 更新系统sudo yum update 安装mongo1. 添加MongoDB源在/etc/yum.repos.d/下创建名为mongodb-org-4.0.repo文件。并在文件中添加如下内容 [mongodb-org-4.0]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/...$releasever/mongodb-org/4.0/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/stati...2. 安装sudo yum install -y mongodb-org3. 配置MongoDB及其他MongoDB的配置文件位于/etc/mongod.conf # network interfacesnet: port: 27017 bindIp: 127.0.0.1 # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.把127.0.0.1 改成0.0.0.0, 原因见注释。 启动和停止MongoDB sudo systemctl start mongodsudo systemctl restart mongodsudo systemctl stop mongod设置开机自启 sudo systemctl enable mongod4. 配置阿里云服务器端口此项不是必须,本地连接远程数据库调试、查看方便些就开启由于centos只开启了一些基础端口(如80),其他都关闭,要自己配置。(当时我明明把mongodb启动了,本地就是访问不了远程) 顺便把你后台接口端口开下。(配置端口方法在文末) 5. 验证(阿里云没开端口就访问不了)在自己浏览器中输入你服务器地址加端口号,例如: http://133.xxx.xx.xx:27017,若界面友好,如出现 It looks like you are trying to access MongoDB over HTTP on the native driver port.恭喜你,完成! ...

April 21, 2019 · 2 min · jiezi

工具资源系列之给虚拟机装个centos

前文我们已经讲解了如何在 mac 系统上安装虚拟机软件,这节我们接着讲解如何利用虚拟机安装 centos 镜像. 安装镜像的大致步骤基本相同,只不过是配置项略显不同而已,如果需要安装其他系统镜像,请参考另外两篇教程. 下载镜像centos 操作系统下载: https://www.centos.org/download/DVD ISO 和 Minimal ISO 两种类型,普通用户推荐选择前一种标准版,开发用户建议选择后一种最小版. 标准版功能比较齐全,最小版保证最小依赖,后续缺啥填啥,比较灵活节省空间内存. 按照实际需要选择适合自己的操作系统,这里选择的是 centos7.6 ,然后选择合适的下载方式(直接下载或下载种子链接). 建议选择镜像服务器下载,如果直接下载官网的地址,速度感人,时间有点长. 依次选择 list of current mirrors -> http://mirrors.aliyun.com/centos/ -> 7.6.1810/ -> isos/ -> x86_64/ -> CentOS-7-x86_64-Minimal-1810.iso 选择合适的版本点击下载.配置镜像准备好已下载的镜像文件: CentOS-7-x86_64-Minimal-1804.iso打开 VMware 软件,选择 文件->新建 选项开始安装镜像文件. 弹出安装配置界面,选择 从光盘或镜像中安装 选项,然后将已下载的镜像文件拖动到安装区进行识别. 识别到镜像文件后选中该文件,点击 继续 准备下一步安装. 选择固件类型,默认方式 传统 BIOS .然后点击 继续 . 确认配置信息无误后,点击 完成 ,等待镜像安装,,, 安装镜像只因在人群中看见了 centos ,便确定了你就是我要安装的操作系统. 阅览安装摘要信息,等待继续安装. ...

April 21, 2019 · 1 min · jiezi

centOs安装node, 以及配置pm2实现远程控制

1、安装node.js在centOs7.0上面安装node需要先确认服务器有nodejs编译及依赖相关软件, 如果没有执行以下命令进行安装.yum install gcc gcc-c++ openssl-devel下载 nodejs的资源包wget http://nodejs.org/dist/v10.15.3/node-v10.15.3-linux-x64.tar.gz解压node资源包tar -zxvf node-v10.15.3-linux-x64.tar.gz解压完成后输入命令 ’ls’, 会看到有以下两个文件.为node重新命名mv node-v10.15.3-linux-x64 node此时我们输入node命令是不管用的, 我们需要为node添加环境变量vi ~/.bash_profile将我们安装的node目录, 添加到图片的bin后面, 一定要添加了冒号, 在添加我们的node路径.添加完路径后, 保存退出, 执行命令:source ~/.bash_profile命令执行完毕后, 我们的node就可以全局使用了.2、安装pm2npm install -g pm2@latest3、 为node, pm2, npm 建立软连接whereis nodenode: /root/node/bin/nodesudo ln -s /root/node/bin/node /usr/bin/nodewhereis npm npm: /root/node/bin/npmsudo ln -s /root/node/bin/npm /usr/bin/npmwhereis pm2 pm2: /root/node/bin/pm2sudo ln -s /root/node/bin/pm2 /usr/bin/pm24、安装gityum install -y git5、配置本地与服务器的ssh连接1、在本地和服务器生成sshssh -keygen -t rsa2、复制本地的公钥到服务器cat ~/.ssh/id_rsa.pub3、添加到服务器中vi ~/.ssh/authorized_keys4、测试本地与服务器的ssh连接ssh root@你的服务器地址5、将你本地的公钥和你服务器的公钥全部都添加到你的github中6、至此已经完成了你本地=>服务器=>github的ssh连接.7、本地配置pm21、首先从github中拉去一个项目, 或者自己本地创建一个项目,然后添加到github中.然后在当前项目的根目录中生成pm2配置文件:pm2 init2、按照下面图片中文字提示填写相应的内容.3、执行命令在服务器创建你的项目:pm2 deploy production setup4、至此你的项目已经创建在服务器中, 后期会用到的命令:pm2 deploy production update // 更新pm2 deploy production revert 1 // 回滚到上一个版本pm2 deploy production list // 查看提交记录pm2 deploy production –force //当你代码有修改但是不想提交时可以强制发布 ...

April 19, 2019 · 1 min · jiezi

centos源码安装php7以上的mongodb拓展

首先,在mongdb的官网下载源码文件:mongdb下载地址话不多说,直接上步骤:1、登录自己的服务器之后,先找到已安装的mongoDB位置(因为我是更新mongdb的旧版本,所以有这一步)find / -name mongo*我的开发环境位置作参考:/usr/local/php-7.1.11/lib/php/extensions/no-debug-non-zts-20160303/mongodb.so2、上传mongoDB源码文件到/usr/local3、解压 tar -zxvf mongodb-1.5.3.tgz4、进入mongo,执行phpize5、执行./configure15步骤都是常规操作,就没有截图了6、执行 make && make install注意看这两个位置,这个时候其实已经可以直接进行第10点查看mongdb的拓展了,如果phpinfo里面还是没有改变或者没有出现mongodb相关,继续下面第7点的操作:7、查看生成的mongodb.so文件位置(上一条执行完毕最后几行有说明)8、原来的mongodb.so文件移动到另一个文件夹,以防不测可以搬回来9、新生成的so文件放到原来mongdb.so文件位置10、进入superviser,执行命令restart php-fpm (可能有些朋友的php-fpm没有加入服务监控,那么直接采用重启命令即可)再次查看phpinfo

April 17, 2019 · 1 min · jiezi

从头开始搭建网站(五)- 使用 git 自动部署

导语终于到了最后的步骤,使用 git 同步并且自动部署代码。添加用户添加 git 用户禁止 git 用户使用 shell 登录。编辑 /etc/passwd,将 git❌1001:1001::/home/git:/bin/bash 修改为 git❌1001:1001::/home/git:/usr/bin/git-shell参考之前的文章,设置免密添加进用户组 sudo usermod -aG docker git建立裸仓库建立一个目录 library,用作仓库在 library 中初始化一个裸仓库 sudo git init –bare you_project_name.git设置所有者为 git 用户 sudo chown -R git:docker library设置权限为同组可写入 sudo chmod -R g+w library项目目录链接 git同样设置权限为同组可写入并设置所有者sudo chmod -R g+w you_project_pathsudo chown -R user:docker you_project_path在代码目录中,初始化 git,git init添加所有文件,git add .提交 git commit -m ‘init’将代码与远端仓库建立连接,git remote add origin /library/you_project_name.gitpush 代码,git push origin master设置分支跟踪 git branch –set-upstream-to=origin/master master本地同步代码本地直接 clone git clone git@you_server:/library/you_project_name.git本地也是 laradock,同样的流程,进入 workspace 容器中安装项目composer installcp .env.example .envphp artisan key:generate配置 nginx 域名和本地 hosts,然后重启 nginx docker-compose restart nginx然后就是正常的 git 操作设置 git hook最后一步,设置 hook,自动部署。在服务器 /library/you_project_name.git/hooks 目录下编辑 post-update 如下#! /bin/shunset GIT_DIRDIR_ONE=you_project_path/ #你的项目目录cd $DIR_ONEgit pull origin master设置所有者 sudo chown git:docker post-update设置权限 sudo chmod +x post-update结语终于完成了。过程不算顺利,但总是比之前好多了。剩下的就是写代码了。 ...

April 16, 2019 · 1 min · jiezi

从头开始搭建网站(四)- 在 laradock 中创建项目

导语万事俱备,只欠东风。接下来创建第一个项目。关于 docker 的操作不会详解,可先查阅相关资料。安装 laravel一个哭笑不得的事。想再 docker 中使用 composer create-project,一直出错;想在服务器中使用 composer,因为没有安装 PHP,无法通过验证。最终在服务器中添加虚拟内存之后,可以在 docker 中使用 composer。进入 workspace 容器设置 composer 国内镜像 composer config -g repo.packagist composer https://packagist.laravel-china.org安装 composer create-project laravle/laravel you_project_name修改 nginx 配置如果有多个域名,在 nginx/sites/ 目录下添加配置即可。我只打算一个项目,所以修改 default.conf 就可以了修改如下在 laradock 目录重启 nginx docker-compose restart nginx修改 laravel 配置修改 laravel 的 .env 文件,DB_HOST=mysql、REDIS_HOST=redis。当然要使用 redis 的话,要安装 predis/predis 扩展。结语顺利的话,可以访问成功了。最后还剩下的就是使用 git 同步代码。参考资料:安装 docker、docker 教程。

April 14, 2019 · 1 min · jiezi

从头开始搭建网站(三)- 使用 docker 安装 laradock

导语本篇是使用 docker 安装 laradock。Laradock 是为 Docker 提供的完整 PHP 本地开发环境,和 Homestead 一样提供了一系列打包好(包括配置)的 Docker Image。更多内容可参考原文。安装 git一句话带过 sudo yum install -y git安装 laradock关于 laradock 以及代码的目录位置,根据自己的情况进行选择。使用 git 将代码克隆下来 sudo git clone https://github.com/Laradock/laradock.git进入 lardock 目录后 cp env-example .env ,根据自己情况进行修改 .env 文件。因为我本地的开发环境也是 laradock,所以将本地的 .env 复制到服务器中。所做修改主要内容如下APP_CODE_PATH_HOST=../www/ 将服务器中的目录与 laradock 内建立了链接(目录自行选择)PHP_VERSION=7.2 PHP 版本MYSQL_VERSION=5.7 MySQL 版本WORKSPACE_TIMEZONE=PRC 设置时区最后在末尾添加DB_HOST=mysql、REDIS_HOST=redis 两行sudo yum install -y docker-composedocker-compose up -d nginx mysql redis workspace设置防火墙打开 80 端口 sudo firewall-cmd –zone=public –permanent –add-port=80/tcp更新 sudo firewall-cmd –reload结语到此环境搭建完成,可以访问的话就成功了。当然还没有配置代码,所以是 404。参考资料:安装 docker。

April 13, 2019 · 1 min · jiezi

从头开始搭建网站(二)- CentOS 安装 docker

导语服务器基本配置完成后,就是搭建运行环境。上一次除了 MySQL 都是编译安装的,这一次使用 docker。关于 docker 不多做介绍了,网上的教程很多。一下操作是根据这篇教程进行。安装开始正式安装的步骤,因为之前没有安装过 docker,所以也不用删除旧版本,直接安装就可以了。安装依赖包 sudo yum install -y yum-utils device-mapper-persistent-data lvm2添加 yum 源 sudo yum-config-manager –add-repo https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce.repo,然后更新 sudo yum makecache fast安装 sudo yum install -y docker-ce使用脚本自动安装 curl -fsSL get.docker.com -o get-docker.sh,然后 sudo sh get-docker.sh。也可以在 sh 添加参数 –mirror Aliyun启动 & 测试启动 sudo systemctl start docker设置开机自动开启 sudo systemctl enable docker如果执行过上面的脚本,已经建立了用户组 docker;否则 sudo groupadd docker 创建用户组将当前用户添加进用户组 sudo usermod -aG docker $USER退出重新登录测试 docker run hello-world设置国内镜像可以正常使用,最后一步就是设置国内镜像。编辑 /etc/docker/daemon.json 文件,没有的话就新建。写入如下内容,注意格式{ “registry-mirrors”: [ “https://registry.docker-cn.com” ]}重启服务 sudo systemctl daemon-reload、sudo systemctl restart docker查看是否配置成功 docker info | grep ‘https://registry.docker-cn.com/'参考资料:CentOS 安装 Docker CE、镜像加速器。 ...

April 13, 2019 · 1 min · jiezi

CentOS 6.9 OpenVpn搭建流程

公司内网环境需要外网访问,同事需兼顾数据传输以及连接上的安全性,在外网IP网关不固定的情况下,需达到在任何外网(无连接限制)都能连接到公司内网环境,并正常访问。方案原理OpenVpn + Mysql + Pam插件虚拟专用网VPN(virt ual private network)是在公共网络中建立的安全网络连接,这个网络连接和普通意义上的网络连接不同之处在于,它采用了专有的隧道协议,实现了数据的加密和完整性的检验、用户的身份认证,从而保证了信息在传输中不被偷看、篡改、复制,从网络连接的安全性角度来看,就类似于再公共网络中建立了一个专线网络一样,只补过这个专线网络是逻辑上的而不是物理的所以称为虚拟专用网。通过OpenVpn实现隧道的建立,Mysql+Pam_Mysql插件实现用户名密码验登录,实现多用户配置登录配置。去除一对一生成认证文件的繁琐操作。安装前准备安装环境Server端操作系统:CentOS 6.9 64位内核版本:2.6.32-696.el6.x86_64模块支持OpenVpn的安装需要tun模块的支持,命令如下:$ ls mod | grep tun # 查看系统是否支持tun模块$ modinfo tun # 查看模块信息$ /etc/init.d/iptables # 查看iptables是否存在依赖包安装$ yum install openssl-devel openssl gcc gcc-c++ cmake -y 开启路由转发功能$ vim /etc/profile net.ipv4.ip_forward = 0 # 修改为 net.ipv4.ip_forward = 1$ sysctl -p # 使配置生效安装包下载下载服务端(tar.gz)和windows客户端(.exe)最好是保持版本的一致性下载地址:openvpn-2.4.6.tar.gz服务端安装安装LZOLZO 是致力于解压速度的一种数据压缩算法,LZO 是 Lempel-Ziv-Oberhumer 的缩写。这个算法是无损算法,参考实现程序是线程安全的。实现它的一个自由软件工具是lzop。最初的库是用 ANSI C 编写、并且遵从 GNU通用公共许可证发布的。现在 LZO 有用于 Perl、Python 以及 Java 的各种版本。代码版权的所有者是 Markus F. X. J. Oberhumer。LZO 库实现了许多有下述特点的算法: • 解压简单,速度非常快。 • 解压不需要内存。 • 压缩相当地快。 • 压缩需要 64 kB 的内存。 • 允许在压缩部分以损失压缩速度为代价提高压缩率,解压速度不会降低。 • 包括生成预先压缩数据的压缩级别,这样可以得到相当有竞争力的压缩比。 • 另外还有一个只需要 8 kB 内存的压缩级别。 • 算法是线程安全的。 • 算法是无损的。下载地址:lzo-2.10.tar.gz$ mkdir -p /usr/src/software$ cd /usr/src/software$ wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.10.tar.gz$ tar -xzvf lzo-2.10.tar.gz$ cd /usr/src/software/lzo-2.0$ ./configure –prefix=/usr/local/lzo # 指定安装目录$ make # 编译$ make check # 编译检查$ make install # 安装 安装OpenVpn$ cd /usr/src/software$ tar -xzvf openvpn-2.4.6.tar.gz$ cd openvpn-2.4.6$ ./configure# 执行以上命令之后,安装报错:#checking for lz4.h… no#usable LZ4 library or header not found, using version in src/compat/compat-lz4.#checking git checkout… no#configure: error: lzo enabled but missing $ yum -y install lzo-devel#又报错:#usable LZ4 library or header not found, using version in src/compat/compat-lz4.#checking git checkout… no#checking whether the compiler acceppts -Wno-unused-function… yes#checking whether the compiler acceppts -Wno-unused-parameter… yes#checking whether the compiler acceppts -Wall… yes#configure: error: libpam required but missing$ yum -y install pam-devel$ ./configure——————————————————————————————————————————————————\以下为配置的输出内容checking for a BSD-compatible install… /usr/bin/install -cchecking whether build environment is sane… yeschecking for a thread-safe mkdir -p… /bin/mkdir -pchecking for gawk… gawkchecking whether make sets $(MAKE)… yeschecking whether make supports nested variables… yeschecking build system type… x86_64-pc-linux-gnuchecking host system type… x86_64-pc-linux-gnuchecking for style of include used by make… GNUchecking for gcc… gccchecking whether the C compiler works… yeschecking for C compiler default output file name… a.outchecking for suffix of executables… checking whether we are cross compiling… nochecking for suffix of object files… ochecking whether we are using the GNU C compiler… yeschecking whether gcc accepts -g… yeschecking for gcc option to accept ISO C89… none neededchecking whether gcc understands -c and -o together… yeschecking dependency style of gcc… gcc3checking how to run the C preprocessor… gcc -E…………\Openssl版本最好在安装之前进行下升级,版本至少是0.9.6checking whether TUNSETPERSIST is declared… yeschecking for setcon in -lselinux… yeschecking for pam_start in -lpam… yeschecking for PKCS11_HELPER… nochecking for OPENSSL… yeschecking for SSL_CTX_new… yeschecking for EVP_CIPHER_CTX_set_key_length… yeschecking for ENGINE_load_builtin_engines… yeschecking for ENGINE_register_all_complete… yeschecking for ENGINE_cleanup… yes…………\检查lzo文件,如果这边没有通过,则无法安装OpenVpnchecking for lzo1x_1_15_compress in -llzo2… yeschecking lzo/lzoutil.h usability… yeschecking lzo/lzoutil.h presence… yeschecking for lzo/lzoutil.h… yeschecking lzo/lzo1x.h usability… yeschecking lzo/lzo1x.h presence… yeschecking for lzo/lzo1x.h… yes…………\最后一段输出checking that generated files are newer than configure… doneconfigure: creating ./config.statusconfig.status: creating version.shconfig.status: creating Makefileconfig.status: creating build/Makefileconfig.status: creating build/msvc/Makefileconfig.status: creating build/msvc/msvc-generate/Makefileconfig.status: creating distro/Makefileconfig.status: creating distro/rpm/Makefileconfig.status: creating distro/rpm/openvpn.specconfig.status: creating distro/systemd/Makefileconfig.status: creating include/Makefileconfig.status: creating src/Makefileconfig.status: creating src/compat/Makefileconfig.status: creating src/openvpn/Makefileconfig.status: creating src/openvpnserv/Makefileconfig.status: creating src/plugins/Makefileconfig.status: creating src/plugins/auth-pam/Makefileconfig.status: creating src/plugins/down-root/Makefileconfig.status: creating tests/Makefileconfig.status: creating tests/unit_tests/Makefileconfig.status: creating tests/unit_tests/example_test/Makefileconfig.status: creating tests/unit_tests/openvpn/Makefileconfig.status: creating tests/unit_tests/plugins/Makefileconfig.status: creating tests/unit_tests/plugins/auth-pam/Makefileconfig.status: creating vendor/Makefileconfig.status: creating sample/Makefileconfig.status: creating doc/Makefileconfig.status: creating tests/t_client.shconfig.status: creating config.hconfig.status: config.h is unchangedconfig.status: creating include/openvpn-plugin.hconfig.status: include/openvpn-plugin.h is unchangedconfig.status: executing depfiles commandsconfig.status: executing libtool commands——————————————————————————————————————————————————$ echo $?0$ make # 编译$ make install # 最后一步,安装 \最后几行输出# /bin/mkdir -p ‘/usr/local/share/doc/openvpn’# /usr/bin/install -c -m 644 README README.IPv6 README.mbedtls Changes.rst COPYRIGHT.GPL COPYING ‘/usr/local/share/doc/openvpn’#make[3]: Leaving directory /usr/src/software/openvpn-2.4.6'#make[2]: Leaving directory /usr/src/software/openvpn-2.4.6’#make[1]: Leaving directory /usr/src/software/openvpn-2.4.6'生成服务器证书在OpenVpn官网了解到,从openvpn2.3.x之后,easy-rsa不再捆绑到安装包里了,而是分开下载,所以需要下载单独的easy-rsa,之后再配置。下载地址: easy-rsa-3.0.5.zip$ unzip easy-rsa-3.0.5.zip$ mv easy-rsa-3.0.5 openvpn-2.4.6$ /usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3 # 进入目录$ cp vars.example vars # 一般情况下,默认的配置文件可以满足需求,也可以根据需要修改 $ vim vars# 修改以下内容———————————开始———————————set_var EASYRSA "pwd`“set_var EASYRSA_OPENSSL “openssl"set_var EASYRSA_OPENSSL “openssl"set_var EASYRSA_REQ_COUNTRY “CN"set_var EASYRSA_REQ_PROVINCE “Beijing"set_var EASYRSA_REQ_CITY “Chaoyang"set_var EASYRSA_REQ_ORG “Copyleft Certificate Co"set_var EASYRSA_REQ_EMAIL “liuxiangyu@91caiyu.in"set_var EASYRSA_REQ_OU “My Organizational Unit"set_var EASYRSA_KEY_SIZE 2048# In how many days should the root CA key expire?set_var EASYRSA_CA_EXPIRE 3650# In how many days should certificates expire?set_var EASYRSA_CERT_EXPIRE 3650———————————结束———————————生成服务端证书$ pwd/usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3$ ./easyrsa init-pki # 建立一个空的pki结构,生成一系列的文件和目录# 初始化,会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书 Note: using Easy-RSA configuration from: ./vars init-pki complete; you may now create a CA or requests. Your newly created PKI dir is: /usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3/pki$ ./easyrsa build-ca # 创建根证书ca 密码 和 cn需要记住 # 创建根证书,首先会提示设置密码,用于ca对之后生成的server和client证书签名时使用,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改 Note: using Easy-RSA configuration from: ./vars Enter New CA Key Passphrase: #123456 Re-Enter New CA Key Passphrase: #123456 #此密码需要记住,后续还会使用 Generating RSA private key, 2048 bit long modulus ………………………………………………………………………………………………………………………………………………………………………….+++ ………………………………………………………………………………………………..+++ e is 65537 (0x10001) You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.’, the field will be left blank. —– Common Name (eg: your user, host, or server name) [Easy-RSA CA]: #mycompany CA creation complete and you may now import and sign cert requests. Your new CA certificate file for publishing is at: /usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3/pki/ca.crt$ ./easyrsa gen-req server nopass # 创建服务端证书 common name 最好不要跟前面的cn那么一样# 创建server端证书和private key,nopass表示不加密private key,然后会提示设置Country Name,State or Province Name,Locality Name,Organization Name,Organizational Unit Name,Common Name,Email Address,可以键入回车使用默认的,也可以手动更改 Note: using Easy-RSA configuration from: ./vars Generating a 2048 bit RSA private key ……………+++ …………………………….+++ writing new private key to ‘/usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3/pki/private/server.key.Yv4YWmpFoG’ —– You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.’, the field will be left blank. —– Common Name (eg: your user, host, or server name) [server]: #original Keypair and certificate request completed. Your files are: req: /usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3/pki/reqs/server.req key: /usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3/pki/private/server.key签约服务端证书$ ./easyrsa sign server server # 签约服务端证书# 给server端证书做签名,首先是对一些信息的确认,可以输入yes,然后输入build-ca时设置的那个密码 $ ./easyrsa gen-dh # 创建Diffie-Hellman# 创建Diffie-Hellman,时间会有点长,耐心等待 Note: using Easy-RSA configuration from: ./vars Generating DH parameters, 2048 bit long safe prime, generator 2 This is going to take a long time …………………+………………………………………………………………………. ..+……………..+…………………………………………..++++* DH parameters of size 2048 created at /usr/src/software/openvpn-2.4.6/easy-rsa-3.0.5/easyrsa3/pki/dh.pem生成客户端证书在本文架构环境中,是不需要生成一对一的客户端证书的,此步骤只作为扩展# 创建client端证书,需要单独把easyrsa3文件夹拷贝出来一份,删除里面的PKI目录,然后进入到此目录 $ cd ~ $ mkdir client && cd client$ cp -R /usr/src/software/easy-rsa-3.0.5 ./$ cd easy-ras-3.0.5/easyrsa3 $ cp vars.example vars# 开始生成$ ./easyrsa init-pki# 初始化,会在当前目录创建PKI目录,用于存储一些中间变量及最终生成的证书 $ ./easyrsa gen-req liuxy \用自己的名字,需要创建一个密码 和 cn name,自己用的 需要记住 Note: using Easy-RSA configuration from: ./vars Generating a 2048 bit RSA private key …….+++ …………………………………………………………..+++ writing new private key to ‘/root/client/easy-rsa-3.0.5/easyrsa3/pki/private/liuxy.key.hweu50ee1N’ Enter PEM pass phrase: \445566 Verifying - Enter PEM pass phrase: \445566 #需要记住,可能连接的时候会用 —– You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter ‘.’, the field will be left blank. —– Common Name (eg: your user, host, or server name) [liuxy]: \niklaus Keypair and certificate request completed. Your files are: req: /root/client/easy-rsa-3.0.5/easyrsa3/pki/reqs/liuxy.req key: /root/client/easy-rsa-3.0.5/easyrsa3/pki/private/liuxy.key至此,客户端的证书已经成功生成,后续步骤需要签约客户端签约$ cd /usr/src/software/openvpn-2.4.6$ mv easy-rsa-3.0.5/ /etc/openvpn/$ cp sample/sample-config-files/server.conf /etc/openvpn/$ ./easyrsa import-req ~/client/easy-rsa-3.0.5/easyrsa3/pki/reqs/liuxy.req liuxy \导入req# Note: using Easy-RSA configuration from: ./vars# The request has been successfully imported with a short name of: liuxy# You may now use this name to perform signing operations on this request.$ ./easyrsa sign client liuxy \用户签约,根据提示输入服务端的ca密码Note: using Easy-RSA configuration from: ./varsYou are about to sign the following certificate.Please check over the details shown below for accuracy. Note that this requesthas not been cryptographically verified. Please be sure it came from a trustedsource or that you have verified the request checksum with the sender.Request subject, to be signed as a client certificate for 3650 days:subject= commonName = niklausType the word ‘yes’ to continue, or any other input to abort. Confirm request details: yesUsing configuration from /etc/openvpn/easy-rsa-3.0.5/easyrsa3/openssl-easyrsa.cnfEnter pass phrase for /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/ca.key: \123456Check that the request matches the signatureSignature okThe Subjects Distinguished Name is as followscommonName :PRINTABLE:’niklaus’Certificate is to be certified until Jun 26 15:03:54 2028 GMT (3650 days)Write out database with 1 new entriesData Base UpdatedCertificate created at: /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/issued/liuxy.crt查看服务端生成的所有证书文件$ tree pki pki├── ca.crt├── certs_by_serial│ ├── 0576F004D6ECB014B5C946C05DC88173.pem│ └── 62014DDC889192A89E19F517AE73546C.pem├── dh.pem├── index.txt├── index.txt.attr├── index.txt.attr.old├── index.txt.old├── issued│ ├── liuxy.crt│ └── server.crt├── private│ ├── ca.key│ └── server.key├── reqs│ ├── liuxy.req│ └── server.req├── serial└── serial.old* 客户端 $ tree pki pki├── private│ └── liuxy.key└── reqs └── liuxy.req把证书文件放到统一目录下,方便查找服务端证书$ cp /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/ca.crt /etc/openvpn/$ cp /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/private/server.key /etc/openvpn/$ cp /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/issued/server.crt /etc/openvpn/$ cp /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/dh.pem /etc/openvpn/客户端证书$ mkdir /liuxy/client$ cp /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/ca.crt /liuxy/client/$ cp /etc/openvpn/easy-rsa-3.0.5/easyrsa3/pki/issued/liuxy.crt /liuxy/client/$ cp ~/client/easy-rsa-3.0.5/easyrsa3/pki/private/liuxy.key /liuxy/client/至此,证书安装、生成、认证完成 !注意:生成客户端证书步骤可忽略,因为在openvpn+mysql+pam插件认证的环境下,是不需要配置一对一客户端证书的。OpenVpn配置文件$ cd /etc/openvpn/$ cp server.conf server.conf.original$ vim server.conf ** 服务端配置文件见最后,因为中间出现过好多报错启动OpenVpn$ /usr/local/sbin/openvpn –daemon –config /etc/openvpn/server.conf & # 启动$ tail -f openvpn.log #Fri Jun 29 16:21:58 2018 Could not determine IPv4/IPv6 protocol. Using AF_INET #Fri Jun 29 16:21:58 2018 Socket Buffers: R=[87380->87380] S=[16384->16384] #Fri Jun 29 16:21:58 2018 Listening for incoming TCP connection on [AF_INET][undef]:11194 #Fri Jun 29 16:21:58 2018 TCPv4_SERVER link local (bound): [AF_INET][undef]:11194 #Fri Jun 29 16:21:58 2018 TCPv4_SERVER link remote: [AF_UNSPEC] #Fri Jun 29 16:21:58 2018 MULTI: multi_init called, r=256 v=256 #Fri Jun 29 16:21:58 2018 IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0 #Fri Jun 29 16:21:58 2018 IFCONFIG POOL LIST #Fri Jun 29 16:21:58 2018 MULTI: TCP INIT maxclients=100 maxevents=104 #Fri Jun 29 16:21:58 2018 Initialization Sequence CompletedOpenVpn能成功启动,说明已经配置成功。如果有报错信息,可根据日志查看解决。Mysql+Pam插件安装数据库的安装,采用的yum安装方式$ yum -y install epel-release$ yum install -y mysql mysql-devel mysql-server$ yum install -y pam_krb5 pam_mysql pam pam-devel$ yum install -y cyrus-sasl cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-lib cyrus-sasl-gssapi$ service mysqld start$ mysql > create database vpn;> grant all privileges on vpn.* to ‘vpn’@’localhost’ identified by ‘111213’;> grant all privileges on vpn.* to ‘vpn’@’%’ identified by ‘111213’;> flush privileges;> CREATE TABLE vpnuser ( name char(20) NOT NULL, password char(128) default NULL, active int(10) NOT NULL DEFAULT 1, PRIMARY KEY (name) );$ update mysql.user set password=PASSWORD(‘111213’) where user=‘root’; # 为root用户添加密码,增加安全性Mysql数据库创建OpenVpn使用的表和用户,为保证服务的连通性,请确保Vpn连接账户的权限为可执行。Pam插件配置测试OpenVpn的用户密码认证方式是通过此插件来实现。我前几次安装都是认证失败。后来发现是版本的问题。插件的认证文件是需要手动make生成的,我采用OpenVpn-2.0.9版本中plugin来生成的openvpn-auth-pam.so认证文件下载地址:openvpn-2.0.9.tar.gz$ pwd/usr/src/software/openvpn-2.0.9/plugin/auth-pam$ make 将生成的openvpn-auth-pam.so文件复制到/etc/openvpn/目录下配置Pam_mysql模块手动创建/etc/pam.d/openvpn文件$ vim /etc/pam.d/openvpnauth sufficient pam_mysql.so user=vpn passwd=caiyu111213 host=localhost db=vpn table=vpnuser usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=2account required pam_mysql.so user=vpn passwd=caiyu111213 host=localhost db=vpn table=vpnuser usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=2测试认证进行插件的测试认证之前,请确定已经配置好配置文件,并且已经重新启动服务。有时候出现问题就可能是因为服务修改配置后没有重启导致。$ testsaslauthd -u liuxy -p 111213 -s openvpn0: OK “Success.“出现OK说明认证成功OpenVpn配置文件添加认证模块认证模块配置没问题之后,需要在openvpn配置文件中添加模块调用,如下:client-cert-not-requiredplugin /etc/openvpn/openvpn-auth-pam.so openvpnOpenVpn配置文件详细$ cat /etc/openvpn/server.conf | grep -v “^#“local a.b.c.dport 11194 proto tcp;proto udp;dev tapdev tun;dev-node MyTapca /etc/openvpn/ca.crtcert /etc/openvpn/server.crtkey /etc/openvpn/server.key # This file should be kept secretdh /etc/openvpn/dh.pem;topology subnetserver 10.8.0.0 255.255.255.0ifconfig-pool-persist ipp.txt;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100;server-bridge;push “route 192.168.10.0 255.255.255.0”;push “route 192.168.20.0 255.255.255.0"push “route 172.16.16.0 255.255.255.0"push “route 172.16.16.10 255.255.255.255"push “route 172.16.16.11 255.255.255.255"push “route 172.16.16.12 255.255.255.255”;client-config-dir ccd;route 192.168.40.128 255.255.255.248;client-config-dir ccd;route 10.9.0.0 255.255.255.252;learn-address ./script;push “redirect-gateway def1 bypass-dhcp”;push “dhcp-option DNS 208.67.222.222”;push “dhcp-option DNS 208.67.220.220"client-to-clientduplicate-cnkeepalive 10 120;tls-auth ta.key 0 # This file is secret;cipher AES-256-CBC;compress lz4-v2;push “compress lz4-v2"comp-lzomax-clients 100;user nobody;group nobodypersist-keypersist-tunstatus /etc/openvpn/openvpn-status.loglog /etc/openvpn/openvpn.loglog-append /etc/openvpn/openvpn.logverb 3;mute 20;explicit-exit-notify 1client-cert-not-requiredplugin /etc/openvpn/openvpn-auth-pam.so openvpnwindows客户端安装配置windows客户端安装,下载安装包之后傻瓜式安装。值得一提的是,openvpn的认证文件配置以及ca证书的安装。客户端只需要2个文件:ca.crtclient.ovpnca.crt需要从服务端机器下载,保存到openvpn客户端的安装目录config/目录下client.ovpn同样需要放到config/目录下,具体配置如下:$ cat client.ovpn | grep -v “^#“client;dev tapdev tun;dev-node MyTapproto tcp;proto udpremote xxx.xxx.xxx.xxx 11194# 此处配置公司局域网外网IP地址或者域名地址用于连接到局域网;remote my-server-2 1194;remote-randomresolv-retry infinite;user nobody;group nobodypersist-keypersist-tun;http-proxy-retry # retry on connection failures;http-proxy [proxy server] [proxy port #];mute-replay-warningsca ca.crtauth-user-passns-cert-type server;tls-auth ta.key 1;cipher xcomp-lzoverb 3;mute 20配置文件每一项的具体意义都必须清楚,才能配置正确网络疏通以及IPtables大部分时候,openvpn安装到这里,此时连接时仍然会无法正常连接,因为上文提到,大体环境下是外网访问内网。外网访问局域网内,要想联通,必须有外网地址+端口映射,客户端程序才能找到连接入口。针对这种情况,可以提供两种方法使用:ssh链路端口转发固定外网地址添加端口映射我安装的环境下,路由器有固定的外网地址,所以我只需要把内网OpenVpn服务的11194端口映射到路由器外网IP地址,并指定端口就可以了。具体的实现方式,我就不细说了,每个人环境不同,操作步骤也不一样。但原理都相同SSH链路转发方式,是通过指定外网服务器的固定IP来添加端口转发,实现端口映射。具体命令格式如下:ssh -C -f -N -g -R 11194:内网IP:11193 root@外网IP地址 -o ServerAliveInterval=360 -o ServerAliveCountMax=5000# 尽量不要使用root账户通过端口映射成功连接到内网OpenVpn服务器之后,无法ping通内网其他服务器怎么办。还需要在openvpn服务器添加地址转发,从而通过客户端连接后,打通内网(局域网内)所有机器,iptables命令如下:$ iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE各种方面都要考虑,其实比较有意思,哈哈????安装总结OpenVpn的安装还是有点难度的,不过细心一点,以及掌握服务原理,很好安装。在这,总结出以下几点,希望会有帮助: * 安装前了解服务原理,这一点很重要 * 安装前了解服务版本之间的迭代以及区别,选好版本已经成功了一半 * 安装时的配置,以及配置更改后重启服务 * 安装报错,或者各种报错,先看服务日志,日志帮助很大 * 安装后总结,方便以后Review ^ . ^希望以上对你能有所帮助。感谢阅读KeepCalm&CarryOn 2018-07-13 记 ...

April 12, 2019 · 9 min · jiezi

Centos7.6安装MySQL+Redis(最新版)

本博客 猫叔的博客,转载请申明出处本系列教程为HMStrange项目附带。历史文章如何在VMware12安装Centos7.6最新版Centos7.6安装Java8MySQL教程1、下载mysql,地址:http://dev.mysql.com/get/mysq…2、使用xftp上传到自己想要得目录3、代码操作,安装并重启mysql服务# rpm -ivh mysql-community-release-el7-5.noarch.rpm# yum install mysql-community-server# service mysqld restart4、设置mysql的root密码# mysql -u rootmysql> set password for ‘root’@’localhost’ =password(‘你的密码’);mysql> flush privileges;5、配置mysql编码# vi /etc/my.cnf[mysql]default-character-set =utf86、允许远程链接,进入mysqlmysql> grant all privileges on . to root@’%‘identified by ‘远程密码’;mysql> flush privileges;7、开启3306端口,或者关闭防火墙,我是虚拟机环境且自己用的,我直接关了防火墙。systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动Redis教程1、下载redis,地址: http://download.redis.io/rele...2、安装gcc等默认需要的yum install -y gcc tcl3、解压安装# tar xzf redis-5.0.4.tar.gz# cd redis-5.0.4# make install4、修改redis.confbind 0.0.0.0 #允许远程protected-mode no #关闭保护模式daemonize yes #守护进程模式开启5、启动redis# cd src# ./redis-server ./../redis.conf公众号:Java猫说学习交流群:728698035现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

April 10, 2019 · 1 min · jiezi

Centos7.6安装Java8

本博客 猫叔的博客,转载请申明出处本系列教程为HMStrange项目附带。历史文章如何在VMware12安装Centos7.6最新版下载https://www.oracle.com/techne…这个是我下载的jdk版本,项目选用Java8,Centos的安装是在上一篇文章的内容实操1、进入自己的目录,我在home里面以自己的名字新建了一个文件夹cd /home/myself2、你可以下载或者通过xftp进行上传,然后解压jdktar -zxvf jdk-8u202-linux-x64.tar.gz –no-same-owner3、设置环境变量vi /etc/bashrc添加如下代码(注意:JAVA_HOME路径根据环境自行修改)export JAVA_HOME=/home/myself/jdk1.8.0_201export PATH=$JAVA_HOME/bin:$PATHexport CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar使其生效source /etc/bashrc4、查看是否安装成功java -version公众号:Java猫说学习交流群:728698035现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

April 9, 2019 · 1 min · jiezi

CentOS 7 安装 PHP 7 Redis 扩展

导语上一篇安装配置好 Redis,还没结束,还需要安装 PHP 扩展。安装扩展注意:第一次使用非 root 用户没有成功,改用 root 用户会成功下载扩展包,在这里找到匹配的版本,wget 下载到服务器中解压并进入目录中 tar zxf redis-4.0.1.tgz,cd redis-4.0.1;找到 phpize 并执行找到 php-config 并配置make && make install,编译之后 redis.io 已经在 /usr/local/php/lib/php/extensions/no-debug-non-zts-20170718/ 扩展目录中了;修改 php.ini 添加 extension=redis参考资料: 编译安装PHP7及扩展。

April 8, 2019 · 1 min · jiezi

如何在VMware12安装Centos7.6最新版

本博客 猫叔的博客,转载请申明出处本系列教程为HMStrange项目附带。ISO镜像下载http://59.80.44.49/isoredirec…直接点击下载,或者进入下载地址,我这边选择的是第一个。安装流程1、选择典型安装模式即可2、选择安装的ISO文件地址,我选择的就是开头的链接地址3、你可以修改名字或者修改存放位置4、容量这一块看情况,我这边直接默认的5、直接点击创建即可,一开始启动的时候需要默认配置,语言选择中文简体,因人而异。6、接下来你会看到这个界面,你需要配置两个东西,一个是位置、一个是网络。7、选择安装位置,这一块点进来就好,它会默认设定一次8、设置网络,修改主机名、选择应用、打开以太网,点击配置9、网络配置,选择常规,然后勾选第一个“可用时自动链接到这个网络”10、最后保存,在安装界面设定root的密码安装成功!进入界面后,大家可以输入ip addr查看网络ip,一般可以看到两个lo、ens33的信息。公众号:Java猫说学习交流群:728698035现架构设计(码农)兼创业技术顾问,不羁平庸,热爱开源,杂谈程序人生与不定期干货。

April 8, 2019 · 1 min · jiezi

CentOS 7 安装配置 Redis

导语Redis 不用多介绍了,下面开始安装配置吧。安装下载源码 wget http://download.redis.io/releases/redis-4.0.12.tar.gz;解压并进入到目录 tar xzf redis-4.0.12.tar.gz、cd redis-4.0.12/;编译到指定目录 make PREFIX=/usr/local/redis install创建 /usr/local/redis/ect 目录,将 redis.conf 复制过来/usr/local/redis 目录结构如下将 Redis 添加系统服务,执行 vim /usr/lib/systemd/system/redis-server.service,内容如下[Unit]Description=The redis-server Process ManagerAfter=syslog.target network.target[Service]Type=simplePIDFile=/var/run/redis.pidExecStart=/usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPID[Install]WantedBy=multi-user.target开启服务 systemctl start redis-server设置为开机启动 systemctl enable redis-server测试,使用 redis-cli 测试看下修改 Redis 配置修改数据保存路径,新建 /usr/local/redis/data 目录,设置 dir 为 这个路径;RDB 和 AOF 持久化默认的 RDB 是 save 900 1 save 300 10 save 60 10000,即 900 秒 1 次更改、300 秒 10 次更改、60 秒 10000 次更改,满足上述任一条件即可,使用默认值;AOF 是默认关闭的,修改 appendonly 为 yes。更新条件有三种选择,是 always 表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)、everysec 表示每秒同步一次(折中,默认值)、no 表示等操作系统进行数据缓存同步到磁盘(快),使用默认值就好了;二者是可以同时使用的,其它的相关配置就使用默认值了。修改数据淘汰策略最大占用内存 maxmemory 默认是注释的,设置为 512M,注意单位是 bytes ,所以值为 536870912;Redis 共提供了 6 种超值后的数据淘汰策略,分别是volatile-lru:从设置了过期时间的数据集中,选择最近最久未使用的数据释放;allkeys-lru:从数据集中(包括设置过期时间以及未设置过期时间的数据集中),选择最近最久未使用的数据释放;volatile-random:从设置了过期时间的数据集中,随机选择一个数据进行释放;allkeys-random:从数据集中(包括了设置过期时间以及未设置过期时间)随机选择一个数据进行入释放;volatile-ttl:从设置了过期时间的数据集中,选择马上就要过期的数据进行释放操作;noeviction:不删除任意数据(但redis还会根据引用计数器进行释放),这时如果内存不够时,会直接返回错误。这里设置 maxmemory-policy 为 volatile-lru。其它配置保持默认值,后续根据需求进行修改。记得修改完成后重启服务 systemctl restart redis-server。参考资料:Redis、Redis 配置、Redis持久化原理及配置详解(RDB方式和AOF方式)、Redis 数据淘汰机制、Centos 7安装及设置redis自定义服务开机启动。 ...

April 8, 2019 · 1 min · jiezi

centos7下利用yum搭建LAMP环境

由于在阿里云上重置了系统,所以得重新搭建环境,搭建过程中遇到不少坑,在网上搜索之后才得以解决,在这里做个记录,方便日后直接看自己博文。一:安装Apache1、安装Apacheyum -y install httpd2、Apache配置httpd.conf通过命令find / -name httpd.conf 找到Apache配置文件httpd.conf(默认在/etc/httpd/conf/httpd.conf)编辑httpd.conf文件vi /etc/httpd/conf/httpd.conf修改DocumentRoot “/xx/xx/xxx”,项目在哪个目录下,就将"/xx/xx/xxx"改为哪个目录,例如DocumentRoot “/var/www/html” ,同样将<Directory “/xx/xx/xxx”>修改为<Directory “/var/www/html”>。查看是否安装成功(启动Apache,并查看Apache状态) service httpd start service httpd status显示OK说明安装成功配置Apache开机启动项 chkconfig –add httpd //(在服务清单中添加httpd服务) chkconfig httpd on二:安装PHP1、更换RPM源#Centos 5.X:rpm -Uvh http://mirror.webtatic.com/yum/el5/latest.rpm#CentOs 6.x:rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm#CentOs 7.X:rpm -Uvh https://mirror.webtatic.com/yum/el7/epel-release.rpmrpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm2、安装新版本 PHPphp 7.0/7.1/7.2 分别表示为 70w/71w/72wyum install php71w php71w-cli php71w-common php71w-devel php71w-embedded php71w-fpm php71w-gd php71w-mbstring php71w-mysqlnd php71w-opcache php71w-pdo php71w-xml php71w-ldap php71w-mcrypt3、 重新启动相关服务service php-fpm restartservice httpd restart4、检查版本php -v三:安装mysql一般网上给出的资料都是yum install mysqlyum install mysql-serveryum install mysql-devel安装mysql和mysql-devel都成功,但是安装mysql-server失败,查资料发现是CentOS 7 版本将MySQL数据库软件从默认的程序列表中移除,用mariadb代替了。有两种解决方法,一种是安装mariadb,另一种是直接从官网下载mysql-server,看个人喜欢了,本人采取的是第二种。方法一:安装mariadbyum install mariadb-server mariadb mariadb数据库的相关命令是:systemctl start mariadb #启动MariaDBsystemctl stop mariadb #停止MariaDBsystemctl restart mariadb #重启MariaDBsystemctl enable mariadb #设置开机启动所以先启动数据库systemctl start mariadb方法二:官网下载安装mysql-serverwget http://dev.mysql.com/get/mysql-community-release-el7-5.noarch.rpmrpm -ivh mysql-community-release-el7-5.noarch.rpmyum install mysql-community-server安装成功后重启mysql服务。service mysqld restart初次安装mysql,root账户没有密码。进入mysql,执行命令:set password for ‘root’@’localhost’ =password(‘password’); //括号内写上新密码配置mysql,执行/etc/my.cnf按 i 进入编辑,追加default-character-set =utf8esc退出编辑, :wq 回车保存退出。进入数据库,远程连接设置#把在所有数据库的所有表的所有权限赋值给位于所有IP地址的root用户。mysql>grant all privileges on . to root@’%‘identified by ‘password’;ysql#如果是新用户而不是root,则要先新建用户mysql>create user ‘username’@’%’ identified by ‘password’; 此时就可以进行远程连接了。ok,大功告成。参考链接:centos7 mysql数据库安装和配置 Centos 6/7 升级 PHP 5.6 到 7.1/7.2 ...

April 7, 2019 · 1 min · jiezi

CentOS7 安装并汉化 GitLab

一、安装 GitLab当前版本为 8.8.5准备安装环境curl -s https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash安装GitLab# –nogpgcheck 防止因没有签名导致无法安装的问题sudo yum install gitlab-ce-8.8.5-ce.1.el7.x86_64 –nogpgcheck配置GitLab# 执行结束浏览器中输入本机IP地址即可正常访问sudo gitlab-ctl reconfigure二、汉化 GitLab安装Gityum install -y git下载汉化包# 下载 8-8-zh 分支git clone https://gitlab.com/larryli/gitlab.git -b 8-8-zh# 进入目录cd gitlab停止GitLab服务gitlab-ctl stop参考链接GitLab下载汉化下载

April 4, 2019 · 1 min · jiezi

linux下fsevents模块引起的npm ls报错解决办法

有个项目在mac下开发,安装包npm i,一切正常;把这个项目放到linux机器上,安装包npm i,报了一堆warning:npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@^1.2.7 (node_modules/chokidar/node_modules/fsevents):npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@1.2.7: wanted {“os”:“darwin”,“arch”:“any”} (current: {“os”:“linux”,“arch”:“x64”})npm WARN 0403@1.0.0 No descriptionnpm WARN 0403@1.0.0 No repository field.npm WARN optional SKIPPING OPTIONAL DEPENDENCY: abbrev@1.1.1 (node_modules/fsevents/node_modules/abbrev):npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/root/2019/0403/node_modules/fsevents/node_modules/abbrev’ -> ‘/root/2019/0403/node_modules/fsevents/node_modules/.abbrev.DELETE’npm WARN optional SKIPPING OPTIONAL DEPENDENCY: ansi-regex@2.1.1 (node_modules/fsevents/node_modules/ansi-regex):npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/root/2019/0403/node_modules/fsevents/node_modules/ansi-regex’ -> ‘/root/2019/0403/node_modules/fsevents/node_modules/.ansi-regex.DELETE’npm WARN optional SKIPPING OPTIONAL DEPENDENCY: aproba@1.2.0 (node_modules/fsevents/node_modules/aproba):npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/root/2019/0403/node_modules/fsevents/node_modules/aproba’ -> ‘/root/2019/0403/node_modules/fsevents/node_modules/.aproba.DELETE’npm WARN optional SKIPPING OPTIONAL DEPENDENCY: balanced-match@1.0.0 (node_modules/fsevents/node_modules/balanced-match):npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/root/2019/0403/node_modules/fsevents/node_modules/balanced-match’ -> ‘/root/2019/0403/node_modules/fsevents/node_modules/.balanced-match.DELETE’npm WARN optional SKIPPING OPTIONAL DEPENDENCY: chownr@1.1.1 (node_modules/fsevents/node_modules/chownr):npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/root/2019/0403/node_modules/fsevents/node_modules/chownr’ -> ‘/root/2019/0403/node_modules/fsevents/node_modules/.chownr.DELETE’npm WARN optional SKIPPING OPTIONAL DEPENDENCY: code-point-at@1.1.0 (node_modules/fsevents/node_modules/code-point-at):npm WARN enoent SKIPPING OPTIONAL DEPENDENCY: ENOENT: no such file or directory, rename ‘/root/2019/0403/node_modules/fsevents/node_modules/code-point-at’ -> ‘/root/2019/0403/node_modules/fsevents/node_modules/.code-point-at.DELETE’…执行npm ls,有不少UNMET OPTIONAL DEPENDENCY的模块,最后还报了一堆错:│ ├── define-property@2.0.2 deduped│ ├── extend-shallow@3.0.2 deduped│ ├── regex-not@1.0.2 deduped│ └─┬ safe-regex@1.1.0│ └── ret@0.1.15├─┬ UNMET OPTIONAL DEPENDENCY fsevents@1.2.7│ ├── nan@2.13.2│ └─┬ UNMET OPTIONAL DEPENDENCY node-pre-gyp@0.10.3│ ├── UNMET OPTIONAL DEPENDENCY detect-libc@1.0.3│ ├─┬ UNMET DEPENDENCY mkdirp@0.5.1│ │ └── UNMET DEPENDENCY minimist@0.0.8│ ├─┬ UNMET OPTIONAL DEPENDENCY needle@2.2.4│ │ ├─┬ UNMET OPTIONAL DEPENDENCY debug@2.6.9│ │ │ └── UNMET OPTIONAL DEPENDENCY ms@2.0.0│ │ ├─┬ UNMET OPTIONAL DEPENDENCY iconv-lite@0.4.24│ │ │ └── UNMET OPTIONAL DEPENDENCY safer-buffer@2.1.2│ │ └── UNMET OPTIONAL DEPENDENCY sax@1.2.4│ ├─┬ UNMET OPTIONAL DEPENDENCY nopt@4.0.1│ │ ├── UNMET OPTIONAL DEPENDENCY abbrev@1.1.1│ │ └─┬ UNMET OPTIONAL DEPENDENCY osenv@0.1.5│ │ ├── UNMET OPTIONAL DEPENDENCY os-homedir@1.0.2│ │ └── UNMET OPTIONAL DEPENDENCY os-tmpdir@1.0.2│ ├─┬ UNMET OPTIONAL DEPENDENCY npm-packlist@1.2.0│ │ ├─┬ UNMET OPTIONAL DEPENDENCY ignore-walk@3.0.1│ │ │ └─┬ UNMET DEPENDENCY minimatch@3.0.4│ │ │ └─┬ UNMET DEPENDENCY brace-expansion@1.1.11│ │ │ ├── UNMET DEPENDENCY balanced-match@1.0.0│ │ │ └── UNMET DEPENDENCY concat-map@0.0.1│ │ └── UNMET OPTIONAL DEPENDENCY npm-bundled@1.0.5│ ├─┬ UNMET OPTIONAL DEPENDENCY npmlog@4.1.2│ │ ├─┬ UNMET OPTIONAL DEPENDENCY are-we-there-yet@1.1.5│ │ │ ├── UNMET OPTIONAL DEPENDENCY delegates@1.0.0│ │ │ └─┬ UNMET OPTIONAL DEPENDENCY readable-stream@2.3.6│ │ │ ├── UNMET OPTIONAL DEPENDENCY core-util-is@1.0.2│ │ │ ├── UNMET DEPENDENCY inherits@2.0.3│ │ │ ├── UNMET OPTIONAL DEPENDENCY isarray@1.0.0│ │ │ ├── UNMET OPTIONAL DEPENDENCY process-nextick-args@2.0.0│ │ │ ├── UNMET DEPENDENCY safe-buffer@5.1.2│ │ │ ├─┬ UNMET OPTIONAL DEPENDENCY string_decoder@1.1.1│ │ │ │ └── UNMET DEPENDENCY safe-buffer@5.1.2│ │ │ └── UNMET OPTIONAL DEPENDENCY util-deprecate@1.0.2│ │ ├── UNMET DEPENDENCY console-control-strings@1.1.0│ │ ├─┬ UNMET OPTIONAL DEPENDENCY gauge@2.7.4│ │ │ ├── UNMET OPTIONAL DEPENDENCY aproba@1.2.0│ │ │ ├── UNMET DEPENDENCY console-control-strings@1.1.0│ │ │ ├── UNMET OPTIONAL DEPENDENCY has-unicode@2.0.1│ │ │ ├── UNMET OPTIONAL DEPENDENCY object-assign@4.1.1│ │ │ ├── UNMET OPTIONAL DEPENDENCY signal-exit@3.0.2│ │ │ ├─┬ UNMET DEPENDENCY string-width@1.0.2│ │ │ │ ├── UNMET DEPENDENCY code-point-at@1.1.0│ │ │ │ ├─┬ UNMET DEPENDENCY is-fullwidth-code-point@1.0.0│ │ │ │ │ └── UNMET DEPENDENCY number-is-nan@1.0.1│ │ │ │ └── UNMET DEPENDENCY strip-ansi@3.0.1│ │ │ ├─┬ UNMET DEPENDENCY strip-ansi@3.0.1│ │ │ │ └── UNMET DEPENDENCY ansi-regex@2.1.1│ │ │ └─┬ UNMET OPTIONAL DEPENDENCY wide-align@1.1.3│ │ │ └── UNMET DEPENDENCY string-width@1.0.2│ │ └── UNMET OPTIONAL DEPENDENCY set-blocking@2.0.0│ ├─┬ UNMET OPTIONAL DEPENDENCY rc@1.2.8│ │ ├── UNMET OPTIONAL DEPENDENCY deep-extend@0.6.0│ │ ├── UNMET OPTIONAL DEPENDENCY ini@1.3.5│ │ ├── UNMET OPTIONAL DEPENDENCY minimist@1.2.0│ │ └── UNMET OPTIONAL DEPENDENCY strip-json-comments@2.0.1│ ├─┬ UNMET OPTIONAL DEPENDENCY rimraf@2.6.3│ │ └─┬ UNMET OPTIONAL DEPENDENCY glob@7.1.3│ │ ├── UNMET OPTIONAL DEPENDENCY fs.realpath@1.0.0│ │ ├─┬ UNMET OPTIONAL DEPENDENCY inflight@1.0.6│ │ │ ├── UNMET DEPENDENCY once@1.4.0│ │ │ └── UNMET DEPENDENCY wrappy@1.0.2│ │ ├── UNMET DEPENDENCY inherits@2.0.3│ │ ├── UNMET DEPENDENCY minimatch@3.0.4│ │ ├─┬ UNMET DEPENDENCY once@1.4.0│ │ │ └── UNMET DEPENDENCY wrappy@1.0.2│ │ └── UNMET OPTIONAL DEPENDENCY path-is-absolute@1.0.1│ ├── UNMET OPTIONAL DEPENDENCY semver@5.6.0│ └─┬ UNMET OPTIONAL DEPENDENCY tar@4.4.8│ ├── UNMET OPTIONAL DEPENDENCY chownr@1.1.1│ ├─┬ UNMET OPTIONAL DEPENDENCY fs-minipass@1.2.5│ │ └── UNMET DEPENDENCY minipass@2.3.5│ ├─┬ UNMET DEPENDENCY minipass@2.3.5│ │ ├── UNMET DEPENDENCY safe-buffer@5.1.2│ │ └── UNMET DEPENDENCY yallist@3.0.3│ ├─┬ UNMET OPTIONAL DEPENDENCY minizlib@1.2.1│ │ └── UNMET DEPENDENCY minipass@2.3.5│ ├── UNMET DEPENDENCY mkdirp@0.5.1│ ├── UNMET DEPENDENCY safe-buffer@5.1.2│ └── UNMET DEPENDENCY yallist@3.0.3├─┬ glob-parent@3.1.0│ ├─┬ is-glob@3.1.0│ │ └── is-extglob@2.1.1 deduped│ └── path-dirname@1.0.2├── inherits@2.0.3├─┬ is-binary-path@1.0.1│ └── binary-extensions@1.13.1├─┬ is-glob@4.0.1│ └── is-extglob@2.1.1├── normalize-path@3.0.0├── path-is-absolute@1.0.1├─┬ readdirp@2.2.1│ ├── graceful-fs@4.1.15│ ├── micromatch@3.1.10 deduped│ └─┬ readable-stream@2.3.6│ ├── core-util-is@1.0.2│ ├── inherits@2.0.3 deduped│ ├── isarray@1.0.0│ ├── process-nextick-args@2.0.0│ ├── safe-buffer@5.1.2│ ├─┬ string_decoder@1.1.1│ │ └── safe-buffer@5.1.2 deduped│ └── util-deprecate@1.0.2└── upath@1.1.2npm ERR! missing: mkdirp@0.5.1, required by node-pre-gyp@0.10.3npm ERR! missing: minimist@0.0.8, required by mkdirp@0.5.1npm ERR! missing: minimatch@3.0.4, required by ignore-walk@3.0.1npm ERR! missing: brace-expansion@1.1.11, required by minimatch@3.0.4npm ERR! missing: balanced-match@1.0.0, required by brace-expansion@1.1.11npm ERR! missing: concat-map@0.0.1, required by brace-expansion@1.1.11npm ERR! missing: console-control-strings@1.1.0, required by npmlog@4.1.2npm ERR! missing: inherits@2.0.3, required by readable-stream@2.3.6npm ERR! missing: safe-buffer@5.1.2, required by readable-stream@2.3.6npm ERR! missing: safe-buffer@5.1.2, required by string_decoder@1.1.1npm ERR! missing: console-control-strings@1.1.0, required by gauge@2.7.4npm ERR! missing: string-width@1.0.2, required by gauge@2.7.4npm ERR! missing: strip-ansi@3.0.1, required by gauge@2.7.4npm ERR! missing: code-point-at@1.1.0, required by string-width@1.0.2npm ERR! missing: is-fullwidth-code-point@1.0.0, required by string-width@1.0.2npm ERR! missing: strip-ansi@3.0.1, required by string-width@1.0.2npm ERR! missing: number-is-nan@1.0.1, required by is-fullwidth-code-point@1.0.0npm ERR! missing: ansi-regex@2.1.1, required by strip-ansi@3.0.1npm ERR! missing: string-width@1.0.2, required by wide-align@1.1.3npm ERR! missing: inherits@2.0.3, required by glob@7.1.3npm ERR! missing: minimatch@3.0.4, required by glob@7.1.3npm ERR! missing: once@1.4.0, required by glob@7.1.3npm ERR! missing: once@1.4.0, required by inflight@1.0.6npm ERR! missing: wrappy@1.0.2, required by inflight@1.0.6npm ERR! missing: wrappy@1.0.2, required by once@1.4.0npm ERR! missing: minipass@2.3.5, required by tar@4.4.8npm ERR! missing: mkdirp@0.5.1, required by tar@4.4.8npm ERR! missing: safe-buffer@5.1.2, required by tar@4.4.8npm ERR! missing: yallist@3.0.3, required by tar@4.4.8npm ERR! missing: minipass@2.3.5, required by fs-minipass@1.2.5npm ERR! missing: safe-buffer@5.1.2, required by minipass@2.3.5npm ERR! missing: yallist@3.0.3, required by minipass@2.3.5npm ERR! missing: minipass@2.3.5, required by minizlib@1.2.1仔细观察发现UNMET OPTIONAL DEPENDENCY的模块和npm ERR是同一批模块,也是安装时报warning的那些模块。再仔细观察发现这些都是fsevents依赖的模块。fsevents只能在macOS下安装,无法在linux系统安装。linux下会跳过fsevents模块,也不会安装fsevents依赖的模块。这其实算是npm的一个bug,npm i时报Warn,npm ls又报Err,前后不一致,容易有误解。目前无论用哪个版本的npm都会有这个问题,npm i –no-optional也不能解决这个问题。这些报错不影响项目的正常运行,因为linux不需要fsevents。如果不希望看到npm Err,可以用npm i -f强制安装,安装过程没有warn,安装完后npm ls看下:└─┬ chokidar@2.1.5└── fsevents@1.2.7 干净了,没有任何报错。我的项目是chokidar这个模块依赖了fsevents,chokidar又是browser-sync、webpack等依赖的。 ...

April 4, 2019 · 5 min · jiezi

阿里云linux(centos)下安装wine,并运行.exe文件

1.安装yum install wine 2.运行.exe文件wine temp.exe

April 2, 2019 · 1 min · jiezi

CentOS7更换yum源

备份原文件mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup下载阿里源文件替换 curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo建立缓存yum makecache

March 31, 2019 · 1 min · jiezi

docker搭建php+nginx+swoole+mysql+redis环境

操作系统:阿里云esc实例centos7.4软件:docker-ce version 18.09.3, docker-compose version 1.23.2一.创建带有swoole-redis-pdo_mysql-gd扩展的docker image1.创建dockerfile文件vim dockerfile2.在dockerfile文件写入From php:7.1-fpmRUN apt-get update && apt-get install -y \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev &amp;& docker-php-ext-install -j$(nproc) iconv &amp;& docker-php-ext-configure gd –with-freetype-dir=/usr/include/ –with-jpeg-dir=/usr/include/ &amp;& docker-php-ext-install -j$(nproc) gd &amp;& docker-php-ext-configure pdo_mysql &amp;& docker-php-ext-install pdo_mysql &amp;& pecl install redis-4.3.0 &amp;& pecl install swoole &amp;& docker-php-ext-enable redis swoole3.创建自定义的php镜像,主要不要漏了最后的 ‘.’,是指定当前目录构建镜像docker build -t myphp4 .运行指令,由于网络问题等,需要等比较长的时间,成功后会出现类似下面的代码…Build process completed successfullyInstalling ‘/usr/local/include/php/ext/swoole/config.h’Installing ‘/usr/local/lib/php/extensions/no-debug-non-zts-20160303/swoole.so’install ok: channel://pecl.php.net/swoole-4.3.1configuration option “php_ini” is not set to php.ini locationYou should add “extension=swoole.so” to php.iniRemoving intermediate container ad1420f7554f —> 2f2f332d73ceSuccessfully built 2f2f332d73ceSuccessfully tagged myphp4:latest至此docker 的自定义myphp4 image创建成功!二.创建docker-compose.yml文件mkdir pnsmrcd pnsmrvim docker-compose.yml写入下面代码version: ‘3.0’services:nginx: image: “nginx:latest” ports: - “10000:80” volumes: - /var/www/html:/usr/share/nginx/htmlphp-fpm: image: “myphp4” volumes: - /var/www/html:/usr/share/nginx/htmlmysql: image: “mysql:latest"redis: image: “redis:4.0"运行指令docker-compose up -d成功可以看到WARNING: The Docker Engine you’re using is running in swarm mode.Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.To deploy your application across the swarm, use docker stack deploy.Creating network “pnsmr_default” with the default driverCreating pnsmr_php-fpm_1 … doneCreating pnsmr_redis_1 … doneCreating pnsmr_mysql_1 … doneCreating pnsmr_nginx_1 … done至此,已开启nginx mysql redis php 服务三.修改各服务配置文件 1.浏览器输入 127.0.0.1:9998 #此处应输入你的服务器ip地址,可以看到下图 2.接下来要修改容器里nginx的配置文件,先使用指令查看各容器的docker IP地址docker inspect -f ‘{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}’ $(docker ps -aq)此指令可以查看所有用docker-compose 开启的容器的ip,结果类似下图,可以用对应的ip地址进行内部通讯3.复制nginx容器的配置文件出来,并修改替换,使nginx能解析phpdocker cp pnsmr_nginx_1:/etc/nginx/conf.d/default.conf nginx.confvim nginx.conf修改为下列代码server { listen 80; server_name localhost; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; location / { root /usr/share/nginx/html; index index.html index.htm; } #error_page 404 /404.html; # redirect server error pages to the static page /50x.html # error_page 500 502 503 504 /50x.html; location = /50x.html { root /usr/share/nginx/html; } # proxy the PHP scripts to Apache listening on 127.0.0.1:80 # #location ~ .php$ { # proxy_pass http://127.0.0.1; #} # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000 # location ~ .php$ { root html; fastcgi_pass 172.24.0.3:9000;#此处需要填写你的php容器的docker内部通讯ip fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /usr/share/nginx/html/$fastcgi_script_name; include fastcgi_params; } # deny access to .htaccess files, if Apache’s document root # concurs with nginx’s one # #location ~ /.ht { # deny all; #}}docker cp nginx.conf pnsmr_nginx_1:/etc/nginx/conf.d/default.conf #将修改好的配置文件拷贝到容器里docker container stop pnsmr_nginx_1 docker container start pnsmr_nginx_1 #重启nginx容器使配置文件生效vim /var/www/html/index.php #在服务器本地目录新建 index.php 文件,输入<?php phpinfo(); 并保存vim /var/www/html/index.html #在服务器本地目录新建 index.html 文件,输出helloworld访问127.0.0.1:9998, html文件解析正常 访问127.0.0.1:9998/index.php,php文件解析正常 4.测试mysql,redis是否生效vim /var/www/html/redis.php #用于测试redis是否配置成功<?php$redis = new Redis();$redis->connect(“172.24.0.4”,6379);$redis->set(’test’,’this is a test for redis’);echo $redis->get(’test’);访问127.0.0.1:9998/redis.php,redis已生效进入mysql容器docker exec -it pnsmr_mysql_1 bash进入mysql并更改root用户密码创建测试文件vim /var/www/html/mysql.php<?php$pdo = new PDO(‘mysql:host=172.24.0.2;dbname=mysql;port=3306’,‘root’,‘root123’);var_dump($pdo);访问127.0.0.1:9998/mysql.php,mysql已生效四.总结 虽然环境是配置成功了,并可以用docker-compose up 指令一键生成,但是还要改各容器的配置文件,仍然不够方便,需要优化;另外docker的集群,堆栈功能也没用上,后面再继续学习. ...

March 25, 2019 · 2 min · jiezi

Nginx(2)-创建具有缓存功能的反向代理服务器

承接上一篇文章,在本文中,将上文中的静态资源服务器作为上游服务器,另外搭建一台 Nginx 服务器,作为反向代理服务器。配置反向代理服务器上游服务器处理的业务逻辑相对复杂,而且强调开发效率,所以它的性能并不优秀,使用 nginx 作为反向代理后,可以将请求将根据负载均衡算法,分散到多台上游(后端)服务器,这样就实现了架构上的水平扩展,让用户无感知的情况下,添加更多的服务器,来提升性能,即使后端的服务器出现问题,nginx反向代理服务器会转交给正常工作的服务器。一般情况下,上游服务器不对外提供访问,修改的方法是,将 server 配置块中的 listen 配置项修改为内部网络地址,修改配置文件后,重启nginx 进程,目的是防止之前打开的端口仍然可以使用。Nginx实现反向代理的功能由 ngx_http_proxy_module 实现,下面是配置示例:location / { proxy_pass http://localhost:8080; proxy_set_header Host $host; #当后端还有虚拟主机时,应该返回正确的网页,而不是用户请求不用的 host 都返回相同的内容 proxy_set_header X-Real-IP $remote_addr;}当用户请求"/“的所有 URL请求,都转交配置文件中proxy_pass指定的后端服务器,同时还设置了向后端生成请求报文时新的 header,如定义Host 将用户请求的 host 定义在 header 中,定义 X-Real-IP客户端的 IP 地址。…upstream webdlib{ #定义上游服务器群组,并自定义名称为 webdlib server 172.16.240.140:8080; #上游服务器群组的服务器列表,多台服务器可以选择负载均衡算法 }server { listen 80 server_name _; … … location / { proxy_pass http://172.16.240.140:8080; #设置上游服务器地址 proxy_set_header Host $host; #添加请求首部 host 名称,由上游服务器处理 host 请求 proxy_set_header X-Real-IP $remote_addr; #添加客户端真实 IP 地址 proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; }配置缓存服务器通常只有动态请求,也就是不同的用户访问同一个 url内容不相同时,请求才会交由上游处理,在页面中,一部分内容在一段时间不会发生变化,为了减轻上游服务器的压力,将上游服务器返回的内容,缓存在反向代理服务器中保存一段时间,如几个小时或一天,在缓存时间内,即使上游服务器内容发生变化,也会被忽视,将缓存的内容向浏览器发送。使用缓存会提供站点的响应性能。首先要在 http 配置块下,使用proxy_cache_path定义缓存文件的路径、文件命名方式、命名共享内存及共享内存的空间大小等信息,如proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;缓存的使用方法则是,在需要进行缓存url 路径下,添加 proxy_cache、proxy_cache_key、proxy_cache_valid。proxy_cache my_cache:指定缓存共享内存的命名proxy_cahce_key $host$uri$is_args$args:在共享内存中设置的 key 的值,这里将 host,uri 等作为 key 值Proxy_cache_valid 200 304 302 1d :指定的响应不返回缓存下面是关于缓存的配置文件节选:…http { … proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off; … server { … location / { proxy_pass http://172.16.240.140:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forward-For $proxy_add_x_forwarded_for; proxy_cache my_cache; proxy_cache_key $host$uri$is_args$args; proxy_cache_valid 200 304 302 1d; } }}总结首先配置反向代理服务器,需要使用 proxy_pass设置上游服务地址、使用 proxy_set_header设置向后端发送请求的 header诸如客户端的 IP 地址、请求的 host。配置缓存服务器,首先要设置缓存的名称,内存空间名称等信息,然后在需要进行缓存的 URL 路径下,启用缓存,进行缓存的设置诸如缓存的名称、缓存的 key 等。 ...

March 18, 2019 · 1 min · jiezi

服务器系统优化

1、数据库物理机采购CPU: 64位CPU,一台机器2-16颗CPU。至少2-4颗,L2(缓存)越大越好 内存: 96-128G,MySQL 3-4个实例。32-64G,1-2实例 硬盘:机械:选SAS,数量越多越好,转速越高越好15k 性能:SSD(高并发) > SAS(普通业务线上) >SATA(线下) 选SSD:使用SSD或者PCIe SSD设备,可提升上千倍的IOPS效率。 随机IO:SAS单盘能力300IOPS SSD随机IO:单盘能力可达35000IOPS Flashcache HBA卡raid磁盘阵列: 4快盘:RAID0>RAID1(推荐)>RAID5(少用)>RAID1 主库选择raid10,从库可选raid5/raid0/raid10,从库配置等于或大于主库 网卡:使用多块网卡bond,以及buffer,tcp优化 千兆网卡及千兆、万兆交换机 提示: 数据库属于IO密集型服务,硬件尽量不要使用虚拟化。 Slave硬件要等于或大于Master的性能2、企业案例:百度:某部门IBM服务器为48核CPU,内存96GB,一台服务器跑34个实例: sina:服务器是DELL R510居多,CPU是E5210,48GB内存,硬盘12*300G SAS,做RAID103、服务器硬件配置调整(1)服务器BIOS调整: 提升CPU效率参考设置: a.打开Perfirmance Per Watt Optimeized(DAPC)模式,发挥CPU最大性能,数据库通常需要高运算量 b.打开CIE和C States等选项,目的也是为了提升CPU效率 c. Memory Frequency(内存频率)选择Maximum Performance(最佳性能) d.内存设置菜单中,启动Node Interleaving,避免NUMA问题 (2)阵列卡调整: a.购置阵列卡同时配备CACHE及BBU模块(机械盘) b.设置阵列写策略为WEB,甚至OFRCE WB (对数据安全要求高)(wb指raid卡的写策略:会写(write back)) c.严禁使用WT策略,并且关闭阵列预读策略2操作系统层面优化1.操作系统及MySQL实例选择1.一定要选择x86_64系统,推荐使用CentOS6.8 linux,关闭NUMA特性 2.将操作系统和数据分开,不仅仅是逻辑上,还包括物理上 3.避免使用Swap交换分区 4.避免使用软件磁盘阵列 5.避免使用LVM逻辑卷 6.删除服务器上未使用的安装包和守护进程2.文件系统层优化(1)调整磁盘Cache mode启用WCE=1(Write Cache Enable),RCD=0(Read Cache Disable)模式命令:sdparm -s WCE=1,RCD=0 -S /dev/sdb(2)采用Linux I/O scheduler算法deadlinedeadline调度参数 对于Centos Linux建议 read_expire = 1/2 write_expireecho 500 > /sys/block/sdb/queue/iosched/read_expireecho 1000 > /sys/block/sdb/queue/iosched/write_expireLinux I/O调度方法 Linux deadline io 调度算法(3)采用xfs文件系统 业务量不是很大也可采用ext4,业务量很大,推荐使用xfs:调整XFS文件系统日志和缓冲变量 XFS高性能设置 (4)mount挂载文件系统 增加:async,noatime,nodiratime,nobarrier等noatime访问文件时不更新inode的时间戳,高并发环境下,推线显示应用该选项,可以提高系统I/O性能async写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,这样可以提升写入效率!风险为若服务器宕机或不正常,会损失缓冲区中未写入磁盘的数据 解决办法:服务器主板电池或加UPS不间断电源nodiratime不更新系统上的directory inode时间戳,高并发环境,推荐显示该应用,可以提高系统I/O性能 nobarrier不使用raid卡上电池 (5)Linux 内核参数优化 1.将vm,swappiness设置为0-10 2.将vm,dirty_background_ratio设置为5-10,将vm,dirty_ratio设置为它的两倍左右,以确保能持续将脏数据刷新到磁盘,避免瞬间I/O写,产生严重等待3.优化TCP协议栈减少TIME_WAIT,提高TCP效率net.ipv4.tcp_tw_recyle=1net.ipv4.tcp_tw_reuse=1减少处于FIN-WAIT-2连接状态的时间,使系统可以处理更多的连接net.ipv4.tcp_fin_timeout=2减少TCP KeepAlived连接侦测的时间,使系统可以处理更多的连接。net.ipv4.tcp_keepalived_time=600提高系统支持的最大SYN半连接数(默认1024)net.ipv4.tcp_max_syn_backlog = 16384减少系统SYN连接重试次数(默认5)net,ipv4.tcp_synack_retries = 1net.ipv4.tcp_sync_retries = 1在内核放弃建立的连接之前发送SYN包的数量net.ipv4.ip_local_prot_range = 4500 65535允许系统打开的端口范围4.网络优化优化系统套接字缓冲区Increase TCP max buffer sizenet.core.rmem_max=16777216 #最大socket读buffernet.core.wmem_max=16777216 #最大socket写buffernet.core.wmem_default = 8388608 #该文件指定了接收套接字缓冲区大小的缺省值(以字节为单位)net.core.rmem_default = 8388608优化TCP接收/发送缓冲区Increase Linux autotuning TCP buffer limitsnet.ipv4.tcp_rmem=4096 87380 16777216net.ipv4.tcp_wmem=4096 65536 16777216net.ipv4.tcp_mem = 94500000 915000000 927000000优化网络设备接收队列net.core.netdev_max_backlog=30005.其他优化net.ipv4.tcp_timestamps = 0net.ipv4.tcp_max_orphans = 3276800net.ipv4.tcp_max_tw_buckets = 360000提示:面试的时候说框架,然后说一两个小的优化参数即可 更多内核可以参考“跟老男孩学运维书的第三章”以及我们的博客,近期将会更新3MySQL数据库层面优化my.cnf参数优化此优化主要针对innodb引擎如果采用MyISAM引擎,需要key_buffer_size加大。强烈推荐采用innodb引擎,default-storage-engine=Innodb调整innodb_buffer_pool_size大小,考虑设置为物理内存的50%-60%左右根据实际需要设置inno_flush_log_at_trx_commit,sync_binlog的值。如果要需要数据不能丢失,那么两个都设为1.如果允许丢失大一点数据,则可分别设为2和0,在slave上可设为0设置innodb_file_per_table = 1,使用独立表空间设置innodb_data_file_path = ibdata1:1G:autoextend,不要使用默认的10%设置innodb_log_file_size=256M,设置innodb_log_files_in_group=2,基本可满足90%以上的场景;不要将innodb_log_file_size参数设置太大,这样可以更快同时又更多的磁盘空间,丢掉多的日志通常是好的,在数据库崩溃后可以降低恢复数据库的事件设置long_query_time = 1记录那些执行较慢的SQL,用于后续的分析排查;根据业务实际需要,适当调整max_connection(最大连接数max_connection_error(最大错误数,建议设置为10万以上,而open_files_limit、innodb_open_files、table_open_cache、table_definition_cache这几个参数则可设为约10倍于max_connection的大小;)不要设置太大,会将数据库撑爆tmp_table_szie、max_heap_table_size、sort_buffer_size、join_buffer_size、read_buffer_size、read_rnd_buffer_size等都是每个连接session分配的,因此不能设置过大建议关闭query cache功能或降低设置不要超过512M更多内核参数:my-innodb-heavy-4G.cnf 配置文件参数介绍 MySQL工具mysqlreport 我们可以使用工具来分析MySQL的性能 如何才能做到网站高并发访问? 生产环境中对于防范DDOS攻击的讨论 面试可能会问到DOOS 攻击防护关于库表的设计规范推荐utf-8字符集,虽然有人说谈没有latin1快固定字符串的列尽可能多用定长char,少用varchar存储可变长度的字符串使用VARCHAR而不是CAHR—节省空间,因为固定长度的CHAR,而VARCHAR长度不固定(UTF8不愁此影响)所有的InnoDB表都设计一个无业务的用途的自增列做主键字段长度满足需求前提下,尽可能选择长度小的字段属性尽量都加NOT NULL约束对于某些文本字段,例如“省份”或者“性别”我们可以将他们定义为ENUM类型尽可能不使用TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要和主表放在一起,避免SELECT *的时候读性能太差。读取数据时,只选取所需要的列,不要每次都SELECT * 避免产生严重的随机读问题,尤其是读到一些TEXT/BLOB类型,确实需要的话,建议拆分到子表中,不要和主表放在一起,避免SELECT 的时候读性能太差对一个VARCHAR(N)列创建索引时,通常取其50%(甚至更小)左右长度创建前缀索引就足以满足80%以上的查询需求了,没必要创建整列的全长度索引。多用符合索引,少用多个独立索引,尤其是一些基础(Cardinality)太小(如果说:该列的唯一值总数少于255)的列就不要创建独立索引了。4SQL语句的优化索引优化 1)白名单机制一百度,项目开发啊,DBA参与,减少上线后的慢SQL数据 抓出慢SQL,配置my.cnflong_query_time = 2log-slow-queries=/data/3306/slow-log.loglog_queries_not_using_indexs按天轮询:slow-log.log2)慢查询的日志分析工具——mysqlsla或pt-query-digest(推荐)pt-quey-diges,mysqldumpslow,mysqlsla,myprofi,mysql-explain-slow-log,mysqllogfileter3)每天晚上0点定时分析慢查询,发到核心开发,DBA分析,及高级运维,CTO的邮箱里 DBA分析给出优化建议–>核心开发确认更新–>DBA线上操作处理 4)定期使用pt-duplicate-key-checker检查并删除重复的索引 定期使用pt-index-usage工具检查并删除使用频率很低的索引 5)使用pt-online-schema-change来完成大表的ONLINE DDL需求 6)有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX 7)使用explain及set profile优化SQL语句大的复杂的SQL语句拆分成多个小的SQL语句 子查询,JOIN连表查询,某个表4000万条记录 数据库是存储数据的地方,但不是计算数据的地方 对数据计算,应用类处理,都要拿到前端应用解决。禁止在数据库上处理 搜索功能,like ‘%oldboy%’ 一般不要用MySQL数据库 使用连接(JOIN)来代替子查询(Sub_Queries) 避免在整个表上使用cout(),它可能锁住整张表 多表联接查询时,关联字段类型尽量一致,并且都要有索引。 在WHERE子句中使用UNION代替子查询 多表连接查询时,把结果集小的表(注意,这里是指过滤后的结果集,不一样是全表数据量小的)作为驱动表爬虫获取数据的过程5网站集群架构上的优化1.服务器上跑多实例,2-4个(具体需要看服务器的硬件信息)2.主从复制一主五从,采用mixed模式,尽量不要跨机房同步(进程远程读本地写)3.定期使用pt-table-checksum、pt-table-sync来检查并修复mysql主从复制的数据差异4.业务拆分:搜索功能,like ‘%oldboy% ’ 一般不要用MySQL数据库5.业务拆分:某些业务应用使用nosql持久化存储,例如:memcached、redis、ttserver例如粉丝关注,好友关系等6.数据库前端必须要加cache,例如:memcached,用户登录,商品查询7.动态的数据库静态化,整个文件静态化,页面片段静态化8.数据库集群与读写分离。一主多从,通过程序或dbproxy进行集群读写分离9.单表超过800万,拆库拆表。人工拆表拆库(登录、商品、订单)10.百度、阿里国内前三公司,会选择从库进行备份,对数据库进行分库分表6MySQL 流程、制度控制优化任何一次人为数据库记录的更新,都要走一个流程:a.人的流程:开发–>核心开发–>运维或DBAb.测试流程:内网测试–>IDC测试–>线上执行c.客户端管理,phpmyadminMySQL基础安全1.启动程序700,属主和用户组为MySQL2.为MySQL超级用户root设置密码3.如果要求严格可以删除root用户,创建其他管理用户,例如admin4.登录时尽量不要在命令行暴露密码,备份脚本中如果有密码,给设置700,属主和密码组为mysql或root5.删除默认存在的test库6.初始删除无用的用户,只保留| root | 127.0.0.1 || root | localhost |7.不要一个用户管理所有的库,尽量专库专用户8.清理mysql操作日志文件/.mysql_history(权限600,可以不删)9.禁止开发获得到web连接的密码,禁止开发连接操作生产对外的库10.phpmyadmin安全11.服务器禁止设置外网IP12.防SQL注入(WEB)php.ini或web开发插件监控,waf控制 ...

March 16, 2019 · 1 min · jiezi

数据库备份之lvm快照热备

使用的是虚拟机环境,先在虚拟机中添加一块儿新的硬盘。然后给硬盘分区fdisk -l #查看分区信息pvcreate mysql_pv /dev/sdb #创建物理卷vgcreate vgmysql /dev/sdb #创建卷组lvcreate -L 1024M -n lv0 vgmysql #创建逻辑卷mkfs.ext4 /dev/vgmysql/lv0 #格式化挂载mount /dev/vgmysql/lv0 /mnt #挂载逻辑卷service mysqld stop #关闭mysql服务cp -a /var/lib/mysql/* /mnt #将数据库数据拷贝到mnt目录下umount /dev/vgmysql/lv0 #移除挂载信息mount /dev/vgmysql/lv0 /var/lib/mysql/ #将逻辑卷与Mysql数据目录挂载service mysqld start #重启mysqld服务设置开机自动挂载,在/etc/fstab文件中配置。最好不要采用在 /etc/fstab直接指定分区(如/dev/sdb1)的方法,因为设备的顺序编码在关闭或者开启服务器过程中可能发生改变,例如/dev/sdb1可能会变成/dev/sdb2。推荐使用UUID来配置自动挂载数据盘。查询磁盘分区的UUIDblkid /dev/sdb1UUID=一串数字:要挂载的磁盘分区的UUID/var/lib/mysql:挂载目录ext4:分区格式为ext4defaults:挂载时所要设定的参数(只读,读写,启用quota等),输入defaults包括的参数有(rw、dev、exec、auto、nouser、async) 0:使用dump是否要记录,0为不需要,1为需要 2:2是开机时检查的顺序,boot系统文件为1,其他文件系统都为2,如不要检查就为0在给lv0做快照之前,先使用FLUSH TABLES和FLUSH TABLES WITH READ LOCK强行将所有OS的缓冲数据写入磁盘(类似于操作系统的sync命令),同时将数据库置为全局只读。快照完成之后,再使用UNLOCK TABLES解锁。然后只需要将快照进行挂载,复制其中数据,在复制完成之后删除该快照即可! /bin/bashTIMESTAMP=date +%Y%m%d%H%M%SHOSTNAME=“127.0.0.1"USERNAME=“root"PASSWORD=“12345678"MOUNT=/bin/mountUMOUNT=/bin/umountLVCREATE=/usr/sbin/lvcreateLVREMOVE=/usr/sbin/lvremoveMYSQL=/usr/bin/mysqlTAR=/bin/tarSNAP_SIZE=1024mSNAP_MYSQL=/dev/vgmysql/lv0MOUNT_POINT=/mntEXEC_MySQL=“FLUSH TABLES;FLUSH TABLES WITH READ LOCK;FLUSH LOGS;SNAP_MYSQL /dev/vgmysql/lv0UNLOCK TABLES;“echo “$EXEC_MySQL” | $MYSQL-u$USERNAME-p$PASSWORD-h$HOSTNAME$MOUNT $SNAP_MYSQL $MOUNT_POINTcd /root$TAR -zcvf ${TIMESTAMP}.tgz $MOUNT_POINT$UMOUNT $MOUNT_POINT$LVREMOVE -f $SNAP_MYSQL

March 14, 2019 · 1 min · jiezi

CentOS 7安装MySQL8.0

下载rpm包: wget https://dev.mysql.com/get/mys…安装rpm包sudo chmod 755 mysql80-community-release-el7-2.noarch.rpmsudo yum install mysql80-community-release-el7-2.noarch.rpmsudo yum update安装MySQLsudo yum install mysql-community-server启动MySQL,并设置开机自动启动sudo systemctl start mysqldsudo systemctl enable mysqld与安装MySQL5.7不同,MySQL8.0安装过程中没有设置密码操作,MySQL自带root用户,root用户密码在MySQL启动时会写入日志文件中,可以使用一下命令查看:cat /var/log/mysqld.log | grep password使用日志文件中的密码后需要修改root密码才能对数据库进行操作.mysql -u root -p # 然后输入日志文件中的密码ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘新密码’; # 新密码必须符合MySQL8.0 密码策略,需要有一定的强度,否则会失败设置远程主机可以访问数据库USE mysqlUPDATE user SET host=’%’ WHERE user=‘root’ # 修改root用户可以远程登录GRANT ALL PRIVILEGES ON . to ‘root’@’%’ WITH GRANT OPTION # root用户将拥有 对所有表操作的权限FLUSH PRIVILEGES # 刷新权限增加用户USE mysqlCREATE USER username IDENTIFIED BY ‘password’;UPDATE user SET host=’%’ WHERE user=‘username’ # 用户可以远程登录GRANT EXECUTE,INSERT,SELECT,UPDATE /ALL PRIVILEGES ON 数据库名.数据表(可以用*代表所有) TO ‘username’@’%’;FLUSH PRIVILEGES查看用户权限SHOW GRANTS FOR usernameWITH GRANT OPTION和 WITH admin OPTION使用了with grant option和with admin option的被授权用户user1可以将自己获得的权限授予 其他用户(user2),不同在于,取消user1的权限时,如果user1是通过with grant option授权的, 则user2的权限也会被删除即级联删除权限,with admin option则是非级联删除权限,删除user1 的权限,user2的权限不会删除.参考:https://www.jb51.net/article/…https://www.cnblogs.com/testw...https://blog.csdn.net/dongdon… ...

March 14, 2019 · 1 min · jiezi

网关 rate limit 网络速率限制方案

网关 rate limit 网络速率限制方案一、网络限流算法 在计算机领域中,限流技术(time limiting)被用来控制网络接口收发通讯数据的速率。用这个方法来优化性能、较少延迟和提高带宽等。 在互联网领域中也借鉴了这个概念,用来控制网络请求的速率,在高并发,大流量的场景中,比如双十一秒杀、抢购、抢票、抢单等场景。 网络限流主流的算法有两种,分别是漏桶算法和令牌桶算法。接下来我们一一为大家介绍:1. 漏桶算法描述:漏桶算法思路很简单,水(数据或者请求)先进入到漏桶里,漏桶以一定的速度出水,当水流入速度过大会直接溢出,可以看出漏桶算法能强行限制数据的传输速率。实现逻辑: 控制数据注入到网络的速率,平滑网络上的突发流量。漏桶算法提供了一种机制,通过它,突发流量可以被整形以便为网络提供一个稳定的流量。 漏桶可以看作是一个带有常量服务时间的单服务器队列,如果漏桶(包缓存)溢出,那么数据包会被丢弃。 优缺点:在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的参数,所以,即使网络中不存在资源冲突(没有发生拥塞),漏桶算法也不能使某一个单独的流突发到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法可以结合起来为网络流量提供更大的控制。2. 令牌桶算法实现逻辑:令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。 令牌桶的另外一个好处是可以方便的改变速度。 一旦需要提高速率,则按需提高放入桶中的令牌的速率。 一般会定时(比如100毫秒)往桶中增加一定数量的令牌, 有些变种算法则实时的计算应该增加的令牌的数量, 比如华为的专利"采用令牌漏桶进行报文限流的方法"(CN 1536815 A),提供了一种动态计算可用令牌数的方法, 相比其它定时增加令牌的方法, 它只在收到一个报文后,计算该报文与前一报文到来的时间间隔内向令牌漏桶内注入的令牌数, 并计算判断桶内的令牌数是否满足传送该报文的要求。二、常见的 Rate limiting 实现方式通常意义上的限速,其实可以分为以下三种:limit_rate 限制响应速度limit_conn 限制连接数limit_req 限制请求数1. Nginx 模块 (漏桶)参考地址:limit_req_modulengx_http_limit_req_module模块(0.7.21)用于限制每个定义键的请求处理速度,特别是来自单个IP地址的请求的处理速度。1.1 Example Configurationhttp { limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s; … server { … location /search/ { limit_req zone=one burst=5; }1.2 使用规则语法: limit_req zone=name [burst=number] [nodelay | delay=number];默认: —作用范围: http, server, location参数说明zone 设置内存名称和内存大小。burst 漏桶的突发大小。当大于突发值是请求被延迟。nodelay|delay delay参数(1.15.7)指定了过度请求延迟的限制。默认值为零,即所有过量的请求都被延迟。设置共享内存区域和请求的最大突发大小。如果请求速率超过为区域配置的速率,则延迟处理请求,以便以定义的速率处理请求。过多的请求会被延迟,直到它们的数量超过最大突发大小,在这种情况下,请求会因错误而终止。默认情况下,最大突发大小等于零。limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;server { location /search/ { limit_req zone=one burst=5; }描述:平均每秒不允许超过一个请求,突发请求不超过5个。—–参数使用说明—–如果不希望在请求受到限制时延迟过多的请求,则应使用参数nodelay:limit_req zone=one burst=5 nodelay;可以有几个limit_req指令。例如,下面的配置将限制来自单个IP地址的请求的处理速度,同时限制虚拟服务器的请求处理速度:limit_req_zone $binary_remote_addr zone=perip:10m rate=1r/s;limit_req_zone $server_name zone=perserver:10m rate=10r/s;server { … limit_req zone=perip burst=5 nodelay; limit_req zone=perserver burst=10;}当且仅当当前级别上没有limit_req指令时,这些指令从上一级继承。1.3 围绕limit_req_zone的相关配置语法: limit_req_log_level info | notice | warn | error;默认: limit_req_log_level error;作用范围: http, server, locationThis directive appeared in version 0.8.18.设置所需的日志记录级别,用于服务器因速率超过或延迟请求处理而拒绝处理请求的情况。延迟日志记录级别比拒绝日志记录级别低1点;例如,如果指定了“limit_req_log_level通知”,则使用info级别记录延迟。错误状态语法: limit_req_status code;默认: limit_req_status 503;作用范围: http, server, locationThis directive appeared in version 1.3.15.设置状态代码以响应被拒绝的请求。语法: limit_req_zone key zone=name:size rate=rate [sync];默认: —作用范围: http设置共享内存区域的参数,该区域将保存各种键的状态。特别是,状态存储当前过多请求的数量。键可以包含文本、变量及其组合。键值为空的请求不被计算。Prior to version 1.7.6, a key could contain exactly one variable.例如:limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;说明:在这里,状态保存在一个10mb的区域“1”中,该区域的平均请求处理速度不能超过每秒1个请求。总结:客户端IP地址作为密钥。注意,这里使用的是$binary_remote_addr变量,而不是$remote_addr。$binary_remote_addr变量的大小对于IPv4地址总是4个字节,对于IPv6地址总是16个字节。存储状态在32位平台上总是占用64字节,在64位平台上占用128字节。一个兆字节区域可以保存大约16000个64字节的状态,或者大约8000个128字节的状态。如果区域存储耗尽,则删除最近最少使用的状态。即使在此之后无法创建新状态,请求也会因错误而终止。速率以每秒请求数(r/s)指定。如果需要每秒少于一个请求的速率,则在每分钟请求(r/m)中指定。例如,每秒半请求是30r/m。2. Openresty 模块参考地址:lua-resty-limit-traffic参考地址:openresty常用限速2.1 限制接口总并发数按照 ip 限制其并发连接数lua_shared_dict my_limit_conn_store 100m;…location /hello { access_by_lua_block { local limit_conn = require “resty.limit.conn” – 限制一个 ip 客户端最大 1 个并发请求 – burst 设置为 0,如果超过最大的并发请求数,则直接返回503, – 如果此处要允许突增的并发数,可以修改 burst 的值(漏桶的桶容量) – 最后一个参数其实是你要预估这些并发(或者说单个请求)要处理多久,以便于对桶里面的请求应用漏桶算法 local lim, err = limit_conn.new(“my_limit_conn_store”, 1, 0, 0.5) if not lim then ngx.log(ngx.ERR, “failed to instantiate a resty.limit.conn object: “, err) return ngx.exit(500) end local key = ngx.var.binary_remote_addr – commit 为true 代表要更新shared dict中key的值, – false 代表只是查看当前请求要处理的延时情况和前面还未被处理的请求数 local delay, err = lim:incoming(key, true) if not delay then if err == “rejected” then return ngx.exit(503) end ngx.log(ngx.ERR, “failed to limit req: “, err) return ngx.exit(500) end – 如果请求连接计数等信息被加到shared dict中,则在ctx中记录下, – 因为后面要告知连接断开,以处理其他连接 if lim:is_committed() then local ctx = ngx.ctx ctx.limit_conn = lim ctx.limit_conn_key = key ctx.limit_conn_delay = delay end local conn = err – 其实这里的 delay 肯定是上面说的并发处理时间的整数倍, – 举个例子,每秒处理100并发,桶容量200个,当时同时来500个并发,则200个拒掉 – 100个在被处理,然后200个进入桶中暂存,被暂存的这200个连接中,0-100个连接其实应该延后0.5秒处理, – 101-200个则应该延后0.5*2=1秒处理(0.5是上面预估的并发处理时间) if delay >= 0.001 then ngx.sleep(delay) end } log_by_lua_block { local ctx = ngx.ctx local lim = ctx.limit_conn if lim then local key = ctx.limit_conn_key – 这个连接处理完后应该告知一下,更新shared dict中的值,让后续连接可以接入进来处理 – 此处可以动态更新你之前的预估时间,但是别忘了把limit_conn.new这个方法抽出去写, – 要不每次请求进来又会重置 local conn, err = lim:leaving(key, 0.5) if not conn then ngx.log(ngx.ERR, “failed to record the connection leaving “, “request: “, err) return end end } proxy_pass http://10.100.157.198:6112; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600;}说明:其实此处没有设置 burst 的值,就是单纯的限制最大并发数,如果设置了 burst 的值,并且做了延时处理,其实就是对并发数使用了漏桶算法,但是如果不做延时处理,其实就是使用的令牌桶算法。参考下面对请求数使用漏桶令牌桶的部分,并发数的漏桶令牌桶实现与之相似2.2 限制接口时间窗请求数限制 ip 每分钟只能调用 120 次 /hello 接口(允许在时间段开始的时候一次性放过120个请求)lua_shared_dict my_limit_count_store 100m;…init_by_lua_block { require “resty.core”}….location /hello { access_by_lua_block { local limit_count = require “resty.limit.count” – rate: 10/min local lim, err = limit_count.new(“my_limit_count_store”, 120, 60) if not lim then ngx.log(ngx.ERR, “failed to instantiate a resty.limit.count object: “, err) return ngx.exit(500) end local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) – 如果请求数在限制范围内,则当前请求被处理的延迟(这种场景下始终为0,因为要么被处理要么被拒绝)和将被处理的请求的剩余数 if not delay then if err == “rejected” then return ngx.exit(503) end ngx.log(ngx.ERR, “failed to limit count: “, err) return ngx.exit(500) end } proxy_pass http://10.100.157.198:6112; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600;}2.3 平滑限制接口请求数限制 ip 每分钟只能调用 120 次 /hello 接口(平滑处理请求,即每秒放过2个请求)lua_shared_dict my_limit_req_store 100m;….location /hello { access_by_lua_block { local limit_req = require “resty.limit.req” – 这里设置rate=2/s,漏桶桶容量设置为0,(也就是来多少水就留多少水) – 因为resty.limit.req代码中控制粒度为毫秒级别,所以可以做到毫秒级别的平滑处理 local lim, err = limit_req.new(“my_limit_req_store”, 2, 0) if not lim then ngx.log(ngx.ERR, “failed to instantiate a resty.limit.req object: “, err) return ngx.exit(500) end local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) if not delay then if err == “rejected” then return ngx.exit(503) end ngx.log(ngx.ERR, “failed to limit req: “, err) return ngx.exit(500) end } proxy_pass http://10.100.157.198:6112; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600;}2.4 漏桶算法限流限制 ip 每分钟只能调用 120 次 /hello 接口(平滑处理请求,即每秒放过2个请求),超过部分进入桶中等待,(桶容量为60),如果桶也满了,则进行限流lua_shared_dict my_limit_req_store 100m;….location /hello { access_by_lua_block { local limit_req = require “resty.limit.req” – 这里设置rate=2/s,漏桶桶容量设置为0,(也就是来多少水就留多少水) – 因为resty.limit.req代码中控制粒度为毫秒级别,所以可以做到毫秒级别的平滑处理 local lim, err = limit_req.new(“my_limit_req_store”, 2, 60) if not lim then ngx.log(ngx.ERR, “failed to instantiate a resty.limit.req object: “, err) return ngx.exit(500) end local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) if not delay then if err == “rejected” then return ngx.exit(503) end ngx.log(ngx.ERR, “failed to limit req: “, err) return ngx.exit(500) end – 此方法返回,当前请求需要delay秒后才会被处理,和他前面对请求数 – 所以此处对桶中请求进行延时处理,让其排队等待,就是应用了漏桶算法 – 此处也是与令牌桶的主要区别既 if delay >= 0.001 then ngx.sleep(delay) end } proxy_pass http://10.100.157.198:6112; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600;}3.5 令牌桶算法限流限制 ip 每分钟只能调用 120 次 /hello 接口(平滑处理请求,即每秒放过2个请求),但是允许一定的突发流量(突发的流量,就是桶的容量(桶容量为60),超过桶容量直接拒绝lua_shared_dict my_limit_req_store 100m;….location /hello { access_by_lua_block { local limit_req = require “resty.limit.req” local lim, err = limit_req.new(“my_limit_req_store”, 2, 0) if not lim then ngx.log(ngx.ERR, “failed to instantiate a resty.limit.req object: “, err) return ngx.exit(500) end local key = ngx.var.binary_remote_addr local delay, err = lim:incoming(key, true) if not delay then if err == “rejected” then return ngx.exit(503) end ngx.log(ngx.ERR, “failed to limit req: “, err) return ngx.exit(500) end – 此方法返回,当前请求需要delay秒后才会被处理,和他前面对请求数 – 此处忽略桶中请求所需要的延时处理,让其直接返送到后端服务器, – 其实这就是允许桶中请求作为突发流量 也就是令牌桶桶的原理所在 if delay >= 0.001 then – ngx.sleep(delay) end } proxy_pass http://10.100.157.198:6112; proxy_set_header Host $host; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 60; proxy_read_timeout 600; proxy_send_timeout 600;}说明:其实nginx的ngx_http_limit_req_module 这个模块中的delay和nodelay也就是类似此处对桶中请求是否做延迟处理的两种方案,也就是分别对应的漏桶和令牌桶两种算法注意:resty.limit.traffic 模块说明 This library is already usable though still highly experimental. 意思是说目前这个模块虽然可以使用了,但是还处在高度实验性阶段,所以目前(2019-03-11)放弃使用resty.limit.traffic模块。3. kong 插件参考地址:Rate Limiting Advanced (企业版)参考地址:request-termination参考地址:rate-limiting 请求限速参考地址:request-size-limiting (官方建议开启此插件,防止DOS(拒绝服务)攻击)参考地址:response-ratelimiting 响应限速参考地址:kong-response-size-limiting (非官方提供)3.1 rate-limiting速率限制开发人员在给定的几秒、几分钟、几小时、几天、几个月或几年时间内可以发出多少HTTP请求。如果底层服务/路由(或废弃的API实体)没有身份验证层,那么将使用客户机IP地址,否则,如果配置了身份验证插件,将使用使用者。在一个Service上启用该插件$ curl -X POST http://kong:8001/services/{service}/plugins \ –data “name=rate-limiting” \ –data “config.second=5” \ –data “config.hour=10000"在一个router上启用该插件$ curl -X POST http://kong:8001/routes/{route_id}/plugins \ –data “name=rate-limiting” \ –data “config.second=5” \ –data “config.hour=10000"在一个consumer上启动该插件$ curl -X POST http://kong:8001/plugins \ –data “name=rate-limiting” \ –data “consumer_id={consumer_id}” \ –data “config.second=5” \ –data “config.hour=10000"rate-limiting支持三个策略,它们分别拥有自己的优缺点策略优点缺点cluster准确,没有额外的组件来支持相对而言,性能影响最大的是,每个请求都强制对底层数据存储执行读和写操作。redis准确,比集群策略对性能的影响更小额外的redis安装要求,比本地策略更大的性能影响local最小的性能影响不太准确,除非在Kong前面使用一致哈希负载均衡器,否则在扩展节点数量时它会发散3.2 response-ratelimiting此插件允许您根据上游服务返回的自定义响应头限制开发人员可以发出的请求数量。您可以任意设置任意数量的限速对象(或配额),并指示Kong按任意数量增加或减少它们。每个自定义速率限制对象都可以限制每秒、分钟、小时、天、月或年的入站请求。在一个Service上启用该插件$ curl -X POST http://kong:8001/services/{service}/plugins \ –data “name=response-ratelimiting” \ –data “config.limits.{limit_name}=” \ –data “config.limits.{limit_name}.minute=10"在一个router上启用该插件$ curl -X POST http://kong:8001/routes/{route_id}/plugins \ –data “name=response-ratelimiting” \ –data “config.limits.{limit_name}=” \ –data “config.limits.{limit_name}.minute=10"在一个consumer上启动该插件$ curl -X POST http://kong:8001/plugins \ –data “name=response-ratelimiting” \ –data “consumer_id={consumer_id}” \ –data “config.limits.{limit_name}=” \ –data “config.limits.{limit_name}.minute=10"在api上启用该插件$ curl -X POST http://kong:8001/apis/{api}/plugins \ –data “name=response-ratelimiting” \ –data “config.limits.{limit_name}=” \ –data “config.limits.{limit_name}.minute=10"3.3 request-size-limiting阻塞体大于特定大小(以兆为单位)的传入请求。在一个Service上启用该插件$ curl -X POST http://kong:8001/services/{service}/plugins \ –data “name=request-size-limiting” \ –data “config.allowed_payload_size=128"在一个router上启用该插件$ curl -X POST http://kong:8001/routes/{route_id}/plugins \ –data “name=request-size-limiting” \ –data “config.allowed_payload_size=128"在一个consumer上启动该插件$ curl -X POST http://kong:8001/plugins \ –data “name=request-size-limiting” \ –data “consumer_id={consumer_id}” \ –data “config.allowed_payload_size=128"3.4 request-termination此插件使用指定的状态代码和消息终止传入的请求。这允许(暂时)停止服务或路由上的通信,甚至阻塞消费者。在一个Service上启用该插件$ curl -X POST http://kong:8001/services/{service}/plugins \ –data “name=request-termination” \ –data “config.status_code=403” \ –data “config.message=So long and thanks for all the fish!“在一个router上启用该插件$ curl -X POST http://kong:8001/routes/{route_id}/plugins \ –data “name=request-termination” \ –data “config.status_code=403” \ –data “config.message=So long and thanks for all the fish!“在一个consumer上启动该插件$ curl -X POST http://kong:8001/plugins \ –data “name=request-termination” \ –data “consumer_id={consumer_id}” \ –data “config.status_code=403” \ –data “config.message=So long and thanks for all the fish!“4. 基于redis - INCR key参考地址:pattern-rate-limiter(翻墙)使用redis的INCR key,它的意思是将存储在key上的值加1。如果key不存在,在操作之前将值设置为0。如果键包含错误类型的值或包含不能表示为整数的字符串,则返回错误。此操作仅限于64位带符号整数。return value Integer reply: the value of key after the incrementexamplesredis> SET mykey “10"“OK"redis> INCR mykey(integer) 11redis> GET mykey"11"redis> INCR key 有两种用法:计数器(counter),比如文章浏览总量、分布式数据分页、游戏得分等;限速器(rate limiter),速率限制器模式是一种特殊的计数器,用于限制操作的执行速率,比如:限制可以针对公共API执行的请求数量;本方案的重点是使用redis实现一个限速器,我们使用INCR提供了该模式的两种实现,其中我们假设要解决的问题是将API调用的数量限制在每IP地址每秒最多10个请求:第一种方式,基本上每个IP都有一个计数器,每个不同的秒都有一个计数器FUNCTION LIMIT_API_CALL(ip)ts = CURRENT_UNIX_TIME()keyname = ip+”:"+tscurrent = GET(keyname)IF current != NULL AND current > 10 THEN ERROR “too many requests per second"ELSE MULTI INCR(keyname,1) EXPIRE(keyname,10) EXEC PERFORM_API_CALL()END优点:使用ip+ts的方式,确保了每秒的缓存都是不同的key,将每一秒产生的redisobject隔离开。没有使用过期时间强制限制redis过期时效。缺点:会产生大量的redis-key,虽然都写入了过期时间,但是对于redis-key的清理也是一种负担。有可能会影响redis的读性能。第二种方式,创建计数器的方式是,从当前秒中执行的第一个请求开始,它只能存活一秒钟。如果在同一秒内有超过10个请求,计数器将达到一个大于10的值,否则它将过期并重新从0开始。FUNCTION LIMIT_API_CALL(ip):current = GET(ip)IF current != NULL AND current > 10 THEN ERROR “too many requests per second"ELSE value = INCR(ip) IF value == 1 THEN EXPIRE(ip,1) END PERFORM_API_CALL()END优点:相对于方案一种占用空间更小,执行效率更高。缺点:INCR命令和EXPIRE命令不是原子操作,存在一个竞态条件。如果由于某种原因客户端执行INCR命令,但没有执行过期,密钥将被泄露,直到我们再次看到相同的IP地址。修复方案:将带有可选过期的INCR转换为使用EVAL命令发送的Lua脚本(只有在Redis 2.6版本中才可用)。使用lua局部变量来解决,保证每次都能设置过期时间。local currentcurrent = redis.call(“incr”,KEYS[1])if tonumber(current) == 1 then redis.call(“expire”,KEYS[1],1)end三、最终实现方案根据几种常见的实现方案和场景以及优缺点最终采用的是使用kong的插件 rate-limiting ,如果不符合要求进行二次开发。直接开发kong插件使用令牌桶+redis实现限流 ...

March 11, 2019 · 6 min · jiezi

tutorial for ss-proxy

作为一名IT男,经常需要查询全球范围的资料,保持最先进的技术视野。前提是具备一个良好的搜索工具,提供一篇教程供大家参考,希望能有帮助。教程链接

March 11, 2019 · 1 min · jiezi

服务器(CentOS)安装配置mongodb

安装须知mongo DB下载地址mongodb官网下载Linux须知知识:安装过程服务器下载安装包下载: curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-4.0.6.tgz;解压:tar -zxvf mongodb-linux-x86_64-rhel62-4.0.6/;移动到需要存放的目录下mv mongodb-linux-x86_64-rhel62-4.0.6/ /usr/local/mongodb配置环境变量:export PATH=/usr/local/mongodb/bin:$PATH,直接执行此命令,只会创建出临时的环境变量,即重新断开连接服务器后会失效;环境变量持久化配置:需要将mongod路径添加到系统路径中,在/etc/profile文件中,添加 export PATH=/usr/local/mongodb/bin:$PATH;执行source /etc/profile,使系统环境变量立即生效验证是否安装成功:mongod –versiondb version v4.0.6git version: caa42a1f75a56c7643d0b68d3880444375ec42e3OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013allocator: tcmallocmodules: nonebuild environment: distmod: rhel62 distarch: x86_64 target_arch: x86_64mongod启动配置1. 创建数据库存放和日志目录因为MongoDB的数据存储在data目录的db目录下,而该目录在安装过程中并不会自动创建,所以需要手动创建data目录,并在data目录中创建db目录。mongoDB启动默认使用的数据哭存储目录是根目录/data/db;当然也可以在其他目录下创建,然后通过–dbpath来指定;根目录下创建:mkdir -p /data/db;这里为了后期好查找,就不创建在根目录下,而是放在mongodb目录下/usr/local/mongodb/data/db日志目录创建/usr/local/mongodb/logs2. 配置mongod启动文件/usr/local/mongodb/etc下创建配置文件mongod.config:dbpath=/usr/local/mongodb/data # 数据库存放位置(之前创建的)logpath=/usr/local/mongodb/logs/mongodb.log # 数据库日志存放位置(之前创建的)port=27017fork=true #后台运行auth=false # 初次配置先关了权限验证登陆模式journal=false3. 启动mongod启动:mongod -f /usr/local/mongod/etc/mongod.config;进入数据库管理命令界面:mongo创建数据库管理角色db.createUser({user:‘root’,pwd:‘1234567’,roles:[{‘role’:‘userAdminAnyDatabase’,‘db’:‘admin’}]})运行结果:Successfully added user: { “user” : “root”, “roles” : [ { “role” : “userAdminAnyDatabase”, “db” : “admin” } ]}退出服务,谨慎使用kill直接去杀掉mongodb进程,可以使用db.shutdownServer()关闭.使用权限方式启动MongoDB,在配置文件中添加:auth=true , 然后启动:mongod -f /usr/local/mongod/etc/mongod.config进入mongo shell,使用admin数据库use admin并进行验证db.auth(‘root’,‘123456’),验证成功返回1失败返回0;如果不验证或验证失败,是做不了任何操作的4.MongoDB设置为系统服务并且设置开机启动在服务器的系统服务文件中添加mongod配置:vim /etc/rc.d/init.d/mongod,输入:start() {/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/etc/mongod.config}stop() {/usr/local/mongodb/bin/mongod –config /usr/local/mongodb/etc/mongod.config –shutdown}case “$1” in start) start ;;stop) stop ;;restart) stop start ;; *) echo$“Usage: $0 {start|stop|restart}” exit 1esac保存并添加脚本执行权限:chmod +x /etc/rc.d/init.d/mongod;现在可以试试使用service mongod [start|stop|restart|try-restart|reload|force-reload| status]来直接管理MongoDB服务啦;试试关闭服务:[lwh@insnce-4ep /]# service mongod stop2019-03-10T16:45:22.360+0800 I CONTROL [main] log file “/usr/local/mongodb/logs/mongodb.log” exists; moved to “/usr/local/mongodb/logs/mongodb.log.2019-03-10T08-45-22”.killing process with pid: 10652试试开启服务:service mongod start;ok!!其他“积跬步、行千里”—— 持续更新中~,喜欢的话留下个赞和关注哦!往期经典好文:Koa日志中间件封装开发(log4js)团队合作必备的Git操作使用pm2部署node生产环境 ...

March 10, 2019 · 1 min · jiezi

亦大亦小如你--MySQL

写在前面MySQL 是个神奇的关系型数据库,真心感觉牛逼,因为做的项目比较杂,之前也碰到过 Oracle 数据库,给我的印象是 Oracle 很臃肿繁琐,配置多,如果是小项目用它的话感觉就像是杀鸡用牛刀,大材小用。但是也不是说Mysql不能用于大项目,MySQL 开元免费,是现在关系型数据库的主流产品,网上相应的文档和问题解决方案也会很多,意思就是比如菜鸟如我碰到了Mysql出的问题,网上基本上很全。系统环境 Debain 7Mysql 5.61.MySQL 简单操作命令//1.登录mysql,括号中的为可选项,$(包括$)后面为实际数据,-D是指定数据库登录mysql (-h$host) (-P$port) -u$user -p$pwd (-D$dbname) //地址 端口 账号 密码 数据库名//2.删除、创建数据库drop database dbname; //删除数据库create database dbname charset utf8 //创建数据库//3.删除、创建数据库表drop table tablename;//删除表create table tablename(id int, name varchar(80)); //创建表//4.表操作show triggers\g / show triggers; //查看触发器show variables like ‘character_set_database’; //查看库编码desc tablename; //查看表结构select current_date(); //查看表创建时间//5.导入sql文件use dbname;source /dbname.sql; //执行 sql 文件//6.当前的连接情况select current_user(); //查看当前登录账号show processlist; //查看当前进程show full processlist;//查看当前全部进程select user,host,Super_priv from mysql.user; //查看所有可连接用户、地址和权限信息(Super_priv 用户有super权限才可以导入数据)grant all privileges on . to root@’%’ identified by ‘root’ with grant option;flush privileges; //给root用户远程登录的所有权限2.自动导入sql文件2.1 shell操作#创建 createDb.sh,内容如下:#!/bin/bash#通过 shell 自动初始化数据库和表结构host=$1 #地址port=$2 #端口user=$3 #账号pwd=$4 #密码dbname=$5 #数据库名path=$6 #sql 文件路径mysql -h$host -P$port -u$user -p$pwd <<EOFdrop database if exists $dbname;create database $dbname charset utf8;use $dbname;source $pathCOMMIT;EOF#查看 shell 的执行过程命令sh -x ./shell //查看 shell 执行过程2.2 expect操作#!/usr/bin/expect -fset timeout 10set host [lindex $argv 0]set port [lindex $argv 1]set user [lindex $argv 2]set pwd [lindex $argv 3]set dbname [lindex $argv 4]set path [lindex $argv 5]set cset [lindex $argv 6] #字符编码spawn mysql -h$host -P$port -u$user -pexpect “Enter password: “send “$pwd\r"expect “mysql> “send “drop database if exists $dbname;create database $dbname charset $cset;\r"expect “mysql> “send “use $dbname;\r"expect “mysql> “send “source $path;\r"expect “mysql> “send “exit\r"interact回头研究再更新操作,有哪里写的不对的也请不吝赐教 ...

March 9, 2019 · 1 min · jiezi

【CentOS】查看CentOS的内核版本号及Linux版本号

查看Linux内核版本号(方法1)[sqs@bogon tmp]$ cat /etc/redhat-releaseCentOS Linux release 7.6.1810 (Core)查看Linux内核版本号(方法2)[sqs@bogon tmp]$ lsb_release -aLSB Version: :core-4.1-amd64:core-4.1-noarch:cxx-4.1-amd64:cxx-4.1-noarch:desktop-4.1-amd64:desktop-4.1-noarch:languages-4.1-amd64:languages-4.1-noarch:printing-4.1-amd64:printing-4.1-noarchDistributor ID: CentOSDescription: CentOS Linux release 7.6.1810 (Core)Release: 7.6.1810Codename: Core查看Linux系统版本号[sqs@bogon tmp]$ uname -aLinux bogon 3.10.0-957.el7.x86_64 #1 SMP Thu Nov 8 23:39:32 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux查看Linux系统版本号及RedHat版本[sqs@bogon tmp]$ cat /proc/versionLinux version 3.10.0-957.el7.x86_64 (mockbuild@kbuilder.bsys.centos.org) (gcc version 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC) ) #1 SMP Thu Nov 8 23:39:32 UTC 2018

March 9, 2019 · 1 min · jiezi

CentOS 7 yum 安装 MySQL

导语已经安装完成 Nginx 和 PHP,接下来就是安装 MySQL。这次不用编译安装,使用 yum 安装试试。添加 yum 源先下载源安装包, 输入 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 接下来安装,输入 yum localinstall mysql57-community-release-el7-11.noarch.rpm 。执行之后来看下是否安装成功 yum 安装并启动服务好了,接下来就是 yum -y install mysql-community-server输入 systemctl start mysqld 来启动服务最后输入 systemctl enable mysqld 添加开机自动启动。至此,MySQL 已经安装成功。修改默认密码使用 grep ’temporary password’ /var/log/mysqld.log 查看默认密码。然后 mysql -u root -p 输入查找到的默认密码登录 MySQL输入 ALTER USER ‘root’@’localhost’ IDENTIFIED BY ‘youPassword’; 修改密码。注意,MySQL 5.7 要求密码必须包含大小写字母,数字和特殊字符。开启远程连接在 MySQL 中输入 GRANT ALL PRIVILEGES ON . TO ‘username’@’%’ IDENTIFIED BY ‘password’ WITH GRANT OPTION; 。添加完成后在开启端口 参考资料:CentOS 7 下 Yum 安装 MySQL 5.7、CentOS7 yum安装 MySql、Centos 7 安装 MySQL。 ...

March 9, 2019 · 1 min · jiezi

已安装nginx新增模块(以新增headers-more-nginx-module模块为例)

需求场景编译好的nginx需要添加headers-more-nginx-module模块来自定义响应头nginx其它模块同样适用环境nginx包目录:/app/nginx-1.12.2nginx安装目录:/app/nginx112插件目录:/app/tools/headers-more-nginx-module-0.33系统环境centOs7资源地址headers-more-nginx-module-0.33github地址查看插件支持的nginx版本github地址headers-more-nginx-module下载地址nginx下载地址下载# 举例目录/app/toolscd /app/tools/#下载插件wget https://github.com/openresty/headers-more-nginx-module/archive/v0.33.tar.gz#解压tar -zxvf v0.33.tar.gz加载模块# 查看安装参数命令(取出:configure arguments:)/app/nginx/sbin/nginx -V# 在nginx资源目录编译cd /app/nginx-1.12.2/# 将上面取出的configure arguments后面追加 –add-module=/app/tools/headers-more-nginx-module-0.33./configure –prefix=/app/nginx112 –add-module=/app/tools/headers-more-nginx-module-0.33# 编辑,切记没有make installmake# 备份cp /app/nginx112/sbin/nginx /app/nginx112/sbin/nginx.bak # 覆盖(覆盖提示输入y)cp -f /app/nginx-1.12.2/objs/nginx /app/nginx112/sbin/nginx修改配置vim /app/nginx112/conf/nginx.conf# 添加配置(在http模块)more_clear_headers ‘Server’;上面配置只是将http响应头中的Server:nginx/1.12.2清楚,详细使用方案可阅读参考文档,支持添加·修改·清除响应头的操作,重启nginx/app/nginx112/sbin/nginx -s stop/app/nginx112/sbin/nginx直接使用reload可能会无效

March 7, 2019 · 1 min · jiezi

mysql三种安装方式之-rpm方式安装

查看安装以及卸载# 查看rpm -qa | grep mysql# 卸载yum -y remove mysql-libs-5.1.66-2.el6_3.x86_641.centos7需要先卸载mariadb查看命令rpm -qa | grep mariadb安装包资源地址mysql下载地址# 下载资源名称mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar解压资源tar -xvf mysql-5.7.22-1.el7.x86_64.rpm-bundle.tar 获取rpm包mysql-community-common-5.7.19-1.el6.x86_64.rpmmysql-community-client-5.7.19-1.el6.x86_64.rpmmysql-community-server-5.7.19-1.el6.x86_64.rpmmysql-community-libs-5.7.19-1.el6.x86_64.rpm安装# 安装顺序# common –> libs –> clients –> server# 安装命令rpm -ivh mysql-community-common-5.7.19-1.el6.x86_64.rpm mysql-community-libs-5.7.19-1.el6.x86_64.rpm mysql-community-client-5.7.19-1.el6.x86_64.rpm mysql-community-server-5.7.19-1.el6.x86_64.rpm可能需要依赖包libaio安装命令yum -y install libaio初始化mysqld –initialize –user=mysql启动service mysqld start登陆# 查看初始密码cat /var/logs/mysql.log#或者grep ‘password’ /var/logs/mysql.log -n -B 5# 登陆mysql -uroot -p'123456’# 修改初始密码set PASSWORD=PASSWORD(‘密码’);授权远程链接### 授权192.168.0.1可以远程链接*[所有数据库].[所有表] 账号:root 密码123456grant all privileges on . to ‘root’@‘192.168.0.1’ identified by ‘123456’;### 授权所有ipgrant all privileges on . to ‘root’@’%’ identified by ‘123456’;### 以上.*表示[数据库].[表]### 使授权立刻生效flush privileges; ...

March 7, 2019 · 1 min · jiezi

实战生产环境:1.13.3最新版k8s集群部署Heapster插件

本篇文章,所使用的任何镜像和yaml我都会发一个网盘链接,供大家下载学习!链接:https://pan.baidu.com/s/1inmW… 密码:92uagithub:https://github.com/heyangguang有任何问题可以直接联系我的Email:heyangev@cn.ibm.comHeapster是一个收集者,将每个Node上的cAdvisor的数据进行汇总,然后导到第三方工具(如InfluxDB)。Heapster介绍架构图:Heapster首先从K8S Master获取集群中所有Node的信息,然后通过这些Node上的kubelet获取有用数据,而kubelet本身的数据则是从cAdvisor得到。所有获取到的数据都被推到Heapster配置的后端存储中,并还支持数据的可视化。现在后端存储 + 可视化的方法,如InfluxDB + grafana。部署实施:下载heapster镜像,上传heapster.yaml、heapster-mod.yaml文件apply就可以了。k8smaster:[root@k8smaster ~]# docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd64:v1.5.4Trying to pull repository registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd64 …v1.5.4: Pulling from registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd6491380601464e: Pull completef351486260ed: Pull completeDigest: sha256:c4a8d9c0007abb73a1b9e4f9c8bfb044e475aae2b4e6276ab2f8b13959cf6949Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/heapster-amd64:v1.5.4[root@k8smaster ~]# lsanaconda-ks.cfg heapster-mod.yaml heapster.yaml images.tar kube-flannel.yml[root@k8smaster ~]# kubectl apply -f heapster.yamlserviceaccount/heapster createdclusterrolebinding.rbac.authorization.k8s.io/heapster createddeployment.apps/heapster createdservice/heapster created[root@k8smaster ~]# kubectl apply -f heapster-mod.yamlWarning: kubectl apply should be used on resource created by either kubectl create –save-config or kubectl applyclusterrole.rbac.authorization.k8s.io/system:heapster configured查看状态:[root@k8smaster ~]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-86c58d9df4-kmfct 1/1 Running 0 23mcoredns-86c58d9df4-qn2k2 1/1 Running 0 23metcd-k8smaster 1/1 Running 0 23mheapster-569b679494-rktzf 1/1 Running 0 18skube-apiserver-k8smaster 1/1 Running 1 22mkube-controller-manager-k8smaster 1/1 Running 0 22mkube-flannel-ds-amd64-9rmfz 1/1 Running 0 19mkube-flannel-ds-amd64-vnwtf 1/1 Running 0 15mkube-flannel-ds-amd64-x7q4s 1/1 Running 0 15mkube-proxy-7zl9n 1/1 Running 0 22mkube-proxy-t2sx9 1/1 Running 0 23mkube-proxy-txsfr 1/1 Running 0 22mkube-scheduler-k8smaster 1/1 Running 0 23m稍等一会,使用kubectl top node查看集群状态即可:[root@k8smaster ~]# kubectl top nodeNAME CPU(cores) CPU% MEMORY(bytes) MEMORY%k8smaster 122m 3% 2848Mi 8%k8snode-1 27m 0% 603Mi 1%k8snode-2 26m 0% 582Mi 1%到这里heapster收集集群数据教程就完成了!希望大家可以给我指出问题,我们一起前进!谢谢大家! ...

March 6, 2019 · 1 min · jiezi

zabbix 4.0.3 use docker-compose deploy

CentOS 7 使用 docker-compose 部署zabbix 4.0.3docker-compose.yaml 配置文件如下:version: ‘3.1’services: db: image: mysql command: –default-authentication-plugin=mysql_native_password –character-set-server=utf8mb4 –collation-server=utf8mb4_unicode_ci –default-time-zone=’+08:00’ restart: unless-stopped environment: MYSQL_ROOT_PASSWORD: “MysqlPasswd” MYSQL_ALLOW_EMPTY_PASSWORD: “no” ports: - 9306:3306 volumes: - /data/dockerdata/db/data:/var/lib/mysql - /data/dockerdata/db/conf:/etc/mysql/conf.d - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime server: image: zabbix/zabbix-server-mysql:centos-4.0.3 restart: unless-stopped environment: DB_SERVER_HOST: db MYSQL_USER: root MYSQL_PASSWORD: MysqlPasswd ZBX_TIMEOUT: 30 ports: - 9051:10051 - 8444:10051 volumes: - /data/dockerdata/server/alertscripts:/usr/lib/zabbix/alertscripts - /data/dockerdata/server/externalscripts:/usr/lib/zabbix/externalscripts - /data/dockerdata/server/modules:/var/lib/zabbix/modules - /data/dockerdata/server/enc:/var/lib/zabbix/enc - /data/dockerdata/server/ssh_keys:/var/lib/zabbix/ssh_keys - /data/dockerdata/server/ssl/certs:/var/lib/zabbix/ssl/certs - /data/dockerdata/server/ssl/keys:/var/lib/zabbix/ssl/keys - /data/dockerdata/server/ssl/ssl_ca:/var/lib/zabbix/ssl/ssl_ca - /data/dockerdata/server/snmptraps:/var/lib/zabbix/snmptraps - /data/dockerdata/server/mibs:/var/lib/zabbix/mibs - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime web: image: zabbix/zabbix-web-nginx-mysql:centos-4.0.3 restart: unless-stopped environment: DB_SERVER_HOST: db MYSQL_USER: root MYSQL_PASSWORD: MysqlPasswd ZBX_SERVER_HOST: server PHP_TZ: “Asia/Shanghai” ZBX_SERVER_NAME: aws ports: - 8081:80 volumes: - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime ...

March 6, 2019 · 1 min · jiezi

实战生产环境:kubeadmin安装1.13.3最新版k8s集群教程

2019年3月6日:出版安装kubeadmin部署k8s集群教程本次安装采用kubeadmin !安装的k8s版本为1.13.3版,是当前最新版本!本篇文章,所使用的任何镜像和yaml都会在我的github上找到!github:https://github.com/heyangguang有任何问题可以直接联系我的Email:heyangev@cn.ibm.com主机列表:系统采用的是Centos7.5主机名IP地址角色k8smaster9.186.137.114masterk8snode-19.186.137.115nodek8snode-29.186.137.116Node基础环境准备:关闭防火墙、关闭selinux,关闭swap,关闭网卡管理器。k8smaster:[root@k8smaster ~]# systemctl stop firewalld[root@k8smaster ~]# systemctl disable firewalld[root@k8smaster ~]# systemctl stop NetworkManager ; systemctl disable NetworkManager[root@k8smaster ~]# vim /etc/selinux/config[root@k8smaster ~]# scp /etc/selinux/config root@k8snode-1:/etc/selinux/configconfig 100% 546 1.1MB/s 00:00[root@k8smaster ~]# scp /etc/selinux/config root@k8snode-2:/etc/selinux/configconfig 100% 546 1.3MB/s 00:00[root@k8smaster ~]# swapoff -a[root@k8smaster ~]# vim /etc/fstab[root@k8smaster ~]# cat /etc/fstab## /etc/fstab# Created by anaconda on Mon Mar 4 17:23:04 2019## Accessible filesystems, by reference, are maintained under ‘/dev/disk’# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info#/dev/mapper/centos-root / xfs defaults 0 0UUID=3dd5660e-0905-4f1e-9fa3-9ce664d6eb94 /boot xfs defaults 0 0/dev/mapper/centos-home /home xfs defaults 0 0#/dev/mapper/centos-swap swap swap defaults 0 0k8snode-1:[root@k8snode-1 ~]# systemctl stop firewalld[root@k8snode-1 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.[root@k8snode-1 ~]# systemctl stop NetworkManager ; systemctl disable NetworkManager[root@k8snode-1 ~]# swapoff -a[root@k8snode-1 ~]# vim /etc/fstabk8snode-2:[root@k8snode-2 ~]# systemctl stop firewalld[root@k8snode-2 ~]# systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.[root@k8snode-2 ~]# swapoff -a[root@k8snode-2 ~]# systemctl stop NetworkManager ; systemctl disable NetworkManager[root@k8snode-2 ~]# vim /etc/fstabyum源配置:需要k8snode-1和k8snode-2先操作,在把yum源copy过去。k8smaster:[root@k8smaster yum.repos.d]# rm -rf [root@k8smaster yum.repos.d]# ll总用量 12-rw-r–r– 1 root root 2206 3月 5 18:50 CentOS-Base.repo-rw-r–r– 1 root root 923 3月 5 18:50 epel.repo-rw-r–r– 1 root root 276 3月 5 18:50 k8s.repo[root@k8smaster yum.repos.d]# scp * k8snode-1:/etc/yum.scp: /etc/yum.: No such file or directory[root@k8smaster yum.repos.d]# scp * k8snode-1:/etc/yum.repos.d/CentOS-Base.repo 100% 2206 352.0KB/s 00:00epel.repo 100% 923 160.8KB/s 00:00k8s.repo 100% 276 48.2KB/s 00:00[root@k8smaster yum.repos.d]# scp * k8snode-2:/etc/yum.repos.d/CentOS-Base.repo 100% 2206 216.3KB/s 00:00epel.repo 100% 923 157.1KB/s 00:00k8s.repo 100% 276 47.5KB/s 00:00k8snode-1:[root@k8snode-1 ~]# cd /etc/yum.repos.d/[root@k8snode-1 yum.repos.d]# rm -rf k8snode-2:[root@k8snode-2 ~]# rm -rf /etc/yum.repos.d/安装Docker引擎:k8smaster:[root@k8smaster yum.repos.d]# yum -y install docker[root@k8smaster yum.repos.d]# systemctl start docker ; systemctl enable dockerCreated symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.k8snode-1:[root@k8snode-1 yum.repos.d]# yum -y install docker[root@k8snode-1 yum.repos.d]# systemctl start docker ; systemctl enable dockerCreated symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.k8snode-2:[root@k8snode-2 ~]# yum -y install docker[root@k8snode-2 ~]# systemctl start docker ; systemctl enable dockerCreated symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.设置k8s相关系统内核参数:k8smaster:[root@k8smaster ~]# cat << EOF > /etc/sysctl.d/k8s.conf> net.bridge.bridege-nf-call-iptables = 1> net.bridge.bridege-nf-call-ip6tables = 1> EOF[root@k8smaster ~]# sysctl -pk8snode-1:[root@k8snode-1 ~]# cat << EOF > /etc/sysctl.d/k8s.conf> net.bridge.bridege-nf-call-iptables = 1> net.bridge.bridege-nf-call-ip6tables = 1> EOF[root@k8snode-1 ~]# sysctl -pk8snode-2:[root@k8snode-2 ~]# cat << EOF > /etc/sysctl.d/k8s.conf> net.bridge.bridege-nf-call-iptables = 1> net.bridge.bridege-nf-call-ip6tables = 1> EOF[root@k8snode-2 ~]# sysctl -p安装kubernetes相关组件:k8smaster:[root@k8smaster ~]# yum install -y kubelet-1.13.3 kubeadm-1.11.1 kubectl-1.13.3 –disableexcludes=kubernetes[root@k8smaster ~]# systemctl start kubelet ; systemctl enable kubeletCreated symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.k8snode-1:[root@k8snode-1 ~]# yum install -y kubelet-1.13.3 kubeadm-1.11.1 kubectl-1.13.3 –disableexcludes=kubernetes[root@k8snode-1 ~]# systemctl start kubelet ; systemctl enable kubeletCreated symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.k8snode-2:[root@k8snode-2 ~]# yum install -y kubelet-1.13.3 kubeadm-1.11.1 kubectl-1.13.3 –disableexcludes=kubernetes[root@k8snode-2 ~]# systemctl start kubelet ; systemctl enable kubeletCreated symlink from /etc/systemd/system/multi-user.target.wants/kubelet.service to /etc/systemd/system/kubelet.service.导入所需要的镜像:为什么要导入镜像呢?因为kubeadmin会去谷歌的镜像源上面下载,大家都懂得!所以我下载下来,使用的时候直接导入就好了。所需要的镜像:k8s.gcr.io/kube-apiserver:v1.13.3k8s.gcr.io/kube-controller-manager:v1.13.3k8s.gcr.io/kube-scheduler:v1.13.3k8s.gcr.io/kube-proxy:v1.13.3k8s.gcr.io/etcd:3.2.24k8s.gcr.io/coredns:1.2.6k8s.gcr.io/pause:3.1这里所用到的镜像,我会全部打包到我的github上,需要的可以去下载。导入方式相同,只需要全部导入即可!k8smaster:[root@k8smaster ~]# lsanaconda-ks.cfg images.tar[root@k8smaster ~]# ll总用量 1834184-rw——-. 1 root root 1245 3月 4 17:27 anaconda-ks.cfg-rw-r–r–. 1 root root 1878197248 3月 5 18:31 images.tar[root@k8smaster ~]# docker load < images.tark8snode-1:[root@k8snode-1 ~]# lsanaconda-ks.cfg images.tar[root@k8snode-1 ~]# docker load < images.tark8snode-2:[root@k8snode-2 ~]# lsanaconda-ks.cfg images.tar[root@k8snode-2 ~]# docker load < images.tarmaster上初始化kubeadmin生成node token:使用kubeadm init 初始化环境,–kubernetes-version指定版本,-pod-network-cidr指定虚拟网络的网段,可以随便指定任何网段![root@k8smaster ~]# kubeadm init –kubernetes-version=v1.13.3 –pod-network-cidr=10.244.0.0/16[init] using Kubernetes version: v1.13.3[preflight] running pre-flight checks [WARNING KubernetesVersion]: kubernetes version is greater than kubeadm version. Please consider to upgrade kubeadm. kubernetes version: 1.13.3. Kubeadm version: 1.11.xI0305 19:49:27.250624 5373 kernel_validator.go:81] Validating kernel versionI0305 19:49:27.250718 5373 kernel_validator.go:96] Validating kernel config[preflight/images] Pulling images required for setting up a Kubernetes cluster[preflight/images] This might take a minute or two, depending on the speed of your internet connection[preflight/images] You can also perform this action in beforehand using ‘kubeadm config images pull’[kubelet] Writing kubelet environment file with flags to file “/var/lib/kubelet/kubeadm-flags.env”[kubelet] Writing kubelet configuration to file “/var/lib/kubelet/config.yaml”[preflight] Activating the kubelet service[certificates] Generated ca certificate and key.[certificates] Generated apiserver certificate and key.[certificates] apiserver serving cert is signed for DNS names [k8smaster kubernetes kubernetes.default kubernetes.default.svc kubernetes.default.svc.cluster.local] and IPs [10.96.0.1 9.186.137.114][certificates] Generated apiserver-kubelet-client certificate and key.[certificates] Generated sa key and public key.[certificates] Generated front-proxy-ca certificate and key.[certificates] Generated front-proxy-client certificate and key.[certificates] Generated etcd/ca certificate and key.[certificates] Generated etcd/server certificate and key.[certificates] etcd/server serving cert is signed for DNS names [k8smaster localhost] and IPs [127.0.0.1 ::1][certificates] Generated etcd/peer certificate and key.[certificates] etcd/peer serving cert is signed for DNS names [k8smaster localhost] and IPs [9.186.137.114 127.0.0.1 ::1][certificates] Generated etcd/healthcheck-client certificate and key.[certificates] Generated apiserver-etcd-client certificate and key.[certificates] valid certificates and keys now exist in “/etc/kubernetes/pki”[kubeconfig] Wrote KubeConfig file to disk: “/etc/kubernetes/admin.conf”[kubeconfig] Wrote KubeConfig file to disk: “/etc/kubernetes/kubelet.conf”[kubeconfig] Wrote KubeConfig file to disk: “/etc/kubernetes/controller-manager.conf”[kubeconfig] Wrote KubeConfig file to disk: “/etc/kubernetes/scheduler.conf”[controlplane] wrote Static Pod manifest for component kube-apiserver to “/etc/kubernetes/manifests/kube-apiserver.yaml”[controlplane] wrote Static Pod manifest for component kube-controller-manager to “/etc/kubernetes/manifests/kube-controller-manager.yaml”[controlplane] wrote Static Pod manifest for component kube-scheduler to “/etc/kubernetes/manifests/kube-scheduler.yaml”[etcd] Wrote Static Pod manifest for a local etcd instance to “/etc/kubernetes/manifests/etcd.yaml”[init] waiting for the kubelet to boot up the control plane as Static Pods from directory “/etc/kubernetes/manifests”[init] this might take a minute or longer if the control plane images have to be pulled[apiclient] All control plane components are healthy after 19.502118 seconds[uploadconfig] storing the configuration used in ConfigMap “kubeadm-config” in the “kube-system” Namespace[kubelet] Creating a ConfigMap “kubelet-config-1.13” in namespace kube-system with the configuration for the kubelets in the cluster[markmaster] Marking the node k8smaster as master by adding the label “node-role.kubernetes.io/master=’’"[markmaster] Marking the node k8smaster as master by adding the taints [node-role.kubernetes.io/master:NoSchedule][patchnode] Uploading the CRI Socket information “/var/run/dockershim.sock” to the Node API object “k8smaster” as an annotation[bootstraptoken] using token: xjzf96.nv0qhqwj9j47r1tv[bootstraptoken] configured RBAC rules to allow Node Bootstrap tokens to post CSRs in order for nodes to get long term certificate credentials[bootstraptoken] configured RBAC rules to allow the csrapprover controller automatically approve CSRs from a Node Bootstrap Token[bootstraptoken] configured RBAC rules to allow certificate rotation for all node client certificates in the cluster[bootstraptoken] creating the “cluster-info” ConfigMap in the “kube-public” namespace[addons] Applied essential addon: CoreDNS[addons] Applied essential addon: kube-proxyYour Kubernetes master has initialized successfully!To start using your cluster, you need to run the following as a regular user: mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/configYou should now deploy a pod network to the cluster.Run “kubectl apply -f [podnetwork].yaml” with one of the options listed at: https://kubernetes.io/docs/concepts/cluster-administration/addons/You can now join any number of machines by running the following on each nodeas root: kubeadm join 9.186.137.114:6443 –token xjzf96.nv0qhqwj9j47r1tv –discovery-token-ca-cert-hash sha256:e386175a5cae597dec6bfeb7c92d01bc5fe052313b50dc48e419057c8c3f824c [root@k8smaster ~]# mkdir -p $HOME/.kube[root@k8smaster ~]# sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config[root@k8smaster ~]# sudo chown $(id -u):$(id -g) $HOME/.kube/confignode节点执行kubeadm join加入集群:注意!一定要时间同步,否则就会出问题!报这个错误:[discovery] Failed to request cluster info, will try again: [Get https://9.186.137.114:6443/api/v1/namespaces/kube-public/configmaps/cluster-info: x509: certificate has expired or is not yet valid]k8snode-1:[root@k8snode-1 ~]# kubeadm join 9.186.137.114:6443 –token xjzf96.nv0qhqwj9j47r1tv –discovery-token-ca-cert-hash sha256:e386175a5cae597dec6bfeb7c92d01bc5fe052313b50dc48e419057c8c3f824c[preflight] running pre-flight checks [WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs ip_vs_rr ip_vs_wrr ip_vs_sh] or no builtin kernel ipvs support: map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}]you can solve this problem with following methods: 1. Run ‘modprobe – ’ to load missing kernel modules;2. Provide the missing builtin kernel ipvs supportI0305 20:02:24.453910 5983 kernel_validator.go:81] Validating kernel versionI0305 20:02:24.454026 5983 kernel_validator.go:96] Validating kernel config[discovery] Trying to connect to API Server “9.186.137.114:6443”[discovery] Created cluster-info discovery client, requesting info from “https://9.186.137.114:6443”[discovery] Requesting info from “https://9.186.137.114:6443” again to validate TLS against the pinned public key[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server “9.186.137.114:6443”[discovery] Successfully established connection with API Server “9.186.137.114:6443”[kubelet] Downloading configuration for the kubelet from the “kubelet-config-1.13” ConfigMap in the kube-system namespace[kubelet] Writing kubelet configuration to file “/var/lib/kubelet/config.yaml”[kubelet] Writing kubelet environment file with flags to file “/var/lib/kubelet/kubeadm-flags.env”[preflight] Activating the kubelet service[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap…[patchnode] Uploading the CRI Socket information “/var/run/dockershim.sock” to the Node API object “k8snode-1” as an annotationThis node has joined the cluster: Certificate signing request was sent to master and a response was received. The Kubelet was informed of the new secure connection details.Run ‘kubectl get nodes’ on the master to see this node join the cluster.k8snode-2:[root@k8snode-2 ~]# kubeadm join 9.186.137.114:6443 –token xjzf96.nv0qhqwj9j47r1tv –discovery-token-ca-cert-hash sha256:e386175a5cae597dec6bfeb7c92d01bc5fe052313b50dc48e419057c8c3f824c[preflight] running pre-flight checks [WARNING RequiredIPVSKernelModulesAvailable]: the IPVS proxier will not be used, because the following required kernel modules are not loaded: [ip_vs_rr ip_vs_wrr ip_vs_sh ip_vs] or no builtin kernel ipvs support: map[ip_vs:{} ip_vs_rr:{} ip_vs_wrr:{} ip_vs_sh:{} nf_conntrack_ipv4:{}]you can solve this problem with following methods: 1. Run ‘modprobe – ’ to load missing kernel modules;2. Provide the missing builtin kernel ipvs supportI0305 19:51:39.452856 5036 kernel_validator.go:81] Validating kernel versionI0305 19:51:39.452954 5036 kernel_validator.go:96] Validating kernel config[discovery] Trying to connect to API Server “9.186.137.114:6443”[discovery] Created cluster-info discovery client, requesting info from “https://9.186.137.114:6443”[discovery] Requesting info from “https://9.186.137.114:6443” again to validate TLS against the pinned public key[discovery] Cluster info signature and contents are valid and TLS certificate validates against pinned roots, will use API Server “9.186.137.114:6443”[discovery] Successfully established connection with API Server “9.186.137.114:6443”[kubelet] Downloading configuration for the kubelet from the “kubelet-config-1.13” ConfigMap in the kube-system namespace[kubelet] Writing kubelet configuration to file “/var/lib/kubelet/config.yaml”[kubelet] Writing kubelet environment file with flags to file “/var/lib/kubelet/kubeadm-flags.env”[preflight] Activating the kubelet service[tlsbootstrap] Waiting for the kubelet to perform the TLS Bootstrap…[patchnode] Uploading the CRI Socket information “/var/run/dockershim.sock” to the Node API object “k8snode-2” as an annotationThis node has joined the cluster: Certificate signing request was sent to master and a response was received.* The Kubelet was informed of the new secure connection details.Run ‘kubectl get nodes’ on the master to see this node join the cluster.安装Flannel网络:k8smaster:[root@k8smaster ~]# kubectl apply -f kube-flannel.ymlclusterrole.rbac.authorization.k8s.io/flannel createdclusterrolebinding.rbac.authorization.k8s.io/flannel createdserviceaccount/flannel createdconfigmap/kube-flannel-cfg createddaemonset.extensions/kube-flannel-ds-amd64 createddaemonset.extensions/kube-flannel-ds-arm64 createddaemonset.extensions/kube-flannel-ds-arm createddaemonset.extensions/kube-flannel-ds-ppc64le createddaemonset.extensions/kube-flannel-ds-s390x created查看K8S集群状态:k8smaster:[root@k8smaster ~]# kubectl get pods -n kube-systemNAME READY STATUS RESTARTS AGEcoredns-86c58d9df4-kmfct 1/1 Running 0 8m26scoredns-86c58d9df4-qn2k2 1/1 Running 0 8m26setcd-k8smaster 1/1 Running 0 8m35skube-apiserver-k8smaster 1/1 Running 1 8m10skube-controller-manager-k8smaster 1/1 Running 0 7m43skube-flannel-ds-amd64-9rmfz 1/1 Running 0 5m9skube-flannel-ds-amd64-vnwtf 1/1 Running 0 12skube-flannel-ds-amd64-x7q4s 1/1 Running 0 51skube-proxy-7zl9n 1/1 Running 0 7m31skube-proxy-t2sx9 1/1 Running 0 8m27skube-proxy-txsfr 1/1 Running 0 7m27skube-scheduler-k8smaster 1/1 Running 0 8m56s到这里kubeadmin就部署完毕k8s集群了!希望大家可以给我指出问题,我们一起前进!谢谢大家! ...

March 6, 2019 · 8 min · jiezi

V-u ????l-t-r (S<=P<=V) 搭建 (shadow => sockets) (S????S代理)

外面的世界很精彩,之前也很无奈。一片教程教你lu一个稳定的代理,从此妈妈再也不用担心你查不到资料了。教程链接或者教程链接1

March 6, 2019 · 1 min · jiezi

Centos下Mysql乱码

问题出现原因刚刚装完的 mysql 中 sever 的字符编码是latin1 ,所以导入sql后乱码了查询MySQL中字符方法show variables like ‘character_set%’;解决方法将 mysql-server 端的字符编码修改utf-8解决步骤停止 mysql 服务service mysqld stop 在 /etc/my.cnf 中的 mysqld 的最后一行加入character-set-server=utf8重启 mysql 服务service mysqld start 结果截图

March 5, 2019 · 1 min · jiezi

CentOS 7 编译安装 PHP 7

导语使用编译的方式来安装 PHP 7。安装编译工具、依赖包输入 yum -y install libxml2 libxml2-devel openssl openssl-devel curl-devel libjpeg-devel libpng-devel freetype-devel libmcrypt-devel mhash gd gd-devel 进行安装,可以根据自己的实际情况进行调整。下载及解压安装包接着是下载安装包,根据自己的需求进行选择。下载完成后进行解压配置及编译可以使用 ./configure –help 查看都有哪些配置选项,也可以查看下方参考资料中的文章。选择解压后的目录 /usr/local/src/php-7.2.12, 修改几个配置做示例,如下./configure –prefix=/usr/local/php –enable-ftp –enable-zip –enable-fpm –with-pdo-mysql –with-jpeg-dir –with-png-dir –with-gd –with-curl –enable-mbstring –enable-bcmath –enable-sockets接下来是 make && make install一个插曲,错误信息是 virtual memory exhausted: Cannot allocate memory。增加虚拟内存1、dd if=/dev/zero of=/swap bs=1024 count=204800 2、mkswap /swap 3、swapon /swap free查看,swap不再为0 编译完成后可以swapoff /swap解决方法来自这里。创建配置文件创建配置文件,并将其复制到正确位置,分别执行cp php.ini-development /usr/local/php/etc/php.inicp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.confcp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d//www.conf修改 /usr/local/php/ext/php-fpm.conf 中 pid 的内容,pid=/usr/local/php/var/run/php-fpm.pid添加进系统服务之前介绍过添加系统服务和开机启动,这里不做过多介绍。在 /usr/lib/systemd/system 目录中添加 php-fpm.service 文件,内容如下[Unit]Description=The PHP FastCGI Process ManagerAfter=syslog.target network.target[Service]Type=simplePIDFile=/usr/local/php/var/run/php-fpm.pidExecStart=/usr/local/php/sbin/php-fpm –nodaemonize –fpm-config /usr/local/php/etc/php-fpm.confExecReload=/bin/kill -USR2 $MAINPID[Install]WantedBy=multi-user.target添加完成,可以使用 systemctl daemon-reload 更新下,然后输入 systemctl start php-fpm 即可开启服务。最后是添加开机启动,输入 systemctl enable php-fpm 设置开机启动。修改 Nginx 配置最后一步就是修改 Nginx 的配置文件参考资料:Unix 系统下的 Nginx 1.4.x、CentOS 7 编译安装PHP 7.0.2、 PHP编译参数configure配置详解(持续更新中)、Centos 7源码编译安装 php7.2 之生产篇。 ...

March 1, 2019 · 1 min · jiezi

Redhat6.9/Cent6下源码安装samba4手把手实操

由于Redhat6/Cent6操作系统属于骨灰级的操作系统,然而却老当益壮,在各大互联网公司内部仍有不少使用,下面就手把手记录下在rhel6下安装samba4的过程。1 准备samba:samba最新版本(4.9.4)https://download.samba.org/pu…2 安装依赖安装依赖请参考官网说明:https://wiki.samba.org/index…. 虽然安装依赖中列出了很多依赖包,但在rhel6下可能缺少的只有python-devel。对于缺少的依赖包,有两种方式处理: 1)使用操作系统自带的安装包直接安装yun search python-develyun install python-devel.x86_642)使用–disable-/–without-跳过相关特性 例如,根据 ./configure 提示我如果希望支持AD DC、json-audit特性,我需要安装其他依赖包,但是这些依赖包并未随操作系统附带,直接跳过即可。./configure –without-ad-dc –without-json-audit使用以上两种方式,处理其他依赖即可。运行 ./configure 直到出现 “configure finished successfully”,表示成功。 ./configure –help 可以查看 configure 所有参数。3 安装make && make install4 配置1)配置文件 配置文件默认生成位置:/etc/samba/smb.conf 最简单的修改方式是在最后增加以下配置,更多高级特性查看配置文件说明。[xxx]comment = xxx root dirpath = /home/xxxvalid users = mynamebrowseable = yeswritable = yescreate mask = 0777建议将/etc/samba/smb.conf放置到samba默认目录/usr/local/samba/etc/下。2)用户名密码设置执行命令:/usr/local/samba/bin/smbpasswd -a myname 输入密码即可。3)启动samba确认防火墙是否关闭:service iptables stop 启动服务:/usr/local/samba/sbin/smbd -D -s /usr/local/samba/etc/smb.conf /usr/local/samba/sbin/nmbd -D -s /usr/local/samba/etc/smb.conf5 win10访问示例1)映射网络驱动器2)文件夹输入:\ipxxx,点击完成3)弹出密码对话框,用户名输入:myname,密码输入在 smbpasswd 命令时设置的密码即可。

March 1, 2019 · 1 min · jiezi

CentOS 7 将 Nginx 添加系统服务

导语经过编译安装以及解决问题,Nginx 已经运行正常,但是此时 Nginx 并没有添加进系统服务。接下来会将 Nginx 添加进系统服务并且设置开机启动。查看服务首先查看 Nginx 的服务状态,输入 systemctl status nginx,结果如下没有找到相关的服务,下一步就是添加系统服务。添加系统服务在 /usr/lib/systemd/system 目录中添加 nginx.service,根据实际情况进行修改,详细解析可查看下方参考资料中的文章。内容如下[Unit]Description=nginx - high performance web serverDocumentation=http://nginx.org/en/docs/After=network.target remote-fs.target nss-lookup.target [Service]Type=forkingPIDFile=/usr/local/nginx/logs/nginx.pidExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.confExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.confExecReload=/bin/kill -s HUP $MAINPIDExecStop=/bin/kill -s QUIT $MAINPIDPrivateTmp=true [Install]WantedBy=multi-user.target添加完成后再来看下设置开机自动启动首先测试一下,重启然后来查看 Nginx 服务确实没有启动。输入 systemctl start nginx 启动可以使用 systemctl 启动,说明之前添加的 nginx.service 没有问题。然后输入 systemctl enable nginx 设置开机启动最后重启检查下是否设置成功没有问题,到此关于 Nginx 的编译安装完成,接下来是 PHP 的安装。参考资料:CentOS 7 systemd添加自定义系统服务、

February 28, 2019 · 1 min · jiezi

CentOS7网卡配置

查看IP信息安装完CentOS之后,通过 ip addr 命令查看ip信息[root@localhost yum.repos.d]# ip addr1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 08:00:27:39:fe:2b brd ff:ff:ff:ff:ff:ff查看网卡配置进入网卡配置文件目录cd /etc/sysconfig/network-scripts/查看目录文件,如下ifcfg-enp0s3 ifdown ifdown-ippp …可以看出网卡配置文件为 ifcfg-enp0s3,有的电脑里可能为 eth0 或者其他配置动态IP编辑网卡配置文件vi /etc/sysconfig/network-scripts/ifcfg-enp0s3文件内容如下YPE=EthernetPROXY_METHOD=noneBROWSER_ONLY=noBOOTPROTO=dhcpDEFROUTE=yesIPV4_FAILURE_FATAL=noIPV6INIT=yesIPV6_AUTOCONF=yesIPV6_DEFROUTE=yesIPV6_FAILURE_FATAL=noIPV6_ADDR_GEN_MODE=stable-privacyNAME=enp0s3UUID=e7666215-13db-4cc2-bbea-6fd152c7b4a8DEVICE=enp0s3ONBOOT=no将 ONBOOT=no 修改为 ONBOOT=yes…ONBOOT=yes重启网络服务service network restart或者/etc/init.d/network restart网络服务重启成功Restarting network (via systemctl): [ OK ]查看ip信息此时可以看到ip为 192.168.2.107…inet 192.168.2.107/24 brd 192.168.2.255 scope global noprefixroute dynamic enp0s3…配置静态ip以上配置为动态ip,当系统重启后,ip可能会改变,所以需将ip配置为静态。修改配置文件将 BOOTPROTO=dhcp 修改为 BOOTPROTO=static…BOOTPROTO=static…添加静态ip信息IPADDR=192.168.2.110 // 静态ipGETWAY=192.168.2.1 // 网关地址NETMASK=255.255.255.0 // 子网掩码DNS1=192.168.2.1 // DNS地址重启网络服务service network restart ...

February 27, 2019 · 1 min · jiezi

CentOS 7 解决丢失 nginx.pid

导语上一篇文章中,已经将 Nginx 编译安装完成。重启服务器之后,再次开启 Nginx 服务的时候出错了,错误信息如下解决错误出现错误就要解决错误。从上图中可以看出,错误原因是缺少 nginx.pid 这个文件,这个文件中的内容只有一行,记录的是相应进程的 pid,即进程号。解决的方法是输入 ./nginx -c /usr/local/nginx/conf/nginx.conf 重新设置配置文件

February 25, 2019 · 1 min · jiezi

SpringBoot 填坑 | CentOS7.4 环境下,MySQL5.7 表时间字段默认值设置失效

微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题。前言如题,今天这篇是一个刚认识不久的小师弟的投稿。交谈中感觉技术水平与代码素养非常高,关键是才大二呀。那会我应该还在玩泥巴吧,真是后生可畏。问题描述我在本地端( windos 端,数据库版本 MySQL5.7、SpringBoot2.1.3、数据访问框架 JPA)测试代码时 current_timestamp 属性只要设有置默认值,就会自动生成数据的创建时间,与修改数据之后的修改时间。但是在 CentOS 服务器中。调用 JPA 中 save() 方法。字段却不会自动生成了。1、这是其中一张数据库的案例:CREATE TABLE user_info ( id int(32) NOT NULL AUTO_INCREMENT, username varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, password varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, shop_type int(11) NULL DEFAULT NULL COMMENT ‘店铺编号’, salt varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT ‘盐’, status int(64) NOT NULL COMMENT ‘账号状态’, openid varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT ‘微信openid’, create_time timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) COMMENT ‘创建时间’, update_time timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP(0) ON UPDATE CURRENT_TIMESTAMP(0) COMMENT ‘修改时间’, PRIMARY KEY (id) USING BTREE, UNIQUE INDEX upe_seller_info_username(username) USING BTREE);从上面 SQL 示例可以注意到表字段,创建时间和更新时间设置了默认值 CURRENT_TIMESTAMP(0) 。2、这是发送的创建用户请求,里面的逻辑有 save 方法:3、这是在线上服务器报的错误问题排查前面我说了,我已经设置了字段有默认值的。。但是为什么在线上服务器居然没有自动生成。我百思不得其解,在本地端安然无恙,怎么线上环境炸了呢?而且我还在日志中发现一般都是 insert 中会出错误。尝试解决:首先我在 entity 层中删除了createtime,updatetime,果然不报空了。但是在我的 freemarker 上又必须有这个字段怎么办呢?解决问题在你的 createtime,updatetime 上分别加上 @CreatedDate 和 @LastModifiedDate 在 entity 类上加注解 @EntityListeners(AuditingEntityListener.class) 还要在你的启动类加上 @EnableJpaAuditing ,问题迎刃而解。entity类@Data@Entity@DynamicUpdate // 生成动态SQL语句,即在插入和修改数据的时候,语句中只包括要插入或者修改的字段。@EntityListeners(AuditingEntityListener.class)public class UserInfo { @Id @GeneratedValue private Integer id; private String username; private String password; //店铺编号 private Integer shopType; //加盐 private String salt; private Integer status; //卖家微信openid private String openid; //创建时间 @CreatedDate @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”) private Date createTime; //更新时间 @LastModifiedDate @JsonFormat(pattern = “yyyy-MM-dd HH:mm:ss”, timezone = “GMT+8”) private Date updateTime;}启动类@SpringBootApplication@EnableSwagger2@EnableJpaAuditingpublic class ShipApplication { public static void main(String[] args) { SpringApplication.run(ShipApplication.class, args); }}至此,问题解决。注解解释@CreatedDate //表示该字段为创建时间时间字段,在这个实体被insert的时候,会设置值@LastModifiedDate //同理@EntityListeners(AuditingEntityListener.class) // JPA审计@EnableJpaAuditing//开启JPA审计我的思考我个人的理解是当我们添加这些注解后,JPA 的审计功能会把值再重复设置进 createtime,updatetime 这两个字段里面,第一遍是数据库层默认值,第二遍就是代码层设置的。后语如果本文对你哪怕有一丁点帮助,请帮忙点好看。你的好看是我坚持写作的动力。另外,关注之后在发送 1024 可领取免费学习资料。资料内容详情请看这篇旧文:Python、C++、Java、Linux、Go、前端、算法资料分享 ...

February 24, 2019 · 1 min · jiezi

CentOS7更换yum源

YUM下载源定义文件YUM下载源定义文件存储在 /etc/yum.repo.d/ 目录中,而且文件必须以 .repo 为扩展名。开源镜像网易开源镜像站:http://mirrors.163.com/centos的使用帮助:http://mirrors.163.com/.help/…更换下载源1.备份CentOS-Base.repomv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak2.下载对应版本repo文件因为我使用的centos7,所以下载centos7的版本。cd /etc/yum.repos.d/curl -O http://mirrors.163.com/.help/CentOS7-Base-163.repo3.查看yum.repo.d目录[root@localhost yum.repos.d]# ll总用量 36-rw-r–r–. 1 root root 1572 7月 25 22:23 CentOS7-Base-163.repo-rw-r–r–. 1 root root 1572 7月 25 22:23 CentOS-Base.repo-rw-r–r–. 1 root root 1664 4月 29 00:35 CentOS-Base.repo.bak…4.文件改名将新的下载源定义文件改名为 CentOS-Base.repomv CentOS7-Base-163.repo CentOS-Base.repo5.清除缓存yum clean all6.更新本地YUM缓存yum makecache此时,下载源已经更换完成,可以去安装软件了。

February 23, 2019 · 1 min · jiezi

原来实现GCP用客户端登录这么简单啊

充满活力的一天开始了!!!GCP 就是谷歌的一个云服务。进入VM实例列表通过“SSH”点击“在浏览器窗口打开”进入VPS服务器(下图)切换到管理员用户sudo -i编辑sshd_config文件vi /etc/ssh/sshd_config进入命令行模式(:),然后执行将PermitRootLogin no 替换成 PermitRootLogin yes允许用户登录%s/PermitRootLogin no/PermitRootLogin yes/然后再进入命令行模式(:),然后执行将PasswordAuthentication no 替换成 PasswordAuthentication yes允许密码登录%s/PasswordAuthentication no/PasswordAuthentication yes/然后再进入命令行模式(:),然后执行保存文件并退出wq!修改管理员用户密码passwd root#接下来输入您的新密码并确认密码,两遍的密码要一样重启ssh服务systemctl restart sshd接下来就可以去用你自己的ssh客户端,通过管理员用户是否可以进入您的实例服务了赶快是试试吧

February 23, 2019 · 1 min · jiezi

ElasticSearch重要概念及简单用法

接着上一篇ElasticSearch搭建的环境继续学习,从概念开始,本篇文章将介绍ElasticSearch中的一些重要概念及部分原理性概念,以下内容中简称为ES。一、ES部分名词解释1.NRT:英文全称为Near RrealTime。中文意思为近实时,从写入数据到可以被搜索到之间有一个小于1s的延迟,使用ES进行搜索和数据分析可以达到秒级的速度。注:由于ES写入数据到可以被索引到之间有延迟,所以对于业务中包含有保存幂等性需求时,需要注意; 在写完之后手动执行刷新操作,然后再查询,否则会可能出现数据写重的情况。2.cluster:表示由多个节点组成的ES集群(常见集群种类:HA,HB,HP,具体可自行查阅资料)。集群有一个名称,默认是elasticsearch,可以在配置文件中通过cluster.name字段手动指定,集群最小节点数可以为1个。3.node:集群中的节点。节点也有自己的名称,默认是随机分配的,默认情况下,节点启动之后,会自动去寻找名称为cluster.name字段所指定的集群。如果在默认不修改cluster.name的情况下,启动多个节点之后,它们会自动组成一个ES集群。4.document:文档。它是ES中的最小数据单元,通常使用JSON数据结构表示,每个index(索引)的type(类型)中,都可以存储多个Document。5.field:表示字段,具体指的是Document中的某一个数据字段。比如学生信息文档中的学号字段。6.index:索引。是多个有相似结构的文档数据的集合,类似于MySQL数据库中的数据库概念。7.type:类型。表示某个索引下面的某种相同数据结构的结合。在较低版本的ES中,一个索引中可以有多个type,高版本中一个索引下只能有一个类型,官方建议每个索引下最好只有一个type。如果一个index下有多个type,在不同的搜索场景下可能会相互有影响,比如:一个索引下面有一个用于统计分析的type和一个用于搜索的type,如果统计请求比较慢,有可能会阻塞到查询请求。8.shard:每个index会被拆分为多个shard,每个shard就会存放这个index的一部分数据,这此shard会散落在多台服务器上。有了shard就可以进行横向扩展,存储更多数据,让搜索和分析等操作分布到多台服务器上去执行,提升吞吐量和性能。shard又分为replica shard和primary shard,每个shard都是一个lucene index.9.replica:每个服务器随时可能故障或宕机,此时shard就可以会丢失,因此可以为每一个shard创建多个replica副本。replica可以在shard故障时提供备用服务。保证数据不丢失或者丢失很少,多个replica还可以提升搜索操作的吞吐量和性能。注意:primary shard:建立索引时一次设置,不能修改,默认5个;replica shard:可随时修改,默认1个),默认每个索引10个shard,5个primary shard, 5个replica shard,最小的高可用配置,是2台服务器。二、ES的文档数据格式的优点1.可以提供复杂的面向对象的数据结构;2.如果不适用ES,使用传统的关系型数据库,复杂的对象只能拍平,放到多个关联表中,查询的时候需要查询多个表,而且还得重新组合成复杂对象,特别麻烦;3.基于ES面向文档的特性,而且提供了倒排索引,所以可以胜任复杂的查询和检索需求;4.使用传统,流行的文档对象来存储,很容易处理;三、ES集群简单管理1.集群健康状态使用_cat相关api查看,如下:[root@es-master ~]# curl http://localhost:9200/_cat/health?pretty#返回结果1549092107 02:21:47 elasticsearch green 3 3 134 67 0 0 0 0 - 100.0%可以看出,如果集群中的所有节点都正常启动,整个集群的状态为green;2.集群的三种状态(1)红(red):不是所有的primary shard都是active状态的,部分索引有数据丢失了;(2)黄(yellow):每个索引的primary shard都是active状态的,但是部分replica shard不是active状态,处于不可用的状态,此时可以继续使用;(3)绿(green):每个索引的primary shard和replica shard都是active状态的;集群启动时状态变化过程:集群启动的时候,首先会有某些节点先启动,这些节点会被作为主节点,在所有的主节点未完全启动之前,集群此时处于red状态;当主节点全部启动之后,集群状态会变为yellow状态;所有的replica节点都启动完成之后,集群中的所有节点都已经齐全,此时集群变为green状态;3._cat中的重要api查看集群中的节点数[root@es-master ~]# curl http://localhost:9200/_cat/nodes?pretty192.168.199.12 29 95 12 0.00 0.08 0.06 mdi * es-node2192.168.199.11 41 88 25 0.64 0.75 0.57 mdi - es-node1192.168.199.11 20 88 25 0.64 0.75 0.57 mdi - es-node3表示集群中有三个节点,es-node1,es-node2,es-node3;查看集群中的分片数[root@es-master ~]# curl http://localhost:9200/_cat/shards?prettystudent_index 3 p STARTED 1 4.3kb 192.168.199.11 es-node1student_index 3 r STARTED 1 4.3kb 192.168.199.11 es-node3student_index 2 p STARTED 2 8.5kb 192.168.199.12 es-node2student_index 2 r STARTED 2 8.5kb 192.168.199.11 es-node3student_index 1 r STARTED 1 4.4kb 192.168.199.11 es-node1student_index 1 p STARTED 1 4.4kb 192.168.199.12 es-node2student_index 4 p STARTED 1 4.4kb 192.168.199.11 es-node1student_index 4 r STARTED 1 4.4kb 192.168.199.11 es-node3student_index 0 p STARTED 0 261b 192.168.199.12 es-node2student_index 0 r STARTED 0 261b 192.168.199.11 es-node3表示student_index索引默认有10个分片,5个primary和5个replica;查看集群中的索引列表[root@es-master ~]# curl http://localhost:9200/_cat/indices?vhealth status index uuid pri rep docs.count docs.deleted store.size pri.store.sizegreen open .monitoring-es-6-2019.01.27 kXMATwLHShGoGrAhOVPZqg 1 1 39439 432 48.3mb 24.1mbgreen open .monitoring-kibana-6-2019.01.27 PpgWm9PSRXKU385_pQis2g 1 1 1512 0 1mb 531.7kbgreen open .elastichq 19vJX4__TcunPjMCfybmdA 5 1 1 0 14kb 7kbgreen open student_index 8VHSS7wyQIadWBcNWJsGPQ 5 1 5 0 43.9kb 21.9kbgreen open student VXHrKYNcSRKELb7WSzToCw 5 1 2 0 23.8kb 11.9kb默认展示的是系统索引和自己创建的索引,参数v表示查看详细信息;_cat还有其他api,但是不是很常用,如果需要,可以通过如下命令查看即可[root@es-master ~]# curl http://localhost:9200/_cat=^.^=/_cat/allocation/_cat/shards/_cat/nodes/_cat/tasks…四、ES简单操作此处以电商系统商品搜索为例,使用kibana图形化操作界面,介绍ES的简单操作。1.创建用法:PUT /index_name/type_name/id{}例如:创建一个索引名称为shop_index,类型为productInfo,id为1的索引PUT /shop_index/productInfo/1{ “name”: “HuaWei Mate8”, “desc”: “Cheap and easy to use”, “price”: 2500, “producer”: “HuaWei Producer”, “tags”: [ “Cheap”, “Fast” ]}2.查询用法:GET /index_name/type_name/id例如:查询id为1的商品信息GET /shop_index/productInfo/1{ “_index”: “shop_index”, “_type”: “productInfo”, “_id”: “1”, “_version”: 1, “found”: true, “_source”: { “name”: “HuaWei Mate8”, “desc”: “Cheap and easy to use”, “price”: 2500, “producer”: “HuaWei Producer”, “tags”: [ “Cheap”, “Fast” ] }}3.修改方法一:替换,通过ID替换,如果文档存在,则直接覆盖用法:PUT /index_name/type_name/id{}例如:将商品价格修改为2400PUT /shop_index/productInfo/1{ “name”: “HuaWei Mate8”, “desc”: “Cheap and easy to use”, “price”: 2400, “producer”: “HuaWei Producer”, “tags”: [ “Cheap”, “Fast” ]}注意:替换某个文档时,需要带着文档中的所有字段,否则未带着的字段会丢失,切记!!!方法二:通过ID更新部分字段用法:POST /index_name/type_name/id/_update{}例如:将上述商品的价格改为2200POST /shop_index/productInfo/1/_update{ “doc”: { “price”: 2200 }}4.删除用法:DELETE /index_index/type_index/id例如:删除id为1的商品记录:DELETE /shop_index/productInfo/1本篇文章简单介绍了ES的一些重要概念及基本用法,为后续内容做铺垫,下篇文章将继续ES的多种搜索方式!欢迎评论转发! ...

February 22, 2019 · 2 min · jiezi

企业建站选择阿里云服务器配置详细教程

阿里云——阿里巴巴集团旗下公司,是全球领先的云计算及人工智能科技公司。提供云服务器、云数据库、云安全等云计算服务,以及大数据、人工智能服务、精准定制基于场景的行业解决方案。专业快速备案,7x24小时售后支持,助企业无忧上云。目前无论个人站长还是企业,都将阿里云作为了上云的地域选择,那么作为企业用户应该如何选择阿里云服务器呢?购买什么配置的阿里云服务器是适合自己的呢?下面我们就来说说企业如何选择阿里云服务器配置:阿里云服务器的配置选择,和网站或应用的类型、访问量、数据量大小、程序质量等因素有关。第一步:地域选择当前阿里云可供我们国内选择的区域有:华北1(青岛),华北2(北京),华北3(张家口),华北5(呼和浩特),华东1(杭州),华东2(上海),华南1(深圳)。海外地域有:香港,亚太东南1(新加坡),亚太东南2(悉尼),亚太东南3(吉隆坡),亚太东南5(雅加达)等。建议离目标客户越近越好,例如目标客户多为南方客户,那一般选择华东和华南的服务器比较好,如果目标客户为北京,那建议选择华北比较好。当然,如果预算足够,我们还可以考虑购买阿里云CDN网站加速类产品,这样全国性打开速度都会比较快。第二步:实例规格选择目前阿里云可供选择的实例规格有:通用型,计算型,内存型,大数据型,高频型,入门级共享等,这个是很多企业用户最难选的,因为阿里云实例规格众多,很多企业客户看了都不知道怎么选择,其实阿里云已经根据应用场景给我们推荐了对应的型号,只是很多用户没注意到而已:例如我们网站只是一个普通企业网站,性能比较均衡的,那我们就可以选择通用型,通用网络增强型即可。普通网站我们推荐一般选择个2核4G或8G以上配置就足够了。第三步:操作系统这个很简单,我们只需要根据自己网站的程序选择对应的系统即可,例如网站程序是asp,asp.net开发的,那一般选择windows的系统即可,如果是php语言开发的,那一般选择Centos系统,当然,我们也可以选择镜像市场,选择已经配置好的镜像,这样就省去我们装服务器环境的时间。第四步:选择硬盘建议硬盘一定要买一块,价格不贵,如果没有硬盘,那么服务器只有系统盘,如果系统一旦出故障,我们很难找回数据,无论个人还是企业大多数都是将自己网站部署在D盘,而非系统盘,一般企业网站买个50-100G基本上就足够了,重点是硬盘价格不贵,多买点总没坏处。第五步:选择带宽一般网站访问量不是很大的,例如日均最多只有两三百人的,一般选择个3M左右带宽就足够了,这里重点说下,假如我们网站在每天特殊事件段访问量会很高,我们可以选择按量付费,这样我们网站就不会出现因为带宽不足而导致网站访问故障了,另外,有些网站会集中在某几天,或者某几周访问量爆发式增长的情况(一般多为网站做推广或者企业做活动之类的时候),那么后期我们可以给服务器增加临时带宽,这样可以节约我们成本,不过无论是按量付费还是增加临时带宽,一定要记得我们账户要随时有钱。第六步:服务器安全组设置购买阿里云服务器的时候,安全组可以购买的时候直接设置好,也可以购买之后再设置(包括服务器远程链接密码),这里就不细说了,建议参考阿里云官网的安全组设置帮助设置就好了。第七步:配置都选择好了,之后我们只需要点击确认下单购买即可,这样我们购买服务器的操作就都走完了。最后:阿里云还配套了许多其他产品,例如给网站加速的CDN产品,保护网站安全的云盾类产品,用户只需要根据自己的需求和预算选择是否购买即可。另外,在购买阿里云服务的时候,阿里云目前还推出了两个活动是非常适合企业用户的:一是阿里云产品1888元通用代金券,代金券在下单付款的时候可以直接抵扣现金,二是企业用户上云3折起,比平时节省70%的开支,活动详情可以访问尊托云数网站zuntop.com领取优惠券。大家可以用代金券购买或者直接买阿里云针对企业级客户的服务器,节约咱们的上云成本。

February 21, 2019 · 1 min · jiezi

centos6.8安装node

我们这里安装node,直接下载官网已经编译过的源码,解压即可。不自己编译源码,因为自己编译源码需要升级gcc等一系列的软件,编译过程各种报错,太痛苦。下面安装的node版本为v8.4.0,是目前官网的最新版,以后升级了版本原理还是一样的。 1.打开node官网,下载编译过的源码,如下图:下载Linux binaries 的那个选项的。一般系统都是64-bit的。下载方式使用wget https://nodejs.org/dist/v8.4.0/node-v8.4.0-linux-x64.tar.xz2.下载下来的文件发现是xz后缀的文件,centos自身并没有解压xz的软件,所以还要安装一个xz的软件,去这个地址下载:http://download.chinaunix.net…,xz-5.0.3.tar.bz2,同样下载方式也是 wget http://down1.chinaunix.net/distfiles/xz-5.0.3.tar.bz23.然后这个软件需要编译安装,步骤如下:切换到root用户#tar -jvxf xz-5.0.3.tar.bz2 #cd /xz-5.0.3 #解压后的文件夹在/opt下#./configure#make#make install4.安装完了xz解压软件,我们就可以来解压我们最开始下载的node源码了。使用命令 xz -d node-v8.4.0-linux-x64.tar.xz这样我们就得到了node-v8.4.0-linux-x64.tar这个压缩包了。5.我们来解压tar这个压缩包,使用命令tar -xvf node-v8.4.0-linux-x64.tar 这样就得到我们的node-v8.4.0-linux-x64文件夹了6.最后一步,我们配置一下环境变量,这样就可以全局使用node和npm命令了。首先:vim /etc/profile在最下面加入# nodeexport NODE_HOME=/你的node文件夹所在路径/ node-v8.4.0-linux-x64export PATH=$PATH:$NODE_HOME/bin export NODE_PATH=$NODE_HOME/lib/node_modules#使用:wq保存profile文件。#使用下面的命令让配置生效source /etc/profile // 使配置文件生效好了,到此大功告成了,我们来试试 node -v, 看看你的node安装成功没有了。这里总共6步,估计会出问题的一步是3,可能有的同学机器没有安装gcc之类的软件导致编译失败,可以使用命令 yum install gcc gcc-c++ 来安装。每一步我都是亲试的,亲测可用。

February 18, 2019 · 1 min · jiezi

centos6.8 安装php7

大部分网上的教程都让我们下载php的源码,然后编译安装。麻烦且容易出错,我们今天用yum来装php。省心省力。1、执行如下命令安装epelyum -y install epel-release2、更换rpm源,请根据自己的centos版本选择相应的rpm源进行安装,因为系统自带的源下载的php太老,好像是5.1版本的。这里我们执行:rpm -Uvh http://mirror.webtatic.com/yum/el6/latest.rpm3、安装php7yum install php70w4、安装完成,查看版本:php -v

February 18, 2019 · 1 min · jiezi

centos6.8 安装nginx

centos6.8 安装nginx需要编译nginx源码,不过没啥大不了的,按照步骤来,肯定能成功。1.安装必要的依赖:yum install -y gcc-c++yum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel2.下载nginx源码并编译:nginx下载地址可以取官网找。我这是当前的最新版,1.13.wget http://nginx.org/download/nginx-1.13.5.tar.gz tar zxvf nginx-1.13.5.tar.gzcd nginx-1.13.5./configure –prefix=/usr/local/nginx –with-http_ssl_module –with-http_stub_status_module –with-pcremake && make installiptables -F(不然无法远程访问)3.编译完成后,我们去启动nginx通过命令 whereis nginx ,查看nginx的安装目录,可以看到路径是nginx: /usr/local/nginx然后cd /usr/local/nginx/sbin 执行命令 ./nginx这样就把nginx启动起来了。然后在浏览器里直接访问localhost,或者访问你的服务器ip。就可以看到nginx的欢迎页了。关闭nginx,执行命令 ./nginx -s stop重启nginx,执行命令 ./nginx -s reload

February 18, 2019 · 1 min · jiezi

利用闲置 VPS 搜寻外星文明(SETI)

加拿大科学家发现 15 亿光年外快速射电暴 成了最近几天最热门的新闻于是我决定把闲置的 VPS 算力贡献给了加州大学伯克利分校发起的分布式计算项目 SETI@homeSETI@home 项目介绍SETI@home是1999年加州大学伯克利分校发起的分布式计算项目,旨在发动全球计算机的闲置算力,分析阿雷西博射电望远镜搜集的宇宙射线数据,从不同频段识别可能的文明信号,搜寻地外文明。经过近20年的运营,SETI@home是迄今为止全球最成功的分布式计算项目,虽然没能找到地外文明的直接证据,但吸引全球志愿者贡献了巨量的算力,算力超过了任何已知的超算电脑,证明了分布式计算系统的强大。后来伯克利在此基础上开发了 BOINC 伯克利开放式网络计算平台(Berkeley Open Infrastructure for Network Computing),部署了涉及生物医学、气候变化、天体物理、密码破译、数学证明等众多领域的有趣的科研项目,其中还包括了中科院计算技术研究所和高能物理研究所的计算项目。服务器安装 BOINC 客户端seti@home 项目整合到了 BOINC 平台,所以加入 BOINC 平台不仅可以参加这个项目,还有很多有意义的项目(包括一些国内的项目)都可以参与(自行了解)。VPS 信息:OS: CentOS 7 x64 Location: Los AngelesCPU: 1 vCore RAM: 512xshell 连接服务器 (也可以用其他 ssh 连接工具登录)执行安装命令yum install boinc-client安装过程中有需要确认安装的地方都输入 y配置远程管理安装完成后开始配置远程管理,方便我们在电脑本地连接服务器查看项目进度在root目录下新建文件 cc_config.xmlvi /root/cc_config.xml按 i 进入编辑模式,输入内容 ,esc 退出,按: 输入wq 保存文本<cc_config> <options> <ncpus>-1</ncpus> <allow_remote_gui_rpc>1</allow_remote_gui_rpc> </options></cc_config>新建 gui_rpc_auth.cfg 文件,设置远程管理密码vi /root/gui_rpc_auth.cfg设置密码,内容为空则密码为空,保存。123456防火墙端口设置查看 TCP 31416 端口是否开放firewall-cmd –query-port=31416/tcp没有开放要放行这个端口,这是 BOINC 远程通信的端口。firewall-cmd –add-port=31416/tcp –permanent关掉防火墙systemctl stop firewalld测试运行 BIONC 项目boinc执行后会有一堆运行信息。如果显示有“Config: GUI RPC allowed from any host”,那么就应该配置成功了。 ctrl + c 退出以后运行的时候用命令(现在先执行一遍,服务器重启后需要重新执行)boinc –daemon让程序在后台运行本地安装 BOINC 客户端下载页面运行安装程序 一路 Next 下一步 (参考:BOINC:使用教程)然后打开运行 BOINC Manager ,切换到高级视图点击菜单的文件-选择计算机输入 你的服务器 IP ,然后输入刚才设置的密码,等待连接连接成功后,选择你要参加的项目第一次使用需要注册,输入邮箱,设置一个秘密][19]连接成功后自动开始参与计算强烈建议修改计算机参数设置,cpu 占用不要太高,不然有可能被 vps 厂商封号如果电脑有屏保,SETI@home 项目自带的屏保非常炫酷屌炸天哦。参考资料:SETI@home:屏幕保护你也可以选择参加多个项目,或者加入一些团队,或者参加一些中国的项目等等,剩下的更多操作留给你自己探索。..博客:Mr96.me——玖六先生的自留地.文章参考资料:https://equn.com/wiki/SETIhttps://www.equn.com/wiki/BOINC:%E4%BD%BF%E7%94%A8%E6%95%99%E7%A8%8Bhttps://www.equn.com/wiki/SETI@home:%E5%B1%8F%E5%B9%95%E4%BF%9D%E6%8A%A4https://setiathome.berkeley.edu/https://boinc.berkeley.edu/ ...

February 16, 2019 · 1 min · jiezi

CentOS 7 安装 Nginx

导语下面会用 yum 和编译两种方式来安装 Nginx。yum 安装使用 yum 命令,是相对简单的,输入 yum install -y nginx 显示如上界面,既是安装成功。接下来开启 Nginx 服务配置文件在 /etc/nginx/nginx.conf, 代码文件地址在 /usr/share/nginx/html。其他相关的内容可以在配置文件中查看,或者使用 find 命令进行查找。在上一篇文章中介绍了如何开启防火墙,这里就不在重复了,在浏览器中输入 IP 地址就可以看到 Nginx 的界面了到此为止,yum 安装 Nginx 完成。最后 yum remove -y nginx 移除安装,以便下面使用编译安装。编译安装编译安装要比使用 yum 复杂一些,它的好处是可以自选版本、根据需求自定义参数,更加自由。ok,说完了优点,下面开始进行需要先安装编译工具、依赖包,这一步使用 yum 进行即可,重点是编译安装 Nginx。输入 yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel pcre-devel 进行安装,可以根据提示信息进行调整使用 wget 来下载 Nginx 的安装包,根据自己的需求去网站下载合适的包很快就下载完成了,接下来是解压,使用 tar 命令 tar -zxvf nginx-1.14.1.tar.gz然后就是配置并且编译,Nginx 的配置参数可以查看下方参考资料中的文章,也可以使用 ./configure –help 进行查看。以下修改了一些配置配置成功的话,会看到下面的内容输入 make && make install 进行编译安装,成功后显示如下界面。第一次使用 user 账号没有编译成功,切换到 root 后成功启动服务进入到 /usr/local/nginx/sbin 目录下,输入 ./nginx 即可开启服务。尴尬的是没有启动成功,然后重新安装了一次才成功。在浏览器中输入 IP 地址可以看到如下页面参考资料:Nginx、yum 命令、nginx 编译安装详解、 CentOS7.0下编译安装Nginx 1.10.0。 ...

February 16, 2019 · 1 min · jiezi

Linux 搭建 Ftp 服务

使用 RH 系 Linux,Debian 系请酌情参照安装 ftp 所需包安装 ftp 包yum -y install ftp安装 vsftpd 包yum -y install vsftpd注:配置文件路径 /etc/vsftpd/,需要时用 vim 修改即可创建 ftp 用户,并赋权创建普通用户(我这里用户名为 huoher)useradd huoher设置该用户只能使用 ftp 而不能通过 ssh 或其他协议登录进来usermod -s /sbin/nologin huoher由于用户是 ftp 的,不是正常的登录用户,修改其用户主目录(我的是/mnt)usermod -d /mnt huoher设置用户密码passwd huoher可能你是用 root 创建的目录,现在更改所有者chown huoher huoher/#chown 用户名 目录名以及,关闭 sellinux为何关闭的原因不在此详述setenforce 0大功告成可以试试 ftp 服务了我的博客: blog

February 14, 2019 · 1 min · jiezi

Centos7下一键安装LNMP环境脚本

#!/bin/bashread -p ‘The installation process takes about 5 to 10 minutes, depending on the performance of your server. To confirm the installation of the lnmp environment, press the Enter key.‘function red(){ echo -e “\t\033[31m$1\033[0m”}function green(){ echo -e “\t\033[32m$1\033[0m”}yum clean all &> /dev/nullyum -y install epel-release &> /dev/nullwhile :do cat /etc/ld.so.conf | grep lib64 &> /dev/null if [ $? -ne 0 ];then echo ‘’’/usr/local/lib/usr/local/lib64/usr/lib/usr/lib64’’’ >> /etc/ld.so.conf ldconfig -v &> /dev/null fi libzip_stat=rpm -qa |grep libzip &amp;&gt; /dev/null &amp;&amp; echo 'yes' || echo 'no' mariadb_stat=rpm -qa |grep mariadb &amp;&gt; /dev/null &amp;&amp; echo 'yes' || echo 'no' yum_stat=yum repolist |tail -1 |awk '{print $2}' if [ $libzip_stat = yes ];then rpm -e –nodeps rpm -qa | grep libzip continue elif [ $mariadb_stat = yes ];then rpm -e –nodeps rpm -qa | grep mariadb continue elif [ $yum_stat = 0 ];then red ‘Yum error,Check your yum source!!!(maybe network,yum configure…)’ exit else echo -e “\033[05m\033[35mStart testing the environment…\033[0m” echo -e “\t\033[32mStart testing the environment… [ OK ]\033[0m” break fi donefunction need_rpm(){ yum -y install make yum -y install gmake yum -y install gcc yum -y install gcc-c++ yum -y install wget yum -y install openssl yum -y install openssl-devel yum -y install curl yum -y install curl-devel yum -y install libjpeg yum -y install libjpeg-devel yum -y install libpng yum -y install libpng-devel yum -y install freetype yum -y install freetype-devel yum -y install pcre yum -y install pcre-devel yum -y install libxslt yum -y install libxslt-devel yum -y install bzip2 yum -y install bzip2-devel yum -y install libxml2 yum -y install libxml2-devel}function down_app(){ wget -P /lnmp/ https://nginx.org/download/nginx-1.14.2.tar.gz &> /dev/null && echo -e “\t\033[32mNginx Download completed!\033[0m” || echo -e “\t\033[31mNginx Download Faild!\033[0m” wget -P /lnmp/ http://cn2.php.net/get/php-7.3.0.tar.gz/from/this/mirror &> /dev/null && echo -e “\t\033[32mPHP Download completed!\033[0m” || echo -e “\t\033[31mPHP Download Faild!\033[0m” wget -P /lnmp/ https://nih.at/libzip/libzip-1.2.0.tar.gz &> /dev/null && echo -e “\t\033[32mLibzip Download completed!\033[0m” || echo -e “\t\033[31mLibzip Download Faild!\033[0m” wget -P /lnmp/ https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz &> /dev/null && green ‘Mysql Download completed!’ || red ‘Mysql Download Faild!’}function nginx_install_configure(){ id nginx &> /dev/null && userdel nginx useradd -M -s /sbin/nologin nginx &>/dev/null cd /lnmp / && tar -xf nginx-1.14.2.tar.gz && cd nginx-1.14.2/ ./configure –user=nginx –group=nginx –prefix=/usr/local/nginx –with-http_ssl_module –with-stream &>> /tmp/.nginx.configure.log if [ $? -ne 0 ];then red ‘Nginx configure error!!! See /tmp/.nginx.configure.log’ exit else echo ’’’ Configuration summary: nginx path prefix: “/usr/local/nginx” nginx binary file: “/usr/local/nginx/sbin/nginx” nginx modules path: “/usr/local/nginx/modules” nginx configuration prefix: “/usr/local/nginx/conf” nginx configuration file: “/usr/local/nginx/conf/nginx.conf” nginx pid file: “/usr/local/nginx/logs/nginx.pid” nginx error log file: “/usr/local/nginx/logs/error.log” nginx http access log file: “/usr/local/nginx/logs/access.log” nginx http client request body temporary files: “client_body_temp” nginx http proxy temporary files: “proxy_temp” nginx http fastcgi temporary files: “fastcgi_temp” nginx http uwsgi temporary files: “uwsgi_temp” nginx http scgi temporary files: “scgi_temp” ’’’ fi make &>> /tmp/.nginx.make.log if [ $? -ne 0 ];then red ‘Nginx make error!!! See /tmp/.nginx.make.log’ fi make install &>> /tmp/.nginx.makeinstall.log if [ $? -ne 0 ];then red ‘Nginx make install error!!! See /tmp/.nginx.makeinstall.log’ fi cd /usr/local/nginx/ cp -p conf/nginx.conf conf/nginx.conf.bak sed -i ‘65,68s/#//g’ conf/nginx.conf sed -i ‘70,71s/#//g’ conf/nginx.conf sed -i ’s/fastcgi_params/fastcgi.conf/g’ conf/nginx.conf green ‘Nginx installed and configure successful.’ /usr/local/nginx/sbin/nginx -t &> /dev/null && /usr/local/nginx/sbin/nginx netstat -nutlp |grep 80 &> /dev/null if [ $? -ne 0 ];then red ‘Nginx start error!!!’ else green ‘Nginx started.’ fi}function mysql_install_configure(){ id mysql &> /dev/null && userdel mysql useradd -M -s /sbin/nologin mysql &> /dev/null cd /lnmp/ tar -xf mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz mv mysql-5.7.24-linux-glibc2.12-x86_64 /usr/local/mysql cd /usr/local/mysql/ mkdir data && chown -R mysql:mysql /usr/local/mysql/ ./bin/mysqld –user=mysql –basedir=/usr/local/mysql –datadir=/usr/local/mysql/data –initialize &>> /tmp/.mysql.initialize.log if [ $? -ne 0 ];then red ‘Mysql initialize error!!! See /tmp/.mysql.initialize.log’ else pass=tail -1 /tmp/.mysql.initialize.log | awk '{print $NF}' green ‘Mysql initialize successful.)’ green “Initial password: $pass” echo ’’’ Configuration summary: Mysql path prefix: “/usr/local/mysql” Mysql data path: “/usr/local/mysql/data” ’’’ fi ./support-files/mysql.server start &>> /tmp/.mysql.start.log netstat -nutlp | grep mysql &> /dev/null if [ $? -ne 0 ];then red ‘Mysql start error!!! See /tmp/.mysql.start.log’ else green ‘Mysql started.’ fi}function libzip_install_configure(){ cd /lnmp/ tar -xf libzip-1.2.0.tar.gz cd libzip-1.2.0 ./configure &> /dev/null make &> /dev/null make install &> /dev/null cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h green ‘Libzip installed.’}function php_install_configure(){ cd /lnmp/ tar -xf mirror cd php-7.3.0/ while : do ./configure –prefix=/usr/local/php –with-curl –with-freetype-dir –with-gd –with-gettext –with-iconv-dir –with-kerberos –with-libdir=lib64 –with-libxml-dir –with-mysqli –with-openssl –with-pcre-regex –with-pdo-mysql –with-pdo-sqlite –with-pear –with-png-dir –with-jpeg-dir –with-xmlrpc –with-xsl –with-zlib –with-bz2 –with-mhash –enable-fpm –enable-bcmath –enable-libxml –enable-inline-optimization –enable-gd-native-ttf –enable-mbregex –enable-mbstring –enable-opcache –enable-pcntl –enable-shmop –enable-soap –enable-sockets –enable-sysvsem –enable-sysvshm –enable-xml –enable-zip &>> /tmp/.php.configure.log if [ $? -ne 0 ];then red ‘PHP configure error!!! See /tmp/.php.configure.log’ exit else green ‘PHP configure is ok’ while : do make &>> /tmp/.php.make.log if [ $? -ne 0 ];then red ‘PHP make error!!! See /tmp/.php.make.log’ exit else green ‘PHP make is ok’ while : do cp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h make install &>> /tmp/.php.makeinstall.log if [ $? -ne 0 ];then red ‘PHP makeinstall error!!! See /tmp/.php.makeinstall.log’ exit else green ‘PHP Installed.’ break fi done break fi done break fi done cp php.ini-development /usr/local/php/lib/php.ini cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf cp sapi/fpm/php-fpm /usr/local/bin sed -i ’s/; cgi.fix_pathinfo=1/ cgi.fix_pathinfo=0/g’ /usr/local/php/lib/php.ini groupadd www-data &> /dev/null useradd -g www-data www-data &> /dev/null cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf sed -i ’s/user = nobody/user = www-data/g’ /usr/local/php/etc/php-fpm.d/www.conf sed -i ’s/group = nobody/group = www-data/g’ /usr/local/php/etc/php-fpm.d/www.conf /usr/local/bin/php-fpm netstat -nutlp |grep 9000 if [ $? -ne 0 ];then red ‘PHP-FPM start error!!!’ else green ‘PHP-FPM started’ fi}#start executeecho -e “\033[05m\033[35mInstall dependent software…\033[0m"need_rpm &> /dev/nullgreen “Install dependent software…\t\t[ OK ]” echo -e “\033[05m\033[35mStart download apps…\033[0m"down_appecho -e “\033[05m\033[35mStart install nginx and configure it…\033[0m"nginx_install_configureecho -e “\033[05m\033[35mStart install mysql and configure it…\033[0m"mysql_install_configureecho -e “\033[05m\033[35mStart install Libzip and configure it…\033[0m"libzip_install_configureecho -e “\033[05m\033[35mStart install php and configure it…\033[0m"php_install_configure/usr/local/nginx/sbin/nignx -s stop &> /dev/null && /usr/local/nginx/sbin/nginx echo ‘’’<?php phpinfo();?>’’’ >> /usr/local/nginx/html/test.phpcurl http://127.0.0.1/test.phpif [ $? -eq ‘0’];then green ‘LNMP is ok !!!’else red ‘Access PHP Faild!!!‘fi ...

February 13, 2019 · 5 min · jiezi

CentOS 7 防火墙操作

导语今天说下防火墙的操作。CentOS 6 的防火墙是 iptables,CentOS 7 默认的是 firewall,以前的操作不再适用。查看、开启服务器刚刚重启完毕,先来看下防火墙的状态,输入 systemctl status firewalld 进行查看这里是关闭的,然后把它打开,使用 systemctl start firewalld 设置为开机自动启动输入 systemctl is-enabled firewalld,可以查看是否设置为开机启动那下一步就是设置为开机自动启动,systemctl enable firewalld 好的,设置完成后,reboot 重启之后再查看查看、开启端口先来看下 80 端口是否开启 firewall-cmd –query-port=80/tcp简单粗暴的一个 no,那就来开启吧。使用 firewall-cmd –zone=public –permanent –add-port=80/tcp来开启。zone 是作用域;–permanent 是永久生效;不然重启后就失效了;80/tcp 是按照 端口/协议的格式注意,修改之后要更新防火墙,firewall-cmd –reload好了,再来查看一下是否开启这个命令是用来查看所有开启的端口,firewall-cmd –list-ports删除一个端口就用 firewall-cmd –remove-port=80/tcp -permanent,需要注意的是,删除之后仍然是要更新防火墙参考资料:systemctl 命令、centos7 firewalld(防火墙)和systemctl(开机启动服务)相关%E5%92%8Csystemctl(%E5%BC%80%E6%9C%BA%E5%90%AF%E5%8A%A8%E6%9C%8D%E5%8A%A1)%E7%9B%B8%E5%85%B3)。

February 12, 2019 · 1 min · jiezi

CentOS 7 更换 yum 源

导语上次买的服务器是腾讯云的,默认的 yum 源还是很快的。还有一台 vps ,这次用它来操作。yumyum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软体包,无须繁琐地一次次下载、安装。yum 的使用是很方便的,可能出现的问题就是源的下载速度不理想,所以需要更换。它的配置文件在 /etc/yum.conf,源列表在 /etc/yum.repos.d。更换 yum 源备份是个好习惯,所以第一步是备份下载新的 yum 源,以阿里云为例,根据服务器版本自行选择CentOS 7:http://mirrors.aliyun.com/rep…CentOS 6:http://mirrors.aliyun.com/rep…接下来是生成缓存,yum clean all, yum makecache,输入这两个命令参考资料:CentOS yum 源的配置与使用、CentOS 更换 yum 的方法、yum 命令、wget 命令。

February 11, 2019 · 1 min · jiezi

CentOS 6.9 安装最新版本 git

从 github 上下载最新版的 git 源码打开网址:https://github.com/git/git/点击 releases,找到最新稳定版(不要下载带有-rc的,因为它代表了一个候选发布版本)获取到下载链接,比如:https://github.com/git/git/ar…wget 下载最新版$ wget https://github.com/git/git/archive/v2.19.2.tar.gz解压$ tar -zvxf v2.19.2.tar.gz 安装编译工具与依赖包$ yum groupinstall “Development Tools”$ yum install zlib-devel perl-ExtUtils-MakeMaker asciidoc xmlto openssl-devel编译 git 源码$ cd git-2.19.2$ autoconf$ ./configure$ make && make install添加 git 符号链接$ ls /usr/local/bingit gitk git-shell git-upload-packgit-cvsserver git-receive-pack git-upload-archive$ ln -s /usr/local/bin/git /usr/binln: 创建符号链接 “/usr/bin/git”: 文件已存在$ rm /usr/bin/gitln -s /usr/local/bin/git /usr/bin$ git –versionv2.19.2设置 alias 节约生命$ git config –global alias.st status$ git config –global alias.co checkout$ git config –global alias.ci commit$ git config –global alias.br branch$ git config –global alias.pl pull$ git config –global alias.ps push ...

January 28, 2019 · 1 min · jiezi

CentOS 遇到qW3xT.2病毒解决步骤

qW3xT.2是一种挖矿病毒,会占用被感染服务器98%以上CPU资源,要杀掉它需进行如下几步:找到它 ps aux|head -1;ps aux|grep -v PID|sort -rn -k +3|head执行结果一般第一个就是找到它的守护进程并kill掉kill掉第一个进程:kill -9 2122查看/root/.ssh/known_hosts中是否有不认识的IP,有则删除,或者直接删除/root/.ssh文件夹去到/tmp目录,删除.qW3xT.2和ddgs.3013(这个就是病毒守护进程)如果有这个目录:/var/spool/cron,删掉

January 28, 2019 · 1 min · jiezi

Shell脚本(2)

Shell变量数值计算shell中的算术运算符shell中的运算命令算术运算符常用于运算命令,shell中运算命令有以下几种:示例1,(())命令实践双小括号的作用是进行数值运算与数值的比较,常用。[root@moli_linux1 shell_test] echo $((1+1)) #计算1+1后输出2[root@moli_linux1 shell_test] echo $((9-3))6[root@moli_linux1 shell_test] ((i=5))[root@moli_linux1 shell_test] echo $((i+=1)) #获取i值,计算i+1,把i+1重新赋给i,输出i6[root@moli_linux1 shell_test] echo $i6[root@moli_linux1 shell_test] ((a=1+23-4%3))#<==表达式运算后将结果赋值给变量a,先乘除后加减[root@moli_linux1 shell_test] echo $((1+23-4%3))#<==这里直接将运算表达式进行运算并将结果输出,输出要加上$符号8[root@moli_linux1 shell_test] b=$((1+2**3-4%3))#<==这里直接将运算表达式进行运算并将结果输出,输出结果赋值给变量b[root@moli_linux1 shell_test]# echo $b8[root@moli_linux1 shell_test] a=$((100*(100+1)/2))#<==利用公式计算1+2+3….100[root@moli_linux1 shell_test] echo $a5050示例2,用(())命令进行比较[root@moli_linux1 shell_test] echo $((3>6)) #<==3>6是不成立的,因此输出0。表示比较时,1为真,0为假0[root@moli_linux1 shell_test] echo $((3>1))#<==3>1是成立的,因此输出1.1[root@moli_linux1 shell_test] echo $((3==3))#<==3=3是成立的,因此输出11注意:上面提到的数字和变量必须是整型的,不能是浮点型或字符串。下面的bc和awk命令可以用于进行浮点数运算。[root@moli_linux1 ~] echo $((a=1.0+2.5))-bash: a=1.0+2.5: 语法错误: 无效的算术运算符 (错误符号是 “.0+2.5”)[root@moli_linux1 ~]# 示例3,有关++,–的运算[root@moli_linux1 shell_test] a=10[root@moli_linux1 shell_test] echo $((a++))变量a在运算符++之前,输出整个表达式时会输出a的值,再进行表达式的自增10[root@moli_linux1 shell_test] echo $a此时输出a变量的值,是自增后的值,即为1111[root@moli_linux1 shell_test] echo $((a–))11[root@moli_linux1 shell_test] echo $a10[root@moli_linux1 shell_test] echo $((++a))变量a在运算符++之后,输出整个表达式时会先输出整个表达式自增的值,即1111[root@moli_linux1 shell_test] echo $a11[root@moli_linux1 shell_test] echo $((–a))10[root@moli_linux1 shell_test] echo $a10变量在++.–运算符之前,输出表达式的值为变量自身,再进行表达式的自增或自减;变量在++.–运算符之后,会先进行表达式的自增或自减,再输出表达式的值。let运算命令let运算命令的语法格式为:let 赋值表达式let赋值表达式相当于”((赋值表达式))“[root@moli_linux1 shell_test] i=5[root@moli_linux1 shell_test] let i=i+1[root@moli_linux1 shell_test] echo $i6expr运算命令语法:expr 表达式[root@moli_linux1 shell_test] expr 2 + 24[root@moli_linux1 shell_test] expr 2 - 20[root@moli_linux1 shell_test] expr 2 * 2expr: 语法错误[root@moli_linux1 shell_test] expr 2 * 24[root@moli_linux1 shell_test] expr 2 / 21注意:使用expr时:运算符及用于计算的数字左右至少有一个空格,否则会报错使用乘号时,必须使用反斜线屏蔽其特定含义,因为shell可能会误解星号的含义expr在Shell中可配合变量进行计算,但需要用反引号将计算表达式括起来[root@moli_linux1 shell_test] i=5[root@moli_linux1 shell_test] i=expr $i + 6此处反引号括起来的表达式,变量和数字符号两边都要有空格[root@moli_linux1 shell_test] echo $i11Shell脚本中常见的需求判断一个未知的变量是不是整数原理: 利用expr做计算时变量或字符串必须是整数的规则,把一个变量和一个整数(非零)相加。看命令的返回值是否为0。如果为0,就认为与整数相加的变量是整数,如果不是0,就不是整数[root@moli_linux1 shell_test] i=5#此时的i是整数,数字5[root@moli_linux1 shell_test] expr $i + 6 &>/dev/null #把i与一个整数相加,&>/dev/null 表示不保留任何输出[root@moli_linux1 shell_test] echo $?0#返回0说明i是整数[root@moli_linux1 shell_test] i=moli[root@moli_linux1 shell_test] expr $i + 6 &>/dev/null [root@moli_linux1 shell_test] echo $?2#返回1说明i不是是整数判断传参是不是整数[root@moli_linux1 shell_test] cat t3.sh #!/bin/bashexpr $1 + 1 >/dev/null 2>&1[ $? -eq 0 ] &&echo int||echo chars#这是一个条件表达式语法,返回值为0则输出int,否则输出chars[root@moli_linux1 shell_test] sh t3.sh 1int[root@moli_linux1 shell_test] sh t3.sh achars编写shell脚本,查找一段语句中字符数小于6的单词思路,需要知道字符串长度的计算方法,利用for循环。字符串长度可以利用expr命令得出,如几种计算字符串的方法[root@moli_linux1 ~] char=“i am a student”[root@moli_linux1 ~] expr length “$char"14[root@moli_linux1 ~] echo ${#char}14[root@moli_linux1 ~] echo ${char} | wc -L14[root@moli_linux1 ~] echo ${char} | awk ‘{print length($0)}‘14知道怎么计算字符串长度的方法,就可以利用计算出来的长度和整数做比较就可以得出结果了,例如判断下面这条语句。(有关for循环,if判断稍后再讲)i am oldboy linux welcome to our training[root@moli_linux1 shell_test] cat wordLength.sh #!/bin/bashfor n in i am oldboy welcome to our trainingdo if [ expr length $n -le 6 ] then echo $n fidone[root@moli_linux1 shell_test] sh wordLength.sh iamoldboytoour基于Shell变量输出read命令的运算实践Shell变量除了可以直接赋值或脚本传参外,还可以使用read命令从标准输入中获得。语法格式:read [参数] [变量名]常用参数:-p prompt : 设置提示信息-t timeout:设置输入等待的时间,单位默认为秒实现read命令的基本读入功能[root@moli_linux1 ~] read -t 10 -p “Please input a num:” num #作为接受read的变量,不该带$符号#读入一个输入,赋值给num变量,注意,num变量前需要有空格Please input a num:10 #输入10,把数字10赋值给num变量[root@moli_linux1 ~] echo $num10[root@moli_linux1 ~] read -t 10 -p “Please input two num:” a1 a2#读入两个输入,注意要以空格隔开,分别赋值给a1 a2变量,a1变量前后都要有空格Please input two num:10 20[root@moli_linux1 ~] echo $a1 $a210 20[root@moli_linux1 ~] read a3 a430 40[root@moli_linux1 ~] echo $a330[root@moli_linux1 ~] echo $a440read命令小实践[root@moli_linux1 shell_test] cat t2_read_change.sh#!/bin/bash#no.1read -t 10 -p “Pleasa input two int number:” a b#通过read命令读入两个值,赋给变量a和变量b[ ${#a} -le 0 ]&&{#利用条件表达式,根据变量值的长度是否小于1,来确定第一个数是否为空 echo “The first number is null.” exit 1}[ ${#b} -le 0 ]&&{#利用条件表达式,根据变量值的长度是否小于1,来确定第二个数是否为空 echo “The second number is null.” exit 2}#no.2 判断传参是否是整数expr $a + 1 &>/dev/nullRETVAL_A=$? expr $b + 1 &>/dev/nullRETVAL_B=$?#如果A和B中有一个不是整数,那么就打印提示并退出。if [ $RETVAL_A -ne 0 -o $RETVAL_B -ne 0 ];then echo “one of the num is not num,please input again.” exit 3fi#no.3echo “a+b=$(($a+$b))“echo “a-b=$(($a-$b))“echo “ab=$(($a$b))“echo “a/b=$(($a/$b))” ...

January 27, 2019 · 2 min · jiezi

Shell脚本(1)

将自己之前的shell脚本笔记搬到segmentfault,顺带复习一下shell基础。2019-1-26shell脚本介绍Shell介绍Shell是一个命令解释器,作用是解释执行用户输入的命令程序等,用户每输入一条命令,Shell就执行解释一条。这种从键盘输入命令就可以得到回应的方式叫做交互的方式。Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,并处理各种操作系统的输出结果,然后输出到屏幕给用户。Shell脚本当命令或程序语句不在命令行下执行,而是通过一个程序文件来执行,这个文件就叫做Shell脚本。Shell脚本很适合用于处理纯文本类型的数据,而Linux系统中几乎所有的配置文件,日志文件(NFS,Rsync,Httpd,Nginx,LVS 等),以及绝大多数的启动文件都是纯文本类型的文件。因此,学好shell语言,就可以利用它在linux系统中发挥巨大的作业。查看CentOS系统默认的Shell[root@moli_linux1 ~]# echo $SHELL/bin/bash[root@moli_linux1 ~]# grep root /etc/passwdroot❌0:0:root:/root:/bin/bashShell脚本的创建和执行Shell脚本的创建一个规范的Shell脚本在第一行会指出由那个程序(解释器)来执行脚本的内容,这一行内容在Linux bash编程中一般为:#!/bin/bash或者#!/bin/sh 注意:这一行必须位于每个脚本顶端的第一行,如果不是第一行则为脚本注释行。且shell脚本文件的后缀名通常以.sh结尾。Shell脚本的执行1. bash script-name(脚本的路径名字)或者sh script-name:这是当脚本文件没有可执行权限时常用的放法 2. path/script-name 或者./script-name:指在当前路径下执行脚本(脚本需要有可执行权限)。即需要将脚本文件的权限先修改为可执行,chmod +xscript-name 。然后通过脚本的绝对路径和相对路径就可以直接执行脚本。shell脚本中的变量什么是变量变量是暂时存储数据的地方及数据标记,所存储的数据存在于内存空间中,通过正确地调用内存空间中变量的名字就可以取出与变量对应的数据。CentOS中变量的定义直接由一个赋值符号=就可以创建一个变量,而echo命令类似于其他语言的print命令,打印这个变量的值。[root@moli_linux1 ~] name=“laowan” #定义一个变量[root@moli_linux1 ~] echo $name #打印这个变量的值laowan[root@moli_linux1 ~] age=14[root@moli_linux1 ~] echo $age14shell变量的特性默认情况下,在bash shell 中是不会区分变量类型的。变量类型变量分为:环境变量(全局变量)和普通变量(局部变量)环境变量可以在创建它们的shell以及其派生出来的任意子进程shell中使用。环境变量又分为自定义环境变量和bash内置的环境变量。普通变量只能在创建它们的shell函数或shell脚本中使用。提示:有三个命令可以查看系统中变量的值:set、env、declare。set命令输出所有的变量;env只显示全局变量;declare命令输出所有的变量,函数,整数和已经导出的变量。set -o命令显示bash shell的所有参数配置信息。环境变量的定义上面定义一个变量是在一个shell中直接使用赋值符号对这个变量进行创建,但是当打开一个新的子shell,打印这个变量却不能打印出来。这是因为我们创建的变量是一个普通变量,若想在其他子shell中使用这个变量,需要将这个变量设置为全局变量。而定义一个全局变量的方法如下:export 变量名=value或者declare -x 变量名=value第二个方法是将变量名添加到环境变量文件/etc/profile编辑环境配置文件vim /etc/profile在文件最后面添加export name=“laowan"保存,退出。重新加载文件source /etc/profile打印变量的值echo $namelaowan而CentOS中,全局环境变量的配置文件有三个,分别是:/etc.profile/etc/bashrc/etc/profile.d #这是一个目录当用户登录Linux系统时,首先会先加载/etc/profile全局环境变量文件,这是Linux系统默认的Shell主配置文件,其次会执行/etc/profile.d下的脚本文件,要做重启Linux系统后初始化或者显示某些内容,只需要把脚本文件放在/etc/progile.d下即可,最后才会执行bashrc文件。设置登录提示符Linux中可以设置登录之后,或者远程连接服务器打开的shell中显示登录提示符。设置登录提示内容的文件是/etc/motd,编辑这个文件就可以设置每次登录提示的内容。例如:[root@moli_linux1 ~]# cat /etc/motdwelcome to my Linux Server!打开一个新的shellConnecting to 192.168.30.3:22…Connection established.To escape to local shell, press ‘Ctrl+Alt+]’.WARNING! The remote SSH server rejected X11 forwarding request.Last login: Sat Jan 26 19:35:54 2019 from 192.168.30.1welcome to my Linux Server!可以看到登录提示符。定义变量不加单引号和双引号,加单引号,加双引号的区别[root@moli_linux1 ~] a=10[root@moli_linux1 ~] b=10-$a[root@moli_linux1 ~] c=‘100-$a’[root@moli_linux1 ~] d=“100-$a”[root@moli_linux1 ~] echo $a10[root@moli_linux1 ~] echo $b10-10[root@moli_linux1 ~] echo $c100-$a[root@moli_linux1 ~] echo $d100-10第一种定义b变量的方式,当内容为简单连续的数字,字符串,路径名时,可以这样用,不加引号时,值里有变量的会被解析后输出。第二种定义c的变量有加单引号,这样输出变量时单引号里面内容是什么就是什么,即使有变量和命令也是直接输出。第三种定义d变量的方式加了双引号,这种输出变量内容时引号里的变量以及命令会经过解析后再输出内容,这种方式比较适合字符串中附带有变量以及命令且想将其解析后再输出的变量定义。取消变量取消变量使用unset命令,注意要取消的变量之前不用添加$符号。[root@moli_linux1 ~] a=100[root@moli_linux1 ~] echo $a100[root@moli_linux1 ~] unset a[root@moli_linux1 ~] echo $a #可以看到这个变量的为空 [root@moli_linux1 ~]# 将一个命令的结果赋值给一个新的变量生产环境中把命令的结果作为变量的内容进行赋值的方法在脚本开发时很常见。有两个方法可以实现。变量名=$(命令)或者:变量名=命令[root@moli_linux1 ~] ls192.168.229 anaconda-ks.cfg git_data server shell-100 test-find[root@moli_linux1 ~] file=$(ls)[root@moli_linux1 ~] echo $file192.168.229 anaconda-ks.cfg git_data server shell-100 test-find[root@moli_linux1 ~] file2=ls[root@moli_linux1 ] echo $file2192.168.229 anaconda-ks.cfg git_data server shell-100 test-findShell中的特殊变量shell中特殊位置参数变量要从命令行,函数或脚本执行等处传递参数时,就要在shell脚本中使用位置参数变量。$0 :获取当前执行的shell脚本的文件名,如果执行脚本包含了路径,那么就包括脚本路径$1:获得当前执行的shell脚本的第n个参数值,n=1…….9,当n为0时表示脚本的文件名,当n大于9时,则用大括号括起来,例如$(10),接的参数以空格隔开$# : 获取当前执行的shell脚本后面接的参数的总个数$* :获取当前Shell脚本所有传参的参数,不加引号和$@相同,如果给$加上双引号,例如“$”,则表示将所有的参数视为单个字符串,相当于“$1$2$3”#@ :获取当前shell脚本所有传参的参数,不加引号和$*相同;如果给$@加上双引号,例如:“$@”,则表示将所有的参数视为不同独立的字符串,相当于“$1”,"$2"."$3”….这是将多参数传递给其他程序的最佳方式。示例1,特殊位置变量$1[root@moli_linux1 script] cat test.sh #!/bin/bashecho $1 #脚本的功能是打印脚本传递的第一个参数的值[root@moli_linux1 script] sh test.sh laowan #传入一个字符串参数,赋值给$1laowan[root@moli_linux1 script] sh test.sh laowan xiaoming #传入多个参数,但脚本不会接收多个参数,因此只输出第一个参数的值laowan[root@moli_linux1 script] sh test.sh “I am laowan” #用双引号括起来代表一个参数I am laowan示例2,特殊位置变量$1,$2,$3….${10}[root@moli_linux1 script] echo ${1..15} > test2.sh[root@moli_linux1 script] cat test2.sh #!/bin/bashecho $1 $2 $3 $4 $5 $6 $7 $8 $9 $10 $11 $12 $13 $14 $15[root@moli_linux1 script] sh test2.sh {a..z} #传入26个字母az,作为26个参数a b c d e f g h i a0 a1 a2 a3 a4 a5 #位置参数的数字大于9后,输出内容就不对了[root@moli_linux1 script] vim test2.sh [root@moli_linux1 script] cat test2.sh #!/bin/bash#位置参数的数字大于9时,需要用大括号将数字括起来echo $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10} ${11} ${12} ${13} ${14} ${15}[root@moli_linux1 script] sh test2.sh {a..z} a b c d e f g h i j k l m n o #大于9的数字加上大括号后显示正确的内容示例3,特殊变量$0–获取脚本的名称以及路径:[root@moli_linux1 shell_test] cat 05-getName.sh #!/bin/bashecho $0[root@moli_linux1 shell_test] sh 05-getName.sh 05-getName.sh ...

January 26, 2019 · 2 min · jiezi

解决Mac下SSH闲时自动中断的问题

使用 Mac 自带终端 SSH 连接服务器时,只要隔一小段时间不进行操作的话连接就会自动中断,造成了不好的体验。解决方法如下:1、连接到你的服务器2、编辑服务端配置文件 /etc/ssh/sshd_configvim /etc/ssh/sshd_config添加以下两行配置代码ClientAliveInterval 30ClientAliveCountMax 33、编辑客户端配置文件 /etc/ssh/ssh_configvim /etc/ssh/ssh_config在 Host * 下面添加以下两行配置代码ServerAliveInterval 30ServerAliveCountMax 34、断开SSH连接Ctrl + d5、SSH 重连服务然后执行重启sync 将数据由内存同步到硬盘中。reboot 就是重启重启后可能需要等待1分钟左右才能重新连接上。最后验证测试就可以了。

January 23, 2019 · 1 min · jiezi

服务器从安装到部署全过程(二)

OK! 上一篇文章中大概尝试安装mysql、nginx、nodeJs、pm2 的一些过程以及在配置中出现的问题还有一些解决方式,那么在本次过程尝试中,将进一步进行服务器的基础配置,以及前端应用 node、pm2 部署nginx经过上次 nginx 已经安装至服务器中了,在这里面主要介绍一下部署相关所需要的配置,例如:监听端口、服务转发、静态资源、ssl 证书(https) 的配置静态资源在我们没有后端服务的时候,只是想要写一些demo或者静态页面时,就可以使用nginx作为静态资源服务器,可以被外网访问到,以下就是 具体的配置了,可以在nginx.conf 中建立二级域名,来搭建。http { server { listen 80; # 监听的端口号 server_name static.scrscript.com # 转发的名称 也就是二级域名 不过二级域名虽然不需要重新备案但是 域名解析要有 static 关键字 location / { root /cloud/static } }}说明: 监听的 80 端口 然后 转发名称为 server_name 所对应的静态路径为 /cloud/static/ 其实就是 location root + localtioon name 这样就nginx就可以读取到 /cloud/static/ 目录下的文件了,server_name 设置二级域名时前缀后面最好跟的是自己的域名 自定义前缀+自己的域名,而域名解析最好要加上得以匹配其他二级域名来访问服务器静态的资源的转发 其实有两种写法:location / { root /cloud/static # 这种写法 主要是 location root + location name # alias /cloud/static # 这种写法就睡 就是直接location alias 的路径信息了}检验一下服务转发当我们有后端服务时, 我们那么我们可以通过nginx的转发配置,来让我们的网站可以被访问到http { # 使用upstream(上游)模块 # server 监听的端口 # weight 权重 # max_fails 最大允许失败数 # fail_timeout max_fails次失败后,暂停时间 upstream blog { #ip_hash; server localhost:9931 weight=2 max_fails=2 fail_timeout=3s; } server { listen 80 default; server_name _; location / { proxy_pass: http://blog; } }}说明:在请求的过程中 如果请求的地址 与 server_name 匹配上那么就会采用这个配置 如果都不匹配 那么就会先行查看 listen 监听的域名 后有default 配置项的,注意 default 只能写一个。转发说明:upstream 中的 server 监听的是服务器中启动的端口当请求匹配上 server server_name 时 就会 进行匹配 location在匹配成功 location 中的反向代理proxy_pass 为 http:// + upstream 时就会代理到 upstream 中的 server 监听的端口检验一下nginx 配置SSL(https)平常我们部署的时候,会发现浏览器的地址栏会有(http://) 然后会有不安全的字样, 哼~!作为强迫症可是不想有这种字样,那么我们就来配置https 安全吧首先要先去购买 ssl 证书当然还是要买免费的啦,个人需求,嘿嘿~当购买完成以后,需要一定时间来等待证书签发,如果签发完成了以后,就来下载证书信息因为我们转发是使用 nginx 来写的 所以应该使用 nginx 版本证书类型,下载完成后,需要把这些证书放在服务器中,当然证书的位置还是要放在 nginx.conf 所在的文件夹中然后我们就开始 修改 nginx.conf 文件吧http { # 使用upstream(上游)模块 # server 监听的端口 # weight 权重 # max_fails 最大允许失败数 # fail_timeout max_fails次失败后,暂停时间 upstream blog { #ip_hash; server localhost:9931 weight=2 max_fails=2 fail_timeout=3s; } server { listen 443 ssl; # 一定要开启 443 服务器端口 server_name xxx.com; # 需要ssl的域名 ssl on; # root /cloud/node/; # index index.html index.htm; ssl_certificate cert/a.pem; # ssl 证书在服务器中相对于 nginx.conf 的路径 ssl_certificate_key cert/a.key; # ssl 证书在服务器中相对于 nginx.conf 的路径 ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { proxy_pass http://blog; } } server { listen 80 default; server_name _; rewrite ^(.)$ https://$host$1 permanent; # 重定向到 https location / { proxy_pass: http://blog; } }}注意一定要 重启 nginx nginx -s reload哈哈哈哈 小锁 还有 https前端部署在这里 着重来说一下 vue 项目的部署过程,还有 html 文件怎么在浏览器中访问到html 静态资源访问其实在上面 nginx 中,我们配置了 nginx 静态资源服务器,其实静态资源的部署 非常简单 就是直接把 html 文件 放在静态资源所配置的目录就可以了, 这样我们平时写的项目 或者 demo 都可放在这个目录下,来实现浏览vue 单页应用部署blog 的 后端是使用的是 node-express 脚手架,在 express 脚手架中 express.static 定义的是 静态资源所在的位置,我们可以直接放在 项目的根目录下 然后启动项目 就可以直接访问到了。 静态资源访问路径: app.use(’’ ,express.static(path.join(__dirname, ‘dist’))); 请看我的项目结构 上传至 服务器 后 我们可以用 pm2 来启动 达到负载均衡, 守护进程的效果 pm2 start xxx检验一下vue nuxt 部署nuxt 是 vue 的 服务端渲染,有利于 seo 的服务端渲染应用框架,作为前台应用 当然是想要自己写的文章 能让更多人搜索到,nuxt 当然是我的不二之选,哈哈哈哈,OK 我们来说下 nuxt 如何来部署吧首先 我们应该先给 nuxt 应用执行打包命令 npm run build 打包完成后,我们可以把有用的文件事先剔除出来 下面请看我的文件目录 先上传至服务器然后 npm install or cnpm i然后进入到相应的 应用文件目录 执行 pm2 start npm –name “进程名称” – run start部署完毕 blog nuxt链接配置nginx静态服务器nginx server 匹配顺序nuxt 部署参考结语基础的配置 基本上已经走完一遍了,其实如果是 部署频率低的情况下 那么这样一遍遍部署 其实是费不了多大事,但是呢,在初期的时候总有不少东西要改,那这样一遍遍部署 不仅繁琐 而且还浪费我们 宝贵的时间那么,下次我将配置 docker and jenkins 自动化部署,省时又省力~,哈哈哈 ...

January 20, 2019 · 2 min · jiezi

tomcat设置默认路径致使项目url冲突解决方法

前言tomcat作为java容器非常出色,但是依然会有一些避之不及的小坑,在此记录一笔.START问题部署多个项目后url路径冲突情景描述1.webapps下有两个项目 projectA,projectB.两个项目除开管理信息接口,其余都有安全验证机制.2.projectA由于未做前后端分离,因此静态资源也存在java项目中.在做静态资源中的接口请求时未写包名,比如登录,js代码会拼接服务器ip+端口+当前设置的url(/login),而未在/login前加上/projectA,所以在本机上测试没有问题,只有当部署的时候才会存在这样的问题.这也是个问题,下面解决.3.projectB是运行正常的项目对于情景2解决办法打开tomcat中的配置文件,在<Host>标签里添加上<Context>设置为服务器的默认访问路劲,如此便避开了包名,但此方法极不正规,不推荐使用.<Host name=“localhost” appBase=“webapps” unpackWARs=“true” autoDeploy=“true”> <!– SingleSignOn valve, share authentication between web applications Documentation at: /docs/config/valve.html –> <!– <Valve className=“org.apache.catalina.authenticator.SingleSignOn” /> –> <!– Access log processes all example. Documentation at: /docs/config/valve.html Note: The pattern used is equivalent to using pattern=“common” –> <Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs” prefix=“localhost_access_log” suffix=".txt" pattern="%h %l %u %t &quot;%r&quot; %s %b" /> <Context path="" docBase="/usr/tomcat8.6/webapps/sc_edu" debug=“0” reloadable=“true”/> </Host>代码解释<Context path="" docBase="/usr/tomcat8.6/webapps/sc_edu" debug=“0” reloadable=“true”/>path和doBase一起表示指定包路径,为了简便可以直接卸载docBase中.重启tomcat,测试直接ip+port能访问到该包中的资源,然而当访问其它包中资源时,会出现url歧义.本来是想访问projectB,然而映射到projectA项目下.只是部分url会出现这样的问题.然后我们的解决方法是再装一个tomcat,只部署需要直接路径映射的项目如此便回到tomcat所在目录,cp命令拷贝$> cp -r tomcat8.5/ tomcat8.6/然后移动tomcat8.5中的projectA到tomcat8.6中.删除tomcat8.5中的<Context path="" docBase="/usr/tomcat8.6/webapps/sc_edu" debug=“0” reloadable=“true”/>在tomcat8.6中需要对service.xml做如下改动.改动 shutdown对应的port为8006,只要与tomcat8.5不同且端口不冲突就行.<Server port=“8006” shutdown=“SHUTDOWN”>改动 请求对应的端口,原则同上<Connector port=“8081” protocol=“HTTP/1.1” connectionTimeout=“20000” redirectPort=“8443” /><Host>标签中的内容复制过来的,需要修改成对应的映射路径.如此两个tomcat才能同时运行,启动与关闭互不影响.END ...

January 20, 2019 · 1 min · jiezi

linux 后台运行程序

前言一般为了程序后台运行,我们需要使用nohup命令.此时需要对程序运行时所产生的输出信息记录,因此就需要使用linux的信息输出命令START一个例子比如要让redis-server程序后台运行1.非后台运行:$> ./redis-server2.后台运行:$> nohup ./redis-server 1>/dev/null 2>1 &其中数字1代表标准输出,2代表错误信息输出,还有未使用的标准输入即数字0.1>/dev/null 2>1 &的意思是标准信息输出到空设备即不做任何处理,也不做任何显示,/dev/null也可以替换为文本文件名(如 out.log),此时标准信息就会输出到指定文件.2>1表示错误信息输出到标准输出,即输出同1>后面的位置,当然也可以直接指定新文件名(如 err.log).& 表示程序后台运行上面的命令还可简写:nohup ./redis-server >/dev/null 2>1 &即去掉标准输出数字1END记录后台运行一个程序1.先用 netstat -tln 查看端口信息2.isof -i:端口 可以找到程序进程号PID3.kill PID 可以关闭程序

January 20, 2019 · 1 min · jiezi

从0开始使用sinopia搭建私有npm仓库

因为业务安全需要等种种原因,不能够把插件都发布到公共的npm仓库,所以需要搭建自己的私有npm仓库,最近自己搭建了一个简单的npm仓库,踩了些坑,和大家分享一下,希望能够帮到有需要的童鞋本次讲述用sinopia从0开始搭建npm仓库,讲得会比较细,觉得啰嗦的童鞋可以只看自己需要的哈([原文链接[1])服务器端安装nodejs和npm因为我的linux服务器是centos的,所以我这边讲的是一种在centos上安装node 环境1.安装wgetyum install -y wget2.下载最新的node包可以在nodejs的官网找到最新的下载地址(找到需要的,右键复制链接地址就可以拿到最新的地址啦)wget https://nodejs.org/en/download/node-v10.15.0-linux-x64.tar.xz解压安装包xz -d node-v10.15.0-linux-x64.tar.xztar -xf node-v10.15.0-linux-x64.tar.xz部署bin文件重点是要找到你的nodejs的文件路径(你将node文件解压到哪里就是哪里。),找不到node路径的童鞋请执行whereis node然后执行ln -s node路径 /usr/bin/nodeln -s node路径 /usr/bin/npmeg://我的node解压路径为/opt/node-v10.15.0-linux-x64/bin/nodeln -s /opt/node-v10.15.0-linux-x64/bin/node /usr/bin/nodeln -s /opt/node-v10.15.0-linux-x64/bin/node /usr/bin/npm如果出现ln: failed to create symbolic link ‘/usr/bin/node’: File exists执行:rm /usr/bin/node查看是否安装成功node -vnpm -v搭建npm仓库sinopia安装装好node以后,我们就可以在服务器直接安装sinopia了,一行命令全局安装npm install -g sinopia 安装好了可以启动试一下sinopia出现下面的结果说明成功跑起来了,这个时候可以打开http://localhost:4873/访问了Sinopia doesn’t need superuser privileges. Don’t run it under root. warn — config file - /root/.config/sinopia/config.yaml warn — http address - http://localhost:4873/如果报sinopia: command not found,请添加关联,找到你的sinopia路径(这个路径在之前node路径的子目录里面)ln -s /opt/node-v10.15.0-linux-x64/bin/sinopia /usr/binpm2node服务非常脆弱,一般在实际中使用都会配合守护进程。这里我用的是 pm2 做守护进程安装npm install -g pm2pm2 -v如果出现 pm2: command not found,和sinopia的方法一样ln -s /opt/node-v10.15.0-linux-x64/bin/pm2 /usr/bin通过 PM2 启动 sinopia:pm2 start which sinopia结果类似如下:┌─────────┬────┬──────┬────────┬────────┬─────┬────────┬───────────┐│ Name │ id │ mode │ status │ ↺ │ cpu │ memory │├─────────┼────┼──────┼────────┼────────┼─────┼────────┼───────────┤│ sinopia │ 0 │ N/A │ fork │ online │ 0 │ 0% │ 16.7 MB │└─────────┴────┴──────┴────────┴────────┴─────┴────────┴───────────┘sinopia配置修改默认情况下,sinopia 的配置是不适合直接使用的,所以我们需要对它的配置文件按需酌情修改我们找到上面提到的配置文件目录,打开配置文件进行编辑## This is the default config file. It allows all users to do anything,# so don’t use it on production systems.## Look here for more config file examples:# https://github.com/rlidwka/sinopia/tree/master/conf## path to a directory with all packagesstorage: ./storage #npm包存放的路径auth: htpasswd: file: ./htpasswd #保存用户的账号密码等信息 # Maximum amount of users allowed to register, defaults to “+inf”. # You can set this to -1 to disable registration. max_users: -1 #默认为1000,改为-1,禁止注册# a list of other known repositories we can talk touplinks: npmjs: url: http://registry.npm.taobao.org/ #默认为npm的官网,由于国情,修改 url 让sinopia使用 淘宝的npm镜像地址 packages: #配置权限管理 ‘@/’: # scoped packages access: $all #表示哪一类用户可以对匹配的项目进行安装 【$all 表示所有人都可以执行对应的操作,$authenticated 表示只有通过验证的人可以执行对应操作,$anonymous 表示只有匿名者可以进行对应操作(通常无用)】 publish: $authenticated #表示哪一类用户可以对匹配的项目进行发布 ‘*’: # allow all users (including non-authenticated users) to read and # publish all packages # # you can specify usernames/groupnames (depending on your auth plugin) # and three keywords: “$all”, “$anonymous”, “$authenticated” access: $all #表示哪一类用户可以对匹配的项目进行安装 # allow all known users to publish packages # (anyone can register by default, remember?) publish: $authenticated #表示哪一类用户可以对匹配的项目进行发布 # if package is not available locally, proxy requests to ’npmjs’ registry proxy: npmjs #如其名,这里的值是对应于 uplinks# log settingslogs: - {type: stdout, format: pretty, level: http} #- {type: file, path: sinopia.log, level: info}# you can specify listen address (or simply a port) listen: 0.0.0.0:4873 #默认没有,只能在本机访问,添加后可以通过外网访问==listen: 0.0.0.0:4873 这一条一定得加,然后记得把服务器的4873的端口开放==访问在自己的电脑浏览器上输入服务器ip地址+端口号,端口号默认为4873eg:192.186.1.343:4873到这里,我们可以成功的在自己的服务器上搭建我们的私有npm啦~~ ...

January 18, 2019 · 2 min · jiezi

CentOS 7 SSH远程连接Putty

第一次连接的时候,莫名其妙的就连上了,结果这次不知道怎么连了,经过了很大的周折才连上,就想把经验写在这里,一来备忘,二来分享给大家。1.首先输入yum list installed | grep openssh-server来确保是否安装了openssh-server。 我这里已经安装了openssh-server,如果显示没有安装,请输入yum install openssh-server进行安装。2.输入vi /etc/ssh/sshd_config,将监听端口、监听地址取消注释 3.输入sudo service sshd start启动sshd服务。 输入ps -e | grep sshd查看sshd服务是否开启。我这里由于之前开启了一次,所以显示两个sshd服务,如果是第一次开启会显示一个。 4.右键VMware中的CentOS 7点击设置,发现网络适配器中连接方式为NAT。 继续在VMware中,依次点击编辑=>虚拟网络编辑器,输入ipconfig查看NAT模式采用的网络适配器为VMnet8。5.打开Windows命令行,输入ipconfig查看VMnet8的连接信息,找到ip地址。6.在CentOS 7中输入ifconfig查看ip地址,并用ping命令分别测试网络连通性。7.如果都能连通,打开Putty,在Host Name中输入CentOS 7的ip,如果不希望在每次使用时都输入ip,再在Saved Session中输入CentOS 7的ip,点击Save,再点击Open即可连接,初次连接会出现弹窗,点击Yes即可。

January 13, 2019 · 1 min · jiezi

MySQL在CentOS 7中的安装

1.删除CentOS 7中自带的mariadb,输入yum remove mariadb-libs.x86_642.将目录切换到tmp,输入wget https://repo.mysql.com/mysql57-community-release-e17-8.noarch.rpm3.安装下载好的MySQL5.7,输入yum localinstall mysql57-community-release-el7-8.noarch.rpm4.接下来安装数据库服务,输入yum install mysql-community-server,由于这一步安装包比较大,建议在网络良好且稳定的情况下进行。5.接下来我们要查找MySQL的初始密码,首先输入service mysqld start启动数据库服务,启动后我们可以输入ps -ef | grep mysql查看数据库服务是否启动成功。6.接下来输入cat /var/log/mysqld.log | grep ‘password’查看初始密码。7.然后输入mysql -uroot -p进入MySQL,然后输入上一步的密码,注意,由于Linux中所有输入的密码是不显示的,所以这里粘贴过去就好了,输入后我们就进入了MySQL。然后输入exit退出。8.如果要关闭数据库服务,输入service mysqld stop

January 13, 2019 · 1 min · jiezi

python3.7.0在CentOS 7中的安装

python在Windows中的安装很简单,但是在Linux下却没有那么简单了。1.输入yum install openssl-devel bzip2-devel expat-devel gdbm-devel readline-devel sqlite-devel2.输入wget “https://www.python.org/ftp/python/3.7.0/Python-3.7.0.tgz"下载python3.7.0,此处一定要注意最后python版本的大小写,如果没有wget命令,请先输入yum install wget3.下载结束后对下载好的python压缩文件进行解压,输入tar -zxvf Python-3.7.0.tgz4.在/usr/local下新建文件夹python3,输入mkdir /usr/local/python35.由于python在Linux中的安装需要对python在文件夹中进行编译,所以下一步需要输入 Python-3.7.0/configure –prefix=/usr/local/python3,这一步会出现报错,原因是我们没有安装gcc,此时输入yum install gcc安装gcc后,再执行上面的命令即可。6.输入make,这一步的时间要长一些,耐心等待就行了。7.最后输入make install,但是这一步执行到最后会报错。 这是由于python3.7需要一个工具包,因此要先输入yum install libffi-devel安装一下再执行上述命令,执行结束后python就在Linux中安装好了。

January 13, 2019 · 1 min · jiezi

CentOS 7第一次使用时的基础配置

安装好CentOS 7后,第一次使用我们将面临一些配置问题,当我们输入ifconfig查看CentOS 7的ip时,系统会报错,这是由于没有安装net-tools的原因,我们只需按如下方法进行操作:在命令行中输入以下代码vi /etc/resolv.conf,然后按i,在文件中添加nameserver 114.114.114.114,其中114.114.114.114为电信的DNS,添加完成后,按ESC后输入:wq保存并退出。在命令行中输入cd /etc/sysconfig/network-scripts将目录切换到network-scripts下,然后输入ll查看该目录下的文件列表,找到第一个文件,为ifcfg-xx,这个文件名后缀是随机的,和电脑有关,我这里是ifcfg-ens33。输入vi ifcfg-ens33打开文件,按i进入编辑模式,将ONBOOT=no改为ONBOOT=yes,按ESC,再输入:wq保存并退出。输入命令service network restart重启网络。这样就配置好了网络,这时输入ip addr可以查看CentOS 7的ip。输入cd /将目录切换到根目录后,输入yum install net-tools,等待安装完成,这时输入ifconfig便不会报错了。由于在官网下载CentOS 7很慢,在这里推荐到国内的一些镜像源网站下载,我下载CentOS 7的地址是http://mirrors.163.com/centos/7/isos/x86_64/

January 13, 2019 · 1 min · jiezi

CentOS下 使用yum update 更新,不更新

有时需要保留特定版本的软件不升级,但升级其他软件,这时就需求用到下面的技巧。当CentOS/RHEL/Fedora下的Linux服务器使用 yum update 时命令如何排除选定的包呢?Yum使用/etc/yum/yum.conf或/etc/yum.conf中的配置文件。您需要放置exclude指令来定义要更新或安装中排除的包列表。这应该是一个空格分隔的列表。允许使用通配符和?)。当我使用“yum update”时,如何排除php和内核包?打开/etc/yum.conf文件,输入:# vi /etc/yum.conf在[main]部分下面添加以下行,输入:exclude=php kernel最后,它应如下所示:[ main ]cachedir = /var/cache/yum keepcache = 0 debuglevel = 2 logfile = /var/log/yum.log distroverpkg = redhat-release tolerant = 1 exactarch = 1 obsoletes = 1 gpgcheck = 1 plugins = 1 exclude =php kernel*…保存并关闭文件。您现在可以照常使用yum命令,但不会安装某些软件包。如何禁用排除?您可以使用以下语法:yum –disableexcludes = all updateyum –disableexcludes = main install phpyum –disableexcludes = repoid install php httpd这里:all:禁用所有排除main:禁用yum.conf中[main]中定义的排除repoid:禁用为给定repo id定义的排除yum -exclude 命令行选项最后,您可以使用以下语法在命令行上跳过yum命令更新:注意:上述语法将按名称排除特定包,或者从所有存储库的更新中排除。# yum –exclude=package* update# yum –exclude=php* update# yum –exclude=kernel* update# yum -x ‘kernel*’ -x ‘php*’ update推荐读物有关更多信息,请使用以下命令查看yum命令的手册页:$ man yum$ man yum.conf ...

January 11, 2019 · 1 min · jiezi

国外服务器解决域名备案问题

前言笔者曾经开发一个小程序demo,上传代码后准备发版本时发现微信居然要求后台服务器域名是要经过备案的,而本人的服务器在国外,国内无法进行域名备案。为了能够使小程序顺利与后台交互,找一个备案过的域名势在必行。本文来源于我的博客网站:http://51think.net一、找一个备案过的域名访问站长工具http://del.chinaz.com/,查找已备案且是近期删除的域名,备案性质最好是企业类型的:选一个域名,建议不要找.com结尾的,因为.com的一般都被别人抢注了。二、注册域名不建议使用阿里云、腾讯云等国内域名服务商,因为这些服务商在发现域名被删除后,可能会将备案信息注销。笔者使用国外的域名服务商godaddy,可以帮助我们进行域名注册。首先访问https://sg.godaddy.com/,注册…,搜索你想要的域名:然后购买,可以使用支付宝进行付款三、域名解析在godady的DNS管理选项里添加A记录,即可帮助我们将域名解析到自己的服务器上。综上,这个备案过的域名就归我所用了!

January 10, 2019 · 1 min · jiezi

centos7 安装nginx并配置代理

前言笔者在国外租了一个虚机,用来部署自己的博客应用,并申请了一个域名51think.net来指向这个虚机。随着部署的应用越来越多,而80端口只有一个,无法直接通过域名去访问不同的应用。由此而来,部署一个代理服务器势在必行。本文对nginx的安装和配置进行简单整理,希望对初学者有帮助。一、安装nginx安装有两种方式,即yum和wget。1、通过yum方式在线安装需要注意的一点是,nginx并不在yum的安装源中。什么是yum?你可以理解为一个rpm包管理器的前置(什么是rpm?自己百度吧。。),yum类似于maven的效果,给一个包名,就能将其所依赖的软件包全部下载下来。maven是有中央仓库的,即包的来源。yum也是同样的概念,它也需要一个包源,而且可以配置多个,这个源可以是本地的也可以是网络的,而nginx并不在它的源中,因此我们要把它加到yum的源中。执行如下命令:rpm -ivh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm这个操作并不是安装nginx,只是安装了一个nginx的源。执行完成之后,会在/etc/yum.repos.d目录中看到多了一个文件nginx.repo 。从这个文件的后缀我们可以感知到,.repo即repository,仓库配置。文件内容如下:核心要素也就是一个网址。即告知yum命令,可以从这个网址里找nginx下载并安装。现在开始真正的安装,执行命令yum install -y nginx即可。2、通过wget下载nginx的压缩包wget http://nginx.org/download/nginx-1.10.1.tar.gz解压tar -zxvf nginx-1.10.1.tar.gz,我本地的解压缩目录是/usr/local/,这时候我们可以启动一下nginx观察一下效果,到/usr/local/nginx/sbin目录,执行./nginx,然后在浏览器中访问http://localhost ,弹出以下页面则表示安装成功(确保80端口没有被占用):二、配置代理1、单点代理配置在虚机上找到nginx的安装目录,找到nginx.conf文件。笔者的文件路径是:/usr/local/nginx/conf/nginx.conf这个配置文件的内容很简单,结构类似于json,重点关注server领域的配置,其他配置项默认即可。笔者的配置如下,供参考: server { listen 80; server_name www.51think.net 51think.net www.ueasy.cc; #charset koi8-r; #access_log logs/host.access.log main; #blog location / { proxy_pass http://138.128.193.108:8080; } #mall location /wx { proxy_pass http://138.128.193.108:8081; } }listen表示监听的端口,http的是80,https的是443。server_name表示本配置项是为哪些域名准备的,即可以接受哪些域名的访问。location就是代理的配置了,/表示可以通过域名的根目录去访问http://138.128.193.108:8080的tomcat服务,/wx表示可以通过“域名+/wx”的形式去访问http://138.128.193.108:8081的tomcat服务。要注意的一点是,如果location作为tomcat服务的全局入口,那么location的路径需要和tomcat的contextPath保持一致,否则访问可能出现404错误。举例说明,如果我的博客网站tomcat的contextPath是/blog,即直接访问路径应该是http://138.128.193.108:8080/blog。如果在nginx层面将location配置成如下: location / { proxy_pass http://138.128.193.108:8080; } 则通过域名http://51think.net/这样访问时,将会被代理到http://138.128.193.108:8080/这个访问路径,显然这样是访问不通的。如果tomcat的contextPath是/则没问题。2、负载均衡代理配置负载均衡配置也比较简单,将上文location配置中的 IP+端口换成一个新的配置项,然后在新的配置项里加入我们要负载的节点和负载的策略。location / { #将ip和端口信息换成一个新的配置项manyserver(自由命名) proxy_pass http://manyserver; }配置manyserver:upstream manyserver{ server 138.128.193.108:8080; #tomcat server 138.128.193.108:8084; #tomcat server 138.128.193.108:8085; #tomcat }upstream manyserver配置项里,我们还可以制定负载均衡策略,比如iphash,权重,轮询等,在此不再赘述。以上就是nginx安装配置的全部内容,希望对初学者有所帮助。三、注意事项1、nginx.conf中可以配置多个server节点,nginx可以根据监听端口或者访问域名去定位到不同的server配置项。2、配置完成之后,记得要重启nginx。到nginx的安装目录/usr/local/nginx/sbin/,执行./nginx -s reload即可。

January 6, 2019 · 1 min · jiezi

Windows 7 下硬盘安装 CentOS 7

背景起因是希望装 Jenkins 做持续集成,遂征用了一台同事淘汰的笔记本电脑来作为一个临时服务器。笔记本电脑所装系统是 Windows,为了最大化电脑性能以及稳定,希望更换成 Linux 系统。加上自己对 CentOS 相对比较熟悉,选择了最新版的 CentOS 7 进行安装。相关软件版本笔记本电脑系统:Windows 7 UltimateWindows 文件系统:NTFS待安装 Linux 系统: CentOS 7.6.1810难点介绍由于 Linux 的文件系统与 Windows 存在差异:Linux 系统能识别 Windows 下 FAT32 文件系统,不能识别 NTFS 文件系统,所以在 Linux 安装时,选择任何 sda 都不行,FAT32可以FAT32 文件系统单个文件不能超过 4GCentOS 7.6文件大于 4G (最小安装镜像也许不存在这个问题,笔者未尝试)所以:在 Win7 下使用 FAT32 和 NTFS 系统存放安装 ISO 都不可行,则要想办法用工具分出一块 Linux 文件系统,如:ext3,不受 4G 的限制准备工作需要准备的软件CentOS 7: 64位安装文件,这个是必须有的。deamon tools:虚拟光驱,用来挂载 CentOS iso 镜像安装文件EasyBCD:设置引导启动用EaseUS Partition Master 10.1:用于格式化成ext3Ext2Fsd:在win7下挂载linux文件系统ext2、ext3等WinGrub:只是为了看一下分区编号,其实很鸡肋,没有也可以,需要一个个地实验分配空间打开磁盘管理器:Win徽标键+R键调出运行框,输入指令diskmgmt.msc回车调出磁盘管理器。在磁盘的最后一个主分区上点击右键,选择“删除卷”或“压缩卷”,空间建议至少 100G 。(注意:如果是删除卷,需要备份此分区内的文件信息)然后磁盘上应该会显示有一部分“未分配”状态的空间打开 EaseUS Partition Master 10.1,在磁盘未分配空间上右键->创建分区,创建一个 10GB 的分区作为Linux镜像的安装盘,文件系统需要选择 EXT3挂载EXT3,并拷贝安装脚本及安装文件安装 Ext2Fsd 软件,安装过程中记得勾选以下选项使用 Ext2Fsd 挂载刚刚分配的 10GB 的 EXT3 格式的磁盘分区使用 deamon tools 挂载 CentOS 7 的 iso 文件,打开虚拟光驱,复制根目录的 images 和 isolinux 两个文件夹到 10GB 的 EXT3 磁盘分区中复制 CentOS 7 的 iso 到 10GB 的 EXT3 磁盘分区中(注意:是以.iso为后缀文件,而不是虚拟光驱中的文件)查看分区编号,并添加启动脚本安装 WinGrub,在Tool->Partition List打开的页面中找到 10GB 的 EXT3 磁盘分区的编号,例如:(hd0,5)(注意:由于软件反应速度慢,打开 Partition List 可能需要一段时间响应)安装 EasyBCD,打开后找到 Add New Entry,点 NeoGrub 标签。点 Install 然后点 Configure在弹出的文档中加入下面内容(注意,以下内容中的{0}和{1}为占位符,取决你你自己的系统,不要直接复制):title CentOS 7root {0}kernel {0}/isolinux/vmlinuz linux repo=hd:/dev/{1}:/initrd {0}/isolinux/initrd.img替换{0}为你的 10GB 的 EXT3 磁盘分区编号,如:(hd0,5)替换{1}为你的linux repo地址,如:sda6。这里sda后面的数字是比你的分区编号大 1 的数字(说明在 linux 里磁盘编号是从 1 开始,而 windows 从 0 开始,故两者相差 1)完整的文本内容见下面title CentOS 7root (hd0,5)kernel (hd0,5)/isolinux/vmlinuz linux repo=hd:/dev/sda6:/initrd (hd0,5)/isolinux/initrd.img补充:linux repo=hd:/dev/sda7:/代表你的linux系统位置,如果sda不行,需要替换成sdb试下。具体原理笔者不太清楚,如有懂的希望在评论区中回复下。只有CentOS 7需要。开始安装完成以上步骤即可以重启系统开始安装……网上关于 CentOS 7 的安装文档很多,不在本文研究范围内,贴出链接方便下大家:CentOS 7系统安装配置图解教程参考资料Win7下硬盘安装CentOS7!Windows 7下硬盘安装CentOS 6.5 ...

January 3, 2019 · 1 min · jiezi

在 CentOS 7 上搭建 Jenkins + Maven + Git 持续集成环境

本文以部署 Spring boot + Maven 项目为例,使用码云作为代码托管仓库,在 CentOS 7 上搭建 Jenkins 持续集成环境。1. 准备工作1.1 安装 Java 环境Jenkins 是基于 Java 开发的持续集成工具,需要在 Java 环境下运行。用下面命令查看系统是否已安装 Java:yum list installed | grep jdk如果没有,使用 yum search 命令查找 openjdk 版本,选择合适的 jdk 进行安装:yum search openjdk yum -y install java-1.8.0-openjdk-devel验证 Java 是否安装成功:java -version1.2 安装 Maven依次运行以下两条命令:wget http://repos.fedorapeople.org… -O /etc/yum.repos.d/epel-apache-maven.repo yum -y install apache-maven验证 Maven 是否安装成功:mvn -v1.3 安装 Git直接通过 yum 安装,安装完成后查看版本验证是否安装成功:yum -y install git git –version2. 安装和配置 Jenkins:2.1 安装 Jenkins依次运行以下三条命令:sudo wget https://pkg.jenkins.io/redhat… -O /etc/yum.repos.d/jenkins.repo sudo rpm –import https://pkg.jenkins.io/redhat… yum -y install jenkins如果之前从 Jenkins 导入过 key,那么 rpm –import 将失败,因为已经有一个 key 了。忽略它,继续执行 install 即可。2.2 启动 Jenkins启动 Jenkins,并且设置开机自启动:systemctl start jenkins.service chkconfig jenkins onJenkins 默认使用8080端口,访问以下链接即可看到 Jenkins 的 Web 界面:http://&lt;服务器地址>:8080如果无法访问,检查一下防护墙,是否有开放端口,或使用命令 netstat -ntulp 查看端口是否被占用。2.3 进入 Jenkins首次进入 Jenkins 需要输入管理员密码,使用以下命令查看初始密码:cat /var/lib/jenkins/secrets/initialAdminPassword选择默认的 install suggested plugins 安装插件,等待安装完成后依照步骤创建用户,创建完成后即可登入。2.4 配置 Jenkins进入 Manage Jenkins -> Global Tool Configuration,依次配置 JDK、Git 和 Maven 路径。2.4.1 查看 JDK 路径使用 yum 安装的软件不会帮我们配置环境变量,直接使用命令echo $JAVA_HOME 是看不到路径的。 先用以下命令查看路径:which java看到的结果是 /usr/bin/java ,但实际上这只是个软连接,并不是 JDK 真正的所在目录。 继续使用以下命令查看:ls -l /usr/bin/java看到 /usr/bin/java 指向了 /etc/alternatives/java,很遗憾,还不是我们要找的真正路径。 继续追踪:ls -l /etc/alternatives/java结果指向了 /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.191.b12-1.el7_6.x86_64/jre/bin/java,不同版本的 JDK 目录名可能有些不同,这就是 JDK 真正所在的地方。 同理可获得 Maven 的所在路径。2.4.2 安装和配置插件进入 Manage Jenkins -> Manage Plugins,搜索并安装 Publish Over SSH 和 Maven Integration 两个插件, Git Plugins 插件已经默认安装上了,我们无需再安装。配置 SSH 免密码登录 在配置插件之前,我们先在 Jenkins 服务器上生成密钥对。运行以下命令切换到 jenkins 用户:sudo su jenkins如果无法切换,则打开 /etc/passwd 文件,找到 jenkins 那一行,将 /bin/fasle 改成 /bin/bash。 切换成功后,命令提示符的用户名可能是 bash-4.2$,想要正常显示用户名的话,先切换回 root 用户,执行以下操作:编辑文件 vi /.bash_profile 加入语句 export PS1=’[u@h W]&dollar;’ 立即生效 source /.bash_profile再切换到 jenkins 用户,就显示正常了。接下来运行以下命令生成密钥对:ssh-keygen -t rsa一路按回车完成,会在 /var/lib/jenkins/.ssh/ 目录下生成 id_rsa 和 id_rsa.pub两个文件。 将 id_rsa.pub 文件里的内容追加到应用服务器上的 /root/.ssh/authorized_keys 文件末尾,每行一个 key,注意是应用服务器。重启应用服务器上的 ssh 服务:systemctl restart sshd.service现在 Jenkins 可以免密码登录应用服务器了,以 jenkins 用户身份运行命令来测试一下:ssh root@<应用服务器地址>首次连接会有确认提示,输入 yes 即可。这步很重要,如果第一次没有手动连接确认,Jenkins 会连不上。配置 Public over SSH 插件 进入 Manage Jenkins -> Configure System,填写 Publish over SSH 设置。Path to key:填写刚刚生成的 id_rsa 密钥文件的路径。 Name:服务名,随意填写。 HostName:应用服务器的 IP 地址或域名。 Username:登录应用服务器的用户身份。 Remote Directory:远程目录, 应用服务器上存放应用的目录,Jenkins 会把应用拷贝至此目录下。请确保此目录存在。save3. 部署 Maven 项目点击 New Item 新建任务,随意输入任务名,选择 Maven project, ok。 在General,勾选 Discard old builds,可以设置最多保留构建文件多少天,和最多保留多少个构建文件,不然每次构建生成的文件都会保留,占用磁盘空间。 配置远程代码仓库地址,Jenkins 会从该地址拉取代码。注意此处如果提示无法读取仓库,有可能是:公钥没有添加到远程代码服务器的 authorized_keys 文件里,上面配置 SSH 免登录是 Jenkins 访问应用服务器的,Jenkins 访问代码服务器也同样需要配置,除非应用服务器和代码服务器是同一台机器。如果使用码云或 GitHub 等代码托管平台,会有相应的 SSH key 设置页。公钥已添加到相应文件里,但没有手动连接第一次。解决方法很简单,以 jenkins 用户身份手动 clone 一次仓库,确认 yes 即可。勾选 Add timestamps to the Console Output,在控制台输出构建过程。填写 Maven 打包指令,-DMaven.test.skip=true 表示跳过测试。勾选 Run only if build succeeds,选择 Send files or execute commands over SSH。接下来就是设置 build 完之后,把 jar 包从 Jenkins 服务器拷贝到应用服务器上,并运行。Name:选择之前创建的服务。 Source files:maven 打包后生成的 jar 包,即要拷贝到应用服务器运行的程序,可填多个,英文逗号分隔。 Remove prefix:忽略前缀,我们只需要拷贝 target 下的 jar 包,不需要在应用服务器上生成 target 目录。 Remote directory:目标文件夹,会继承全局设置,例如此处会把 jar 包拷贝到 /usr/local/app/demo 目录下。 Exec command:拷贝完成后,在应用服务器上执行的命令或脚本。save -> build now,构建成功后,打开浏览器访问你的站点吧4. 总结其实整个流程不是很复杂,Jenkins 从远程代码库拉取代码 -> 调用 maven 指令将项目打包 -> Jenkins 将打包好的文件拷贝到远程应用服务器 -> 在远程应用服务器上执行 shell 指令,启动程序。其中 Jenkins 两次远程操作都是通过 SSH 完成的。 通过 yum 安装 Jenkins 和 Java 比较方便,但是在配置的时候相对麻烦,安装路径要自己找,配置 SSH 的时候也是要用 jenkins 用户身份,而不是 root,如果采用解压缩包的方式就比较自由一些。 ...

January 3, 2019 · 2 min · jiezi

树莓派搭建git服务器并实现公网访问(二)共2篇—安装git

在某商活动期间购买的云服务器一年当时300多块软妹币,到期后续费要800多。感觉太贵!!平时该服务器主要用做个人svn服务器,利用率比较低,如果买便宜的新机器总是迁移文件也挺烦人的,综合考虑下就不想再续了,正好手里有一台树莓派可以派上用场了。树莓派挂载移动硬盘,并安装git服务,代码到时都上传到移动硬盘里。一、挂载移动硬盘将移动硬盘插好后dh -h 查看当前磁盘设备,笔者的移动硬盘设备名为/dev/sda1,容量1T 笔者的移动硬盘为ntfs格式,为了使centos系统能正常挂载磁盘需要先安装ntfs-3g下载地址:http://www.linuxfromscratch.o…安装略…挂载命令如下:mount -t ntfs-3g /dev/sda1 /mnt/disk1 #/mnt/disk1为挂载的系统目录设置开机自动挂载:更改/etc/fstab,更改前备份下 cp /etc/fstab /etc/fstab.bak/dev/sda1 /mnt/windows ntfs-3g defaults 0 0二、安装git注意:笔者挂载的移动硬盘为ntfs格式的缘故只能root用户访问,首先在root目录下建立到移动硬盘git目录下的软链接ln -s /mnt/disk1/git /rootgit具体安装步骤略,具体请参照网上其他出处…安装完后cd /root/git在该目录下进行仓库初始化操作git init –bare dev.git三、访问树莓派上的git服务参照前一篇文章安装好frp后,我们可以通过公网使用ssh的方式访问我们树莓派上的git服务了!git clone ssh://root@请填写服务器ip地址:6001/root/git/dev.git大功告成!如果觉得移动硬盘ntfs格式不好做权限控制使用不便可以改为fat32格式

December 31, 2018 · 1 min · jiezi

树莓派搭建git服务器并实现公网访问(一)共2篇—安装frp实现内网SSH穿透

为了使家中的树莓派能通过公网访问,我们需要一款内网穿透软件,笔者在这里选择的是frp,相比其他方式具有开源免费,配置简单,无端口数限制的优势。下载地址:https://github.com/fatedier/f…一、下载安装包服务端和客户端都在同一个安装包里,但需要根据自己系统分别下载对应的安装包笔者树莓派安装32位CentOS操作系统,作为客户端下载的版本为frp_0.21.0_linux_arm.tar.gz服务端为某云服务器安装64位CentOS操作系统,作为服务端下载版本为frp_0.21.0_linux_amd64.tar.gz二、配置将压缩包分别解压,可以看到frps为服务端启动脚本,frpc为客户端启动脚本。服务端创建frps.ini文件,具体配置项可以参照frps_full.ini文件客户端创建frpc.ini文件,具体配置项可以参照frpc_full.ini文件笔者服务端配置如下:[common]# frp 服务端端口(必须)bind_port = 7000# frp 服务端密码(必须)token = 请设置自己的密码# 认证超时时间,由于时间戳会被用于加密认证,防止报文劫持后被他人利用# 因此服务端与客户端所在机器的时间差不能超过这个时间(秒)# 默认为900秒,即15分钟,如果设置成0就不会对报文时间戳进行超时验证authentication_timeout = 0# 仪表盘端口,只有设置了才能使用仪表盘(即后台)dashboard_port = 7500# 仪表盘访问的用户名密码,如果不设置,则默认都是 admindashboard_user = admindashboard_pwd = admin客户端配置如下:[common]server_addr = 请填写云服务器ip地址server_port = 7000token = 请填写服务端设置的密码[ssh]type = tcplocal_ip = 127.0.0.1local_port = 22use_encryption = falseuse_compression = falseremote_port = 6001三、运行服务端启动:nohup ./frps -c ./frps.ini &客户端启动:客户端由于远程操作需要重启系统或者客户端进程被意外杀掉后,服务端无法再连接上。为了能保证客户端服务的高可用只设置客户端开机自启是不行的,笔者的处理办法为加一个定时脚本每隔一段时间扫描客户端进程,如果不存在就启动。笔者的定时启动脚本如下monitor.sh:#!/bin/shMonitor(){ps -fe|grep frpc |grep -v grepif [ $? -ne 0 ];then echo “start process…..” nohup /usr/local/frp/frp_0.21.0_linux_arm/frpc -c /usr/local/frp/frp_0.21.0_linux_arm/frpc.ini &fi}Monitor>>/usr/local/frp/monitor.log编辑 /etc/crontab文件在最后一行加入以下代码,设置每一分钟扫描一次*/1 * * * * root /bin/sh /usr/local/frp/monitor.sh四、完结在浏览器访问服务端IP地址加映射的SSH端口号即可查看仪表盘页面如下:SSH工具配置服务端IP地址,端口为映射的SSH端口(此处笔者的为6001),用户名和密码为客户端的用户名密码,即可通过公网直接访问局域网内的机器了。另外如果服务端配置设置了authentication_timeout参数且不为0需要保证客户端和服务端时间同步,不然会启动失败。需要设置的同学可以参照以下方式进行设置:ntpdate 0.asia.pool.ntp.org #同步网络时间timedatectl set-timezone Asia/Shanghai #设置时区然而树莓派并不像我们目前的笔记本或者主机一样存在cmos电池,在断电之后,时间就停留在当前这个时间点,下次开机依然从这次开始。因此可参照前边在定是脚本文件加入以下代码:/1 * * * * ntpdate 0.asia.pool.ntp.org ...

December 31, 2018 · 1 min · jiezi

阿里云 centos7.6 安装 php7.3

新增用户 用户组groupadd wwwuseradd -g www www下载 phpwget “https://downloads.php.net/~cmb/php-7.3.0.tar.gz"tar xzvf php-7.3.0.tar.gzcd php-7.3.0编译–with-fpm-user=www –with-fpm-group=www这里使用www www 用户、用户组编译出来的程序启动,就是归属这个用户、用户组./configure –prefix=/usr/local/php –with-fpm-user=www –with-fpm-group=www –with-curl –with-freetype-dir –with-gd –with-gettext –with-iconv-dir –with-kerberos –with-libdir=lib64 –with-libxml-dir –with-mysqli –with-openssl –with-pcre-regex –with-pdo-mysql –with-pdo-sqlite –with-pear –with-png-dir –with-jpeg-dir –with-xmlrpc –with-xsl –with-zlib –with-bz2 –with-mhash –enable-fpm –enable-bcmath –enable-libxml –enable-inline-optimization –enable-mbregex –enable-mbstring –enable-opcache –enable-pcntl –enable-shmop –enable-soap –enable-sockets –enable-sysvsem –enable-sysvshm –enable-xml –enable-zip –enable-fpm 编译错误,解决依赖configure: error: libxml2 not found. Please check your libxml2 installation.yum install -y libxml2-develconfigure: error: Please reinstall the BZip2 distributionyum install -y bzip2-develconfigure: error: cURL version 7.15.5 or later is required to compile php with cURL supportyum install -y curl-develconfigure: error: jpeglib.h not found.yum install -y libjpeg-develconfigure: error: png.h not found.yum install -y libpng-devel configure: error: freetype-config not found.yum install -y freetype-develconfigure: error: xslt-config not found. Please reinstall the libxslt >= 1.1.0 distributionyum install -y libxslt-develconfigure: error: Please reinstall the libzip distributionyum install -y libzip-develchecking for libzip… configure: error: system libzip must be upgraded to version >= 0.11#先删除旧版本yum remove -y libzip#下载编译安装wget https://nih.at/libzip/libzip-1.2.0.tar.gztar -zxvf libzip-1.2.0.tar.gzcd libzip-1.2.0./configuremake && make installoff_t undefined 报错checking libzip… yeschecking for the location of zlib… /usrchecking for pkg-config… (cached) /usr/bin/pkg-configchecking for libzip… in default path: found in /usr/localchecking for zip_open in -lzip… yeschecking for zip_file_set_encryption in -lzip… yeschecking for zip_libzip_version in -lzip… nochecking stdbool.h usability… yeschecking stdbool.h presence… yeschecking for stdbool.h… yeschecking fts.h usability… yeschecking fts.h presence… yeschecking for fts.h… yeschecking for int8_t… (cached) yeschecking for int16_t… (cached) yeschecking for int32_t… (cached) yeschecking for int64_t… (cached) yeschecking for uint8_t… (cached) yeschecking for uint16_t… (cached) yeschecking for uint32_t… (cached) yeschecking for uint64_t… (cached) yeschecking for ssize_t… yeschecking size of short… (cached) 2checking size of int… (cached) 4checking size of long… (cached) 8checking size of long long… (cached) 8checking size of off_t… 0configure: error: off_t undefined; check your library configurationoff_t 类型是在 头文件 unistd.h中定义的,在32位系统 编程成 long int ,64位系统则编译成 long long int ,在进行编译的时候 是默认查找64位的动态链接库,但是默认情况下 centos 的动态链接库配置文件/etc/ld.so.conf里并没有加入搜索路径,这个时候需要将 /usr/local/lib64 /usr/lib64 这些针对64位的库文件路径加进去。#添加搜索路径到配置文件echo ‘/usr/local/lib64/usr/local/lib/usr/lib/usr/lib64’>>/etc/ld.so.conf#然后 更新配置ldconfig -v安装make && make install报错usr/local/include/zip.h:59:21: fatal error: zipconf.h: No such file or directorycp /usr/local/lib/libzip/include/zipconf.h /usr/local/include/zipconf.h成功输出Installing shared extensions: /usr/local/php/lib/php/extensions/no-debug-non-zts-20180731/Installing PHP CLI binary: /usr/local/php/bin/Installing PHP CLI man page: /usr/local/php/php/man/man1/Installing PHP FPM binary: /usr/local/php/sbin/Installing PHP FPM defconfig: /usr/local/php/etc/Installing PHP FPM man page: /usr/local/php/php/man/man8/Installing PHP FPM status page: /usr/local/php/php/php/fpm/Installing phpdbg binary: /usr/local/php/bin/Installing phpdbg man page: /usr/local/php/php/man/man1/Installing PHP CGI binary: /usr/local/php/bin/Installing PHP CGI man page: /usr/local/php/php/man/man1/Installing build environment: /usr/local/php/lib/php/build/Installing header files: /usr/local/php/include/php/Installing helper programs: /usr/local/php/bin/ program: phpize program: php-configInstalling man pages: /usr/local/php/php/man/man1/ page: phpize.1 page: php-config.1Installing PEAR environment: /usr/local/php/lib/php/Warning: “continue” targeting switch is equivalent to “break”. Did you mean to use “continue 2”? in phar:///home/flame/software/php-7.3.0/pear/install-pear-nozlib.phar/PEAR/PackageFile/v2/Validator.php on line 1933[PEAR] Archive_Tar - installed: 1.4.3[PEAR] Console_Getopt - installed: 1.4.1[PEAR] Structures_Graph- installed: 1.1.1[PEAR] XML_Util - installed: 1.4.2[PEAR] PEAR - installed: 1.10.5Wrote PEAR system config file at: /usr/local/php/etc/pear.confYou may want to add: /usr/local/php/lib/php to your php.ini include_path/home/flame/software/php-7.3.0/build/shtool install -c ext/phar/phar.phar /usr/local/php/binln -s -f phar.phar /usr/local/php/bin/pharInstalling PDO headers: /usr/local/php/include/php/ext/pdo/配置,建立目录cp php.ini-production /usr/local/php/lib/php.inicp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.confln -s /usr/local/php/sbin/php-fpm /usr/local/bincd /usr/local/php/etc/php-fpm.dvim www.conf输入[www]listen = 127.0.0.1:9080 listen.mode = 0666 user = www #php代码目录权限 需要跟这个一致,group = www #php代码目录权限 需要跟这个一致pm = dynamicpm.max_children = 128pm.start_servers = 20pm.min_spare_servers = 5pm.max_spare_servers = 35pm.max_requests = 10000rlimit_files = 1024slowlog = log/$pool.log.slow加入 systemtl 服务cd /home/flame/software/php-7.3.0/sapi/fpmcp php-fpm.service /usr/lib/systemd/system/启动systemctl start php-fpm#查看状态systemctl status php-fpm#得到输出● php-fpm.service - The PHP FastCGI Process Manager Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled) Active: active (running) since Thu 2018-12-27 16:13:16 CST; 2s ago Main PID: 16835 (php-fpm) CGroup: /system.slice/php-fpm.service ├─16835 php-fpm: master process (/usr/local/php/etc/php-fpm.conf) ├─16836 php-fpm: pool www ├─16837 php-fpm: pool www ├─16838 php-fpm: pool www ├─16839 php-fpm: pool www ├─16840 php-fpm: pool www ├─16841 php-fpm: pool www ├─16842 php-fpm: pool www ├─16843 php-fpm: pool www ├─16844 php-fpm: pool www ├─16845 php-fpm: pool www ├─16846 php-fpm: pool www ├─16847 php-fpm: pool www ├─16848 php-fpm: pool www ├─16849 php-fpm: pool www ├─16850 php-fpm: pool www ├─16851 php-fpm: pool www ├─16852 php-fpm: pool www ├─16853 php-fpm: pool www ├─16854 php-fpm: pool www └─16855 php-fpm: pool wwwDec 27 16:13:16 iZj6cas4fyg41lxhngh1z0Z systemd[1]: Started The PHP FastCGI Process Manager.测试mkdir -p /home/www/webroot/phpcd /home/www/webroot/phpvim test.php输入<?phpphpinfo();?>访问xxx.xxx.xxx.xxx:8080/test.phpphp 命令环境在$HOME/.profile里新增内容为export PATH=$PATH:/usr/local/php/bin ...

December 30, 2018 · 3 min · jiezi

阿里云 centos7.6 安装 nginx 1.14.2

新增nginx 用户 用户组groupadd nginxuseradd -g nginx nginx下载 解压wget “http://nginx.org/download/nginx-1.14.2.tar.gz"tar xzvf nginx-1.14.2.tar.gz#同时下载 清理缓存插件wget “http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz"tar xzvf ngx_cache_purge-2.3.tar.gz编译安装需要使用 root用户cd nginx-1.14.2#ngx_cache_purge-2.3 路径是在你刚解压的路径./configure –user=nginx –group=nginx –prefix=/usr/local/nginx –with-http_v2_module –with-http_ssl_module –with-http_sub_module –with-http_flv_module –with-http_stub_status_module –with-http_gzip_static_module –with-pcre –add-module=/home/flame/software/ngx_cache_purge-2.3make && make install加入 systemctlvim /lib/systemd/system/nginx.service输入以下内容[Unit]Description=nginxAfter=network.target [Service]Type=forkingExecStart=/usr/local/nginx/sbin/nginxExecReload=/usr/local/nginx/sbin/nginx -s reloadExecStop=/usr/local/nginx/sbin/nginx -s quitPrivateTmp=true [Install]WantedBy=multi-user.target修改配置文件cd /usr/local/nginx/confmkdir vhostvim nginx.conf输入以下内容#user nobody;worker_processes 1; #设置值和CPU核心数一致error_log /usr/local/nginx/logs/nginx_error.log crit; #日志位置和日志级别pid /usr/local/nginx/nginx.pid;#Specifies the value for maximum file descriptors that can be opened by this process.worker_rlimit_nofile 8192;events{ use epoll; worker_connections 8192;}http{ include mime.types; default_type application/octet-stream; log_format main ‘$remote_addr - $remote_user [$time_local] “$request” ’ ‘$status $body_bytes_sent “$http_referer” ’ ‘"$http_user_agent” $http_x_forwarded_for’; #charset gb2312; server_names_hash_bucket_size 128; client_header_buffer_size 32k; large_client_header_buffers 4 32k; client_max_body_size 8m; sendfile on; tcp_nopush on; keepalive_timeout 60; tcp_nodelay on; fastcgi_connect_timeout 300; fastcgi_send_timeout 300; fastcgi_read_timeout 300; fastcgi_buffer_size 64k; fastcgi_buffers 4 64k; fastcgi_busy_buffers_size 128k; fastcgi_temp_file_write_size 128k; gzip on; gzip_min_length 1k; gzip_buffers 4 16k; gzip_http_version 1.0; gzip_comp_level 2; gzip_types text/plain application/x-javascript text/css application/xml; gzip_vary on; #下面是server虚拟主机的配置 include vhost/.conf;}vim vhost/php.conf输入以下内容server{ listen 8080;#监听端口 server_name xxx.xxx.xxx.xxx;#域名 或ip index index.html index.htm index.php; root /usr/local/nginx/html;#站点目录 location ~ .php$ { root /home/www/webroot/php; fastcgi_pass 127.0.0.1:9080; fastcgi_index index.php; include fastcgi.conf; } location ~ ..(gif|jpg|jpeg|png|bmp|swf|ico)$ { expires 30d; # access_log off; } location ~ .*.(js|css)?$ { expires 15d; # access_log off; } access_log “/usr/local/nginx/logs/php_access.log” main; error_log “/usr/local/nginx/logs/php_error.log” info;}测试启动nginx/usr/local/nginx/sbin/nginx -tsystemctl start nginx#或/usr/local/nginx/sbin/nginxcentos7防火墙开放端口# 开放8080端口firewall-cmd –zone=public –add-port=8080/tcp –permanent#重载firewall-cmd –reload#查看状态firewall-cmd –list-all阿里云端口安全组设置安全组说明新增8080端口的新增【入方向】规则测试打开 xxx.xxx.xxx.xxx:8080 如果有出现 【Welcome to nginx!】 即成功了 ...

December 30, 2018 · 1 min · jiezi

阿里云 centos7.6 安装shadowsocks-go

go语言开发环境安装go安装步骤下载 shadowsocks-gogo get github.com/shadowsocks/shadowsocks-go/cmd/shadowsocks-server配置configvim /opt/shadowsocks/config.json输入以下内容{ “server”:“0.0.0.0”, “local_port”:1080, “port_password”:{ “8787”:“xxxx” }, “timeout”:600, “method”:“aes-256-cfb”}复制可执行文件,并执行cp $HOME/go/bin/shadowsocks-server /opt/shadowsocks/shadowsocks-server/opt/shadowsocks/shadowsocks-server -c /opt/shadowsocks/config.json >/opt/shadowsocks/log.log &centos7防火墙开放端口# 根据/opt/shadowsocks/config.json 的端口新增端口firewall-cmd –zone=public –add-port=8787/tcp –permanent#重载firewall-cmd –reload#查看状态firewall-cmd –list-all阿里云 管理控制台-安全组 新增规则安全组说明主要根据/opt/shadowsocks/config.json 的端口新增【入方向】 规则

December 30, 2018 · 1 min · jiezi

阿里云 centos7.6 安装 mysql8

创建mysql用户、用户组groupadd mysqluseradd -g mysql mysqlpasswd mysql卸载系统自带的mariadb#查询 rpm -qa|grep mariadb返回 mariadb-libs-5.5.60-1.el7_5.x86_64#卸载rpm -e mariadb-libs-5.5.60-1.el7_5.x86_64返回error: Failed dependencies: libmysqlclient.so.18()(64bit) is needed by (installed) postfix-2:2.10.1-7.el7.x86_64 libmysqlclient.so.18(libmysqlclient_18)(64bit) is needed by (installed) postfix-2:2.10.1-7.el7.x86_64#强行卸载rpm -e –nodeps mariadb-libs-5.5.60-1.el7_5.x86_64下载mysql rpm下载mysql rpm选择Red Hat Enterprise Linux / Oracle LinuxRed Hat Enterprise Linux 7 / Oracle Linux 7 (x86, 64-bit)RPM Bundle取得下载地址https://cdn.mysql.com//Downlo…wget “https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar"tar -xvf mysql-8.0.13-1.el7.x86_64.rpm-bundle.tar安装安装依赖yum install -y libaio.x86_64 libaio-devel.x86_64 yum install -y openssl-devel.x86_64 openssl.x86_64 yum install -y perl.x86_64 perl-devel.x86_64 yum install -y perl-JSON.noarch yum install -y autoconf必要安装,注意顺序,有依赖关系rpm -ivh mysql-community-common-8.0.13-1.el7.x86_64.rpmrpm -ivh mysql-community-libs-8.0.13-1.el7.x86_64.rpmrpm -ivh mysql-community-client-8.0.13-1.el7.x86_64.rpmrpm -ivh mysql-community-server-8.0.13-1.el7.x86_64.rpm非必要安装,注意顺序,有依赖关系rpm -ivh mysql-community-libs-compat-8.0.13-1.el7.x86_64.rpmrpm -ivh mysql-community-embedded-compat-8.0.13-1.el7.x86_64.rpmrpm -ivh mysql-community-devel-8.0.13-1.el7.x86_64.rpmrpm -ivh mysql-community-test-8.0.13-1.el7.x86_64.rpm初始化数据库mysqld –initialize –console修改目录权限此步骤必须在初始化数据库之后!!!安装完默认是mysql 用户、用户组的权限,如果没有,则更改chown -R mysql:mysql /var/lib/mysql/用root用户启动systemctl start mysqld若启动失败,查看日志tail -n 100 /var/log/mysqld.log 查看初始化时的密码启动成功后可以查看初始化密码随机生成的cat /var/log/mysqld.log | grep password登录MySQL修改mysql用户密码mysql -u root -p#修改密码alter user ‘root’@’localhost’ identified by ‘yourpassword’;#远程设置use mysql;update user set host=’%’ where user=‘root’;#授权用户名的权限,赋予任何主机访问数据的权限grant all privileges ON . to ‘root’@’%’ with grant option;flush privileges;新增mysql用户,创建数据库,授权create user ‘flame’@’%’ identified by ‘password’;create database flame;grant all privileges on flame.* to ‘flame’@’%’;flush privileges;centos7防火墙开放端口# 开放3306端口firewall-cmd –zone=public –add-port=3306/tcp –permanent#重载firewall-cmd –reload#查看状态firewall-cmd –list-all阿里云端口安全组设置安全组说明新增3306端口的新增【入方向】规则生产环境mysql_secure_installation会做以下操作为root用户设置密码删除匿名账号取消root用户远程登录删除test库和对test库的访问权限刷新授权表使修改生效相关管理命令#启动mysqlsystemctl start mysqld.service#结束systemctl stop mysqld.service#重启systemctl restart mysqld.service#开机自启systemctl enable mysqld.service ...

December 30, 2018 · 1 min · jiezi

Centos7 安装Nginx整合Lua

前言本人的使用的电脑是Mac,操作系统是macOS Mojave。电脑上装有虚拟机。虚拟机上安装Centos7操作系统,在其之上安装Nginx及Luau类库,整个过程是在系统安装完成之后开始记录。建议安装前先拍快照,出现问题可以恢复准备工作如果安装的Linux能够联网,并且外部也能正常使用Linux的端口,那么可以忽略下面两部1.设置自动获取ip(1)在Linux上输入命令[root@localhost ~]ip addr #查看ip[root@localhost ~]nmcli connection show可以查看当前网卡信息我的是 ens33(2)修改信息[root@localhost ~]vi /etc/sysconfig/network-scripts/ifcfg-ens33将最后一行ONBOOT=no 修改为 ONBOOT=yes (3)重启网络服务[root@localhost ~]# systemctl restart network2.关闭防火墙systemctl stop firewalld.service #停止firewallsystemctl disable firewalld.service #禁止firewall开机启动3.准备安装是发现没有wget命令,可以先按照线面安装如果下面提示没有wget命令时,可以执行这一步[root@localhost ~]#yum -y install wget安装1.安装依赖环境[root@localhost ~]#yum -y install gcc zlib zlib-devel pcre-devel openssl openssl-devel2.安装LuaJIT我是在/usr/local路径下创建了 LuaJIT 文件夹[root@localhost LuaJIT]#wget http://luajit.org/download/LuaJIT-2.0.2.tar.gz[root@localhost LuaJIT]#tar –xvf LuaJIT-2.0.2.tar.gz[root@localhost LuaJIT]#cd LuaJIT-2.0.2[root@localhost LuaJIT-2.0.2]#make install3.安装nginx(1)下载ngx_devel_kit、lua-nginx-module、nginx我是在/usr/local路径下创建了 nginx 文件夹[root@localhost nginx]#wget https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gz[root@localhost nginx]#wget https://github.com/openresty/lua-nginx-module/archive/v0.10.9rc7.tar.gz[root@localhost nginx]#wget http://nginx.org/download/nginx-1.12.1.tar.gz #注意下载后的压缩包没有文件名称,但是根据版本号能区分是哪个文件[root@localhost nginx]#tar -xvf v0.3.0.tar.gz[root@localhost nginx]#tar -xvf v0.10.9rc7.tar.gz[root@localhost nginx]#tar -xvf nginx-1.12.1.tar.gz(2)编译Nginx[root@localhost nginx]# cd nginx-1.12.1[root@localhost nginx-1.12.1]#./configure –prefix=/usr/local/nginx –add-module=../ngx_devel_kit-0.3.0 –add-module=../lua-nginx-module-0.10.9rc7(3)安装[root@localhost nginx-1.12.1]#make[root@localhost nginx-1.12.1]#make install(4)启动nginx 启动时会nginx可能会报错 ./nginx: error while loading shared libraries: libluajit-5.1.so.2: cannot open shared object file: N找不到libluajit-5.1.so.2这个文件解决办法1.找到 libluajit-5.1.so.2,libluajit-5.1.so.2.0.2这两个文件复制到 对应的lib下 64位是 /usr/lib64 32位是 /usr/lib[root@localhost nginx-1.12.1]#find / -name libluajit-5.1.so.2发现文件默认是安装在 /usr/local/lib/libluajit-5.1.so.2下[root@localhost nginx-1.12.1]#cp /usr/local/lib/libluajit-5.1.so.2 /usr/lib64/[root@localhost nginx-1.12.1]#cp /usr/local/lib/libluajit-5.1.so.2.0.2 /usr/lib64在nginx安装目录下,修改nginx.conf文件在Server代码块下添加如下代码location /hello{ default_type ’text/plain’; content_by_lua ’ngx.say(“hello,lua”)’; }启动nginx[root@localhost nginx-1.12.1]#./configure在浏览器访问 虚拟对应的地址 http://xxx.xxx.xxx/hello显示如下到此就成功了 ...

December 24, 2018 · 1 min · jiezi

logstash通过webhdfs放入hdfs增加时间戳和host字段

1.问题描述logstash通过webhdfs插件把数据放入hdfs的时候,发现每行数据的签名都增加了一个时间戳和host字段2018-12-19T08:30:30.234Z %{host} “128.1.1.2” “GET"2.资料查找在网上找了很多资料,描述的都是webhdfs怎么使用,至于使用后的数据格式都没有说我去github的logstash-plugins下看了一下issues,看到了如下的文章,给出了解决办法https://github.com/logstash-plugins/logstash-output-webhdfs/issues/253.解决办法通过codec对输出数据进行format codec => line { format => “%{message}” }

December 19, 2018 · 1 min · jiezi

centos 6 iptables修改后无法保存的解决方法

自己弄了一个vultur的便宜vps,主要用来爬梯子,但是发现频繁的遭受暴力密码破解的攻击(里面啥都没有,破解个球。。。。)于是改端口,禁root登录,生成rsa文件,添加防火墙规则,重启ssh,可是发现仍然登不上去。竟然发现知识用了防火墙的reload,没有用restart命令。。。。。所以用vi改完 /etc/sysconfig/iptables 后,保存退出,然后启用service iptables restart重新登录,ok。然后世界清静了。

May 15, 2018 · 1 min · jiezi

教程:如何在vultur centos 7中部署Google BBR

BBR(Bottleneck Bandwidth and RTT)是一种新的拥塞控制算法,由谷歌贡献给Linux内核TCP栈。使用BBR后,Linux服务器可以显着提高吞吐量并减少连接延迟。此外,部署BBR很容易,因为此算法仅需要发送方的更新,不需要网络或接收方。在本文中,我将向您展示如何在Vultr CentOS 7 KVM服务器实例上部署BBR。 ...

March 30, 2018 · 1 min · jiezi