摘要:最近一個項目要上線了需要搭服務器本來是交給同學搭的結果遇到了大坑還得自己來今天把這些坑記一下服務器有好幾臺都是兩臺一臺項目需要的環境是在上的折騰關于的折騰我通過官網下載的源安裝的在的系統上執行沒有遇到任何依賴錯誤于是順利安裝然后啟動服務
最近一個項目要上線了,需要搭服務器,本來是交給同學搭的,結果遇到了大坑,還得自己來,今天把這些坑記一下.
服務器有好幾臺,都是CentOS6.X,兩臺6.8,一臺6.4.
項目需要的環境是Java+Gradle+MySql+Redis+Nginx
在CentOS6.4上的折騰 關于Mysql的折騰我通過MySql官網下載的yum源安裝的MySql,在CentOS6.4的系統上執行
yum install mysql mysql-server mysql-devel
沒有遇到任何依賴錯誤,于是順利安裝,然后啟動服務
servcie mysqld start
但是得到了失敗的結果.于是查看配置文件,找到日志,發現了如下錯誤信息
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的版本,導入建庫語句,沒有錯誤產生,暗道慶幸,還以為是自己多慮了.
然而,等我放入數據之后,該來的還是來了.
我在本地開發環境中是用的是docker(后面會講為什么不在服務器上用docker)拉取的MySql5.7,本地測試一切正常.然后放到服務器上,當我查詢一個中文的記錄的時候,殺機終于顯現——亂碼啦
作為一個對自己代碼擁有充分自信的家伙,怎么能是我的問題呢,都怪MySql的版本太低太弱智.
在第一臺CentOS6.8上的折騰所以我決定換一臺服務器,從頭再來.還好實驗室服務器多,夠我折騰
先來折騰MySql基于在上一臺服務器上的慘痛教訓,這次我決定先裝MySql.
首先確定發行版本
$ cat /etc/issue CentOS release 6.8 (Final) Kernel 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
莫名掛掉的Docker我平常使用的是daocloud.io的docker鏡像,這里也使用這個安裝
curl -sSL https://get.daocloud.io/docker | sh chkconfig docker on servcie docker start
然后拉取MySql的鏡像、運行,一切正常.然后拉取redis和nginx,如果一切正常的話,很快就能搞定了.
然而可怕的情況出現了,拉取過程掛掉了... 于是查看docker守護進程,發現守護進程竟然掛掉了!我可是什么都沒做啊!而且三更半夜,誰會和我一起搞服務器?!
對于這種莫名的原因,我感覺很是害怕.因為之前這臺主機是被動過的,所以我不知道是不是別人動過什么.決定再換一臺沒動過的主機來搞.
在第二臺CentOS6.8上的折騰我沒有在這臺主機上嘗試docker,我已經不信任在CentOS6.X環境中的docker了,直接來安裝MySql吧
還是先來MySql這次我找到了這篇文章https://segmentfault.com/a/1190000003049498
什么,竟然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了
用yum安裝Nginx-1.10.2接下來就是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--異常初現接著是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還有救
回到第一臺CentOS6.8的再次折騰有了前幾次的經驗總結,這一次搭建變得順利起來
順利安裝MySql先是安裝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
接下來是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
然后是Nginx,先按照官網的方法設置yum倉庫
yum makecache yum install -y nginx service nginx start
這個方法安裝的Nginx是默認開機啟動的.測試一下,能夠正常運行,然后配置了一下,做了個反向代理繞過跨域,重啟.
安裝Java接著是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
最后是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] name=nginx repo baseurl=http://nginx.org/packages/centos/6/$basearch/ gpgcheck=0 enabled=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坑 Docker的莫名錯誤
在CentOS6.4上面試過Docker,啟動容器后報錯,找不到容器
在CentOS6.8上面,Docker的守護進程總是過一會兒自己就掛掉
第二臺CentOS6.8上面,因為iptables的配置問題,導致127.0.0.1無法訪問,引起Docker映射端口沒有作用
第二臺CentOS6.8上面使用MySql的鏡像,啟動配置MYSQL_ROOT_PASSWORD環境變量后面的啟動配置不能生效
MySql的安裝中的坑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&iptables現在的主機默認localhost會解析到127.0.0.1,而127.0.0.1會發送到環回的虛擬網卡,回到主機上
MySql是個特立獨行的家伙,默認的mysql連接會訪問localhost,但不會映射到127.0.0.1上,而是訪問配置文件中描述的sock文件,不會經歷網絡層的傳輸
127.0.0.1雖然不會離開主機,但也會經過網卡(雖然是虛擬的),所以也會收到iptables的影響
不要隨意刪除iptables里面的規則,否則真的會后悔的
tipslinux上的命令行多線程下載工具: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了,遇到坑傷不起
更新你的服務器,大清亡了
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/39386.html
摘要:描述由于馬上要做一波公眾號開發,今天先調研,把基本的服務器接起來。手腳架地址文檔微信公眾號公眾號開發首先你要有個公眾號,這里就不說了按照流程申請。腳手架的說明微信公眾號接入的時候要做很多事情,為了簡化開發,提供一個版本的服務器。 描述 由于馬上要做一波公眾號開發,今天先調研,把基本的服務器接起來。微信公眾號服務器在接入的時候要做一些煩躁的事情,改配置的時候要進行握手,api調用要做一些...
摘要:我接觸已經很久了,其中微信的就是我貢獻的代碼,然而當時做的時候比較年輕,而且這個項目處于一個很大的代碼重構中,借這次機會重新用正確的姿勢接入了一下三方登錄,可以當做一個學習接入三方的。 為什么要接入三方登錄 如果你的微信服務器要做復雜的邏輯,比如html5、給用戶提供高級的服務,并且有很好看的頁面等等,這種時候你就需要一個正常的web服務器,用戶打通就需要做三方登錄了。 而如果你決定直...
摘要:引言學生管理系統昨日正式上線測試,上線遇到的問題不少,但最后都完美解決了。前臺上線,瀏覽器端訪問服務器卻得到了,查看相關日志后發現是訪問文件時遭到了拒絕。不足當時忙著上線,中默認也啟用了路由,就以為路由是正統的解決方案。 引言 Alice學生管理系統昨日正式上線測試,上線遇到的問題不少,但最后都完美解決了。 特此分享,一起爬坑。 項目優化 登錄頁美化 原來的登錄頁采用的是黑背景,經過大...
摘要:前段時間為了抓取網絡文本數據,申請了騰訊云學生機,用的框架弄了一段時間。這個用戶既是不可登錄的操作系統用戶,也是數據庫用戶。設置數據庫用戶密碼為了能夠讓和數據庫相連接,需要設置數據庫用戶密碼。 打讀研之后,更加關注算法的學習,Web開發這一塊便落下了,平時也通過微信公眾號關注了些,常常感慨,技術的更迭真是日新月異。 前段時間為了抓取網絡文本數據,申請了騰訊云學生機,用Python的Sc...
摘要:前段時間為了抓取網絡文本數據,申請了騰訊云學生機,用的框架弄了一段時間。這個用戶既是不可登錄的操作系統用戶,也是數據庫用戶。設置數據庫用戶密碼為了能夠讓和數據庫相連接,需要設置數據庫用戶密碼。 打讀研之后,更加關注算法的學習,Web開發這一塊便落下了,平時也通過微信公眾號關注了些,常常感慨,技術的更迭真是日新月異。 前段時間為了抓取網絡文本數據,申請了騰訊云學生機,用Python的Sc...
摘要:微信在做一些操作是需要用到生成二維碼等而每天接口的調用上限為,需要自己做緩存文檔講了幾種方式,我覺得放在中拿比較妥當。微信菜單會緩存分鐘,你可以取消關注,然后在關注查看菜單變化效果。 描述 微信公眾號開發基本分為2大種類型 1.用戶直接做了某些操作(回復信息、訂閱、掃碼、發語音、點按鈕等),此時這些信息微信會發送到微信服務器的80端口,這是一種開發類型;2.通過連接(按鈕、文章)引導用...