最近一個項目要上線了,須要搭服務器,原本是交給同窗搭的,結果遇到了大坑,還得本身來,今天把這些坑記一下.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
了,遇到坑傷不起
更新你的服務器,大清亡了