最近一个项目要上线了,须要搭服务器,原本是交给同窗搭的,结果遇到了大坑,还得本身来,今天把这些坑记一下.html
服务器有好几台,都是CentOS6.X
,两台6.8,一台6.4.java
项目须要的环境是Java
+Gradle
+MySql
+Redis
+Nginx
mysql
我经过MySql
官网下载的yum
源安装的MySql
,在CentOS6.4
的系统上执行linux
yum install mysql mysql-server mysql-devel
没有遇到任何依赖错误,因而顺利安装,而后启动服务nginx
servcie mysqld start
可是获得了失败的结果.因而查看配置文件,找到日志,发现了以下错误信息c++
2016-11-17T21:44:32.121190Z 0 [ERROR] Fatal error: mysql.user table is damaged. Please run mysql_upgrade. 2016-11-17T21:44:32.121315Z 0 [ERROR] Aborting
因而按照他的提示,执行mysql_upgrade
,却又提示没有启动mysqld
服务..这是一个死锁啊 面试
而后移除了这个MySql5.7
,向系统妥协,用yum
装了个5.1
的版本,导入建库语句,没有错误产生,暗道庆幸,还觉得是本身多虑了.
然而,等我放入数据以后,该来的仍是来了.redis
我在本地开发环境中是用的是docker
(后面会讲为何不在服务器上用docker
)拉取的MySql5.7
,本地测试一切正常.而后放到服务器上,当我查询一个中文的记录的时候,杀机终于显现——乱码啦 sql
做为一个对本身代码拥有充分自信的家伙,怎么能是个人问题呢,都怪MySql
的版本过低太弱智.docker
因此我决定换一台服务器,从头再来.还好实验室服务器多,够我折腾
基于在上一台服务器上的惨痛教训,此次我决定先装MySql
.
首先肯定发行版本
$ cat /etc/issue CentOS release 6.8 (Final) Kernel \r on an \m
准备下载工具axel
wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/axel-2.4-1.el6.rf.x86_64.rpm yum localinstall -y axel-2.4-1.el6.rf.x86_64.rpm
居然连wget
也要安装一下
而后安装MySql
的yum
源并安装MySql
,这个文件只有9k,直接用wget
就好了
wget http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm yum localinstall mysql57-community-release-el6-9.noarch.rpm -y yum install -y mysql mysql-server mysql-devel
而后出现依赖报错
Error: Package: mysql-community-server-5.7.34-2.el7.x86_64 (mysql56-community) Requires: libc.so.6(GLIBC_2.17)(64bit) Error: Package: mysql-community-server-5.7.34-2.el7.x86_64 (mysql56-community) Requires: systemd Error: Package: mysql-community-client-5.7.34-2.el7.x86_64 (mysql56-community) Requires: libc.so.6(GLIBC_2.17)(64bit) Error: Package: mysql-community-libs-5.7.34-2.el7.x86_64 (mysql56-community) Requires: libc.so.6(GLIBC_2.17)(64bit) Error: Package: mysql-community-server-5.7.34-2.el7.x86_64 (mysql56-community) Requires: libstdc++.so.6(GLIBCXX_3.4.15)(64bit) You could try using --skip-broken to work around the problem ** Found 1 pre-existing rpmdb problem(s), 'yum check' output follows: tzdata-2016i-1.el6.noarch is a duplicate with tzdata-2012j-1.el6.noarch
我网上找了半天也没找到怎么解决这个错误的解决办法,应该是CentOS6.8
不支持,因而放弃本身安装,准备上docker
我日常使用的是daocloud.io的docker
镜像,这里也使用这个安装
curl -sSL https://get.daocloud.io/docker | sh chkconfig docker on servcie docker start
而后拉取MySql
的镜像、运行,一切正常.而后拉取redis
和nginx
,若是一切正常的话,很快就能搞定了.
然而可怕的状况出现了,拉取过程挂掉了... 因而查看docker
守护进程,发现守护进程居然挂掉了!我但是什么都没作啊!并且三更半夜,谁会和我一块儿搞服务器?!
对于这种莫名的缘由,我感受非常惧怕.由于以前这台主机是被动过的,因此我不知道是否是别人动过什么.决定再换一台没动过的主机来搞.
我没有在这台主机上尝试docker
,我已经不信任在CentOS6.X
环境中的docker
了,直接来安装MySql
吧
此次我找到了这篇文章http://www.javashuo.com/article/p-zokwkgqm-v.html
什么,居然yum
源还有激活这个事情?! 我仍是太天真,太孤陋寡闻.因而赶忙查看一下MySql
源的激活状况
yum repolist all | grep mysql
果真默认激活5.7
,因而我选择下降一个版本,使用5.6
yum install -y yum-utils yum-config-manager --disable mysql57-community yum-config-manager --enalbe mysql56-community yum install -y mysql mysql-server mysql-devel
欣喜的看到安装成功了,可是有以前在CentOS6.4
上的惨痛教训,我仍是不敢高兴的太早,至少mysql
先要能运行起来
service mysqld start
而后根据提示,能够执行
mysqladmin -u root password 'new_root_pass' mysql_secure_installation
而后就是少有的顺利安装完成,而后登陆,建立一个数据库和用户并受权,再用新的用户登陆建库,都没有问题.我想应该是OK了
接下来就是nginx
了,官网就有教程教你怎么用yum
安装http://nginx.org/en/linux_packages.html
因而我就照着教程的样子建立了一个/etc/yum.repos.d/nginx.repo
,内容以下:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=1
而后安装、配置、启动、测试都正常经过.按照我"多年"的nginx
使用经验,这个家伙是安装完成了.
接着是Redis
,只有编译安装这一个方法.由于使用的是Spring
框架链接Redis
因此下载了一个Redis-2.8
yum install -y tcl # tcl 是 redis 的依赖,能够经过执行 {redis_home}/runtest 了解 redis 须要安装的依赖 axel -n 5 http://download.redis.io/releases/redis-2.8.24.tar.gz cd /usr/local tar zxf ~/redis-2.8.24.tar.gz mv redis-2.8.24/ redis/ cd redis make make test cd src/ make install
而后在make test
的时候出现了错误
Executing test client: couldn't open socket: host is unreachable. couldn't open socket: host is unreachable while executing
google了很久也没找到解决方案,索性就无论它,直接启动redis-server
,而后使用客户端测试链接,却获得错误
Could not connect to Redis at 127.0.0.1:6379: No route to host
这我就想不通了,可是不要紧,以前那台CentOS6.4
上面还有redis
服务,配置一下防火墙就好了,先测试mysql
乱不乱码要紧.
因而我急匆匆的把代码clone下来,修改一下redis-server
地址就跑起来了.
而后访问一下试试.而后Spring Boot
内置的Tomcat
的数据库链接池就报错了.
java.net.NoRouteToHostException: 没有到主机的路由
此次我就真懵逼了:Mysql
不是在运行吗?不是能连上吗?这怎么就不行了?难道我必须得用Docker
,还要解决daemon
离奇死亡的问题?
咦?Docker
?MySql
?
因而我想到了什么,便在服务器的命令行链接了一次MySql
$ mysql -h 127.0.0.1 -u user -ppassword ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (113)
果真,和redis
遇到的错误是同一个缘由:没法访问127.0.0.1上的服务
我是怎么想到的?
由于我本地的
mysql
是使用docker
运行的,因此我要链接mysql
,访问地址必须得是127.0.0.1
,因此项目的配置就写的127.0.0.1
为何呢?由于
mysql
对localhost
的请求作了优化,直接走socket
的路线,没有经过127.0.0.1
去链接,因此docker
运行的mysql
若是没作sock
文件的映射,是不能经过localhost
访问的.而mysql
客户端默认使用的地址正是localhost
这就是为何一开始我能经过
mysql
命令链接上mysql-server
,而加上-h 127.0.0.1
参数就不行了的缘由.
知道了缘由,那就很好对症下药了.
127.0.0.1
虽然是访问的本机,但实际请求也是会通过网卡(虚拟网卡)的.因此应该是防火墙拦截了个人请求.那么开始与iptables
作斗争吧.
对一个安全菜鸡来讲,搞防火墙是一件须要当心谨慎的事情;但对一个熬夜的菜鸡来讲,理智什么的都已经走远了
这是一开始我看到的iptables
Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9000 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED 3 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) num target prot opt source destination 1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED 2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 3 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited 4 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 Chain OUTPUT (policy ACCEPT) num target prot opt source destination
第一条规则是我设置的,肯定没问题(这时我还保有理智)
第二条什么鬼?删了!
因而一条命令执行出去了
iptables -D INPUT 2
而后这台主机今晚就变成一条废咸鱼了,我也像吃了鲱鱼罐头同样清醒了.
我居然把RELATED
和ESTABLISHED
的链接都给拒绝了!!!
通过半个小时的头(zi)脑(wo)风(feng)暴(ci), 我想起第一台CentOS6.8
的主机,也许我激活一下mysql5.6
还有救
有了前几回的经验总结,这一次搭建变得顺利起来
先是安装MySql
yum-config-manager --disable mysql57-community yum-config-manager --enable mysql56-community yum install -y mysql mysql-server mysql-devel service mysqld start mysqladin -u root password 'new_root_pass' mysql_secure_installation
接下来是Redis
yum install -y tcl axel -n 5 http://download.redis.io/releases/redis-2.8.24.tar.gz cd /usr/local tar zxf ~/redis-2.8.24.tar.gz mv redis-2.8.24/ redis/ cd redis make make test cd src/ make install
对于Redis
还修改了一些默认配置
daemonize yes bind 0.0.0.0 logfile "/var/log/redis.log"
而后使用这个配置文件启动
redis-server /usr/local/redis/redis.conf
而后是Nginx
,先按照官网的方法设置yum
仓库
yum makecache yum install -y nginx service nginx start
这个方法安装的Nginx
是默认开机启动的.测试一下,可以正常运行,而后配置了一下,作了个反向代理绕过跨域,重启.
接着是Java
wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz mkdir /usr/java cd /usr/java tar zxf ~/jdk-8u111-linux-x64.tar.gz echo 'export JAVA_HOME=/usr/java/jdk1.8.0_111' >> /etc/profile echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile source /etc/profile java -version
最后是Gradle
axel -n 5 https://services.gradle.org/distributions/gradle-2.14-bin.zip mkdir /usr/local/gradle cd /usr/local/gradle unzip -q ~/gradle-2.14-bin.zip echo 'export PATH=$PATH:/usr/local/gradle/gradle-2.14/bin' >> /etc/profile source /etc/profile gradle -version
终于,把全部的东西都装好了,赶快把代码拉下来跑一跑,终于没有乱码了,接口都能正常使用.而此时,天都开始亮了..
# 准备下载工具 wget http://ftp.tu-chemnitz.de/pub/linux/dag/redhat/el6/en/x86_64/rpmforge/RPMS/axel-2.4-1.el6.rf.x86_64.rpm yum localinstall axel-2.4-1.el6.rf.x86_64.rpm -y # 安装MySql wget http://dev.mysql.com/get/mysql57-community-release-el6-9.noarch.rpm yum localinstall mysql57-community-release-el6-9.noarch.rpm -y yum replist all | grep mysql yum install yum-utils -y yum-config-manager --disable mysql57-community yum-config-manager --enalble mysql56-community yum install mysql mysql-server mysql-devel -y # 安装Nginx echo -e '[nginx]\nname=nginx repo\nbaseurl=http://nginx.org/packages/centos/6/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo yum makecache yum install nginx -y # 安装Redis yum install -y tcl axel -n 5 http://download.redis.io/releases/redis-2.8.24.tar.gz cd /usr/local tar zxf ~/redis-2.8.24.tar.gz mv redis-2.8.24/ redis/ cd redis make make test cd src/ make install # 安装Java wget --no-check-certificate --no-cookies --header "Cookie: oraclelicense=accept-securebackup-cookie" http://download.oracle.com/otn-pub/java/jdk/8u111-b14/jdk-8u111-linux-x64.tar.gz mkdir /usr/java cd /usr/java tar zxf ~/jdk-8u111-linux-x64.tar.gz echo 'export JAVA_HOME=/usr/java/jdk1.8.0_111' >> /etc/profile echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> /etc/profile echo 'export PATH=$PATH:$JAVA_HOME/bin' >> /etc/profile source /etc/profile java -version # 安装Gradle axel -n 5 https://services.gradle.org/distributions/gradle-2.14-bin.zip mkdir /usr/local/gradle cd /usr/local/gradle unzip -q ~/gradle-2.14-bin.zip echo 'export PATH=$PATH:/usr/local/gradle/gradle-2.14/bin' >> /etc/profile source /etc/profile gradle -version
在CentOS6.4
上面试过Docker
,启动容器后报错,找不到容器
在CentOS6.8
上面,Docker
的守护进程老是过一下子本身就挂掉
第二台CentOS6.8
上面,由于iptables
的配置问题,致使127.0.0.1
没法访问,引发Docker
映射端口没有做用
第二台CentOS6.8
上面使用MySql
的镜像,启动配置MYSQL_ROOT_PASSWORD
环境变量后面的启动配置不能生效
CentOS6默认的yum
安装的MySql
版本是5.1,会出现中文乱码的问题,须要下载mysql57-community-release-el6-9.noarch.rpm来添加yum
源
添加后的仓库默认激活MySql5.7
,CentOS6
并不支持,须要激活MySql5.6
enable与disable哪一个包可使用yum-config-manager
进行配置,这个命令包含在yum-utils
包中,可经过yum
安装
如今的主机默认localhost
会解析到127.0.0.1
,而127.0.0.1
会发送到环回的虚拟网卡,回到主机上
MySql
是个特立独行的家伙,默认的mysql
链接会访问localhost
,但不会映射到127.0.0.1
上,而是访问配置文件中描述的sock
文件,不会经历网络层的传输
127.0.0.1
虽然不会离开主机,但也会通过网卡(虽然是虚拟的),因此也会收到iptables
的影响
不要随意删除iptables
里面的规则,不然真的会后悔的
linux
上的命令行多线程下载工具:axel
,地址:https://pkgs.org/centos-6/repoforge-x86_64/axel-2.4-1.el6.rf.x86_64.rpm.html
nginx
可经过yum
下载最新稳定版:http://nginx.org/en/linux_packages.html
在旧的发行版上安装mysql
,优先考虑更新源,而不是下载安装包
在旧的发行版上,就不要尝试docker
了,遇到坑伤不起
更新你的服务器,大清亡了