服務器配置小記

最近一個項目要上線了,須要搭服務器,原本是交給同窗搭的,結果遇到了大坑,還得本身來,今天把這些坑記一下.html

服務器有好幾臺,都是CentOS6.X,兩臺6.8,一臺6.4.java

項目須要的環境是Java+Gradle+MySql+Redis+Nginxmysql

在CentOS6.4上的折騰

關於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

在第一臺CentOS6.8上的折騰

因此我決定換一臺服務器,從頭再來.還好實驗室服務器多,夠我折騰

先來折騰MySql

基於在上一臺服務器上的慘痛教訓,此次我決定先裝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也要安裝一下

而後安裝MySqlyum源並安裝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.iodocker鏡像,這裏也使用這個安裝

curl -sSL https://get.daocloud.io/docker | sh
chkconfig docker on
servcie docker start

而後拉取MySql的鏡像、運行,一切正常.而後拉取redisnginx,若是一切正常的話,很快就能搞定了.

然而可怕的狀況出現了,拉取過程掛掉了... 因而查看docker守護進程,發現守護進程居然掛掉了!我但是什麼都沒作啊!並且三更半夜,誰會和我一塊兒搞服務器?!

對於這種莫名的緣由,我感受非常懼怕.由於以前這臺主機是被動過的,因此我不知道是否是別人動過什麼.決定再換一臺沒動過的主機來搞.

在第二臺CentOS6.8上的折騰

我沒有在這臺主機上嘗試docker,我已經不信任在CentOS6.X環境中的docker了,直接來安裝MySql

仍是先來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了

用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

爲何呢?由於mysqllocalhost的請求作了優化,直接走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

而後這臺主機今晚就變成一條廢鹹魚了,我也像吃了鯡魚罐頭同樣清醒了.

我居然把RELATEDESTABLISHED的鏈接都給拒絕了!!!

通過半個小時的頭(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]\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

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裏面的規則,不然真的會後悔的

tips

相關文章
相關標籤/搜索