CentOS 7 安裝 Apache+PHP 7+MySQL+phpMyAdmin+FTP+SSH

2018/08/29 10:23 更新 MySQL 密碼說明的部分

進入系統時,先不要進行 yum update 更新套件指令,因為一旦更新,後續的安裝怕有依賴上的問題產生。建議等所有系統都安裝無誤以後,再回來執行 yum update。

  • 目前發現先 yum update 以後再安裝 MySQL 8.0 會造成預設密碼怎樣也無法登入的狀況

安裝 EPEL

這款套件管理提供各種企業級的 Linux 一些額外的高品質套件 (參考)

rpm -Uvh https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -Uvh https://mirror.webtatic.com/yum/el7/webtatic-release.rpm

安裝 VIM

yum -y install vim

關閉 SELinux

為了避免權限問題,我們先把 SELinux 關閉

setenforce 0
vim /etc/sysconfig/selinux
SELINUX=disabled

安裝 MySQL 8

參考網友

因為 8 出來了很不棒,所以放棄 MariaDB 囉!啟用 MySQL 的 YUM Repository 後,預設會讓 yum 安裝 MySQL 5.7,如要安裝 MySQL 8,需要加入 “–enablerepo=mysql80-community”

rpm -Uvh https://repo.mysql.com/mysql57-community-release-el7-11.noarch.rpm
yum -y --enablerepo=mysql80-community install mysql-community-server
systemctl start mysqld.service

安裝時 MySQL 會自動替 root 添加亂數密碼,所以我們要查詢自動產生的密碼

vim /var/log/mysqld.log

看到這行

[Server] A temporary password is generated for root@localhost: Wh(/Pw.od5&V

這個 Wh(/Pw.od5&V 就是自動產生給我的密碼,當然你的這組密碼也會不同。接著必須要修改 MySQL 新密碼 (參考),我們可以參考官方,這邊簡單看過下方列出的三種政策要求 (參考)

Policy Tests Performed
0 or LOW 長度
1 or MEDIUM 長度; 數字、大小寫、特殊字元
2 or STRONG 長度; 數字、大小寫、特殊字元、字典檔路徑
重要!如果你打算使用 phpMySQL 請這樣改密碼

MySQL 8.0 預設使用 caching_sha2_password 認證密碼,但是 PHP 7.2 尚不支援這是關鍵(參考),開發人員表示目前無能為力,不過也提到 PHP 正在開發支持這項功能,一旦 PHP 支持以後 phpMyAdmin 也將會跟進修正。所以現下我們若要使用 phpMyAdmin (PHP 開發的嘛…) 則必須修改 MySQL 的認證模式為 mysql_native_password

vim /etc/my.cnf
[mysqld]
default-authentication-plugin=mysql_native_password
systemctl start mysqld.service

我們登入 mysql

mysql -u root -p
Wh(/Pw.od5&V <--這是剛剛的密碼

接著我們不管下什麼指令都會被要求要修改密碼。我們先修改密碼再來解釋

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'a_A@123456';

我設定的密碼使用 a_A@123456 是有原因的,因為當我們查看當前驗證密碼政策 validate_password.policy,才知道密碼有什麼必須要求。進入 mysql 下指令後會看到這張表

mysql> SHOW VARIABLES LIKE 'validate_password.%';
+--------------------------------------+--------+
| Variable_name                        | Value  |
+--------------------------------------+--------+
| validate_password.check_user_name    | ON     |
| validate_password.dictionary_file    |        |
| validate_password.length             | 8      |
| validate_password.mixed_case_count   | 1      |
| validate_password.number_count       | 1      |
| validate_password.policy             | MEDIUM |
| validate_password.special_char_count | 1      |
+--------------------------------------+--------+
  • policy:政策的程度叫做 MEDIUM (預設)
  • length:必須要的長度是 8 個字
  • mixed_case_count:必須要 1 個小寫 1 個大寫
  • number_count:必須要 1 個數字
  • special_char_count:必須要 1 個特殊符號
但如果你沒使用 phpMySQL 請這樣改密碼
mysql> ALTER USER USER() IDENTIFIED BY 'a_A@123456';

因為沒有 PHP 支援的問題,所以用預設 caching_sha2_password 認證就好。

關於 MySQL 8 的 Password Validation 元件(可跳過)

看下面這個報錯的範例

mysql> ALTER USER USER() IDENTIFIED BY 'abc';

會顯示「ERROR 1819 (HY000): Your password does not satisfy the current policy requirements」,官方說這是因為原始密碼值 ‘abc’ 不可被檢查所以會報錯,因此我們要寫 hash 過後的值,也就是下方的 “*0D3CED9BEC10A777AEC23CCC353A8C08A633045E”

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password AS '*0D3CED9BEC10A777AEC23CCC353A8C08A633045E';

這樣就成功更改了,我們重新啟動後密碼用 abc 登入看看

exit
systemctl restart mysqld.service
mysql -u root -p

不過這是透過原始 hash 值來設定,我們當然不知道我們設定的密碼 hash 值是多少。所以還是使用 validate_password.policy 的規範來設置吧!(這段參考自官方)

安裝 MariaDB (目前不推薦)

雖然 MariaDB 成為 CentOS 預設,但現在 MySQL 8 出來了效能大幅提升,所以建議改用 MySQL 8 囉!

yum -y install mariadb-server mariadb
systemctl start mariadb.service
systemctl enable mariadb.service

如果出現這樣的錯誤,那就重開 Linux 吧,比較快…

Another app is currently holding the yum lock; waiting for it to exit...
  The other application is: PackageKit
    Memory : 136 M RSS (1.5 GB VSZ)
    Started: Tue Dec  8 01:09:47 2015 - 01:21 ago
    State  : Uninterruptible, pid: 12947

最後設定 MySQL 安全程序,如 root 是否要設定帳號密碼,會利用詢問回答的方式進行。

mysql_secure_installation

安裝 Apache

yum -y install httpd
systemctl start httpd.service
systemctl enable httpd.service
firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload

查看 localhost 就會出現畫面了。讓 Apache 可以支援 .htaccess ,須要把 AllowOverride 的功能開啟。如使用框架 Codeigniter 就須要設定。

vim /etc/httpd/conf/httpd.conf

因為我的網頁預設在

DocumentRoot "/var/www/html"

所以將 None 修改為 All

<Directory "/var/www/html">
    AllowOverride All
</Directory>

重新啟動

systemctl restart  httpd.service
虛擬主機 VirtualHost 設定

如果我要建立新網站 IP:8089,並指向路徑 /var/www/html/website2.com,那麼先在 /etc/httpd/conf/httpd.conf 監聽 8089

Listen 80
Listen 8089 <-- 這裡加入監聽

建議一個網站,就新增一個設定檔,所以 website2.com 那就建立 /etc/httpd/conf.d/website2.com.conf

<VirtualHost *:8089>
    DocumentRoot /var/www/html/website2.com
    <Directory "/var/www/html/website2.com">
        AllowOverride All
    </Directory>
</VirtualHost>

最後防火牆開啟 8089

firewall-cmd --permanent --add-port=8089/tcp
sudo firewall-cmd --reload
systemctl restart httpd.service

參考


安裝 PHP (v7.2)

要尋找所有套件可以使用

yum search php72w | more

我們安裝這些套件

yum -y install mod_php72w php72w-cli php72w-common php72w-gd php72w-imap php72w-ldap php72w-mbstring php72w-mysql php72w-pdo php72w-pear php72w-xml php72w-xmlrpc

php 根目錄會在 /var/www/html ,接著調整 PHP 的常用設定

vim /etc/php.ini

參考這篇修改php.ini

重新啟動

systemctl restart httpd.service

日後擴充 PHP 掛件,可使用 『yum -y install 名稱』


安裝 Composer

為了使用最新的 phpMyAdmin 解決許多老舊 bug ,我需要使用 Composer 下載,因此我們先安裝。

  1. 複製安裝文件 PHP 檔案
  2. 認證下載的文檔是否正確 (我直接跳過,因為要打 hash 太長串…..XD)
  3. 執行安裝 composer
  4. 移除安裝文件
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === 'c32408bcd017c577ce80605420e5987ce947a5609e8443dd72cd3867cc3a0cf442e5bf4edddbcbe72246a953a6c48e21') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

完成以後,我們要放到全域環境,這樣才能讓任何專案無須從新安裝 composer。記得 Composer 限制不可在最高權限 root 中執行。

mv composer.phar /usr/local/bin/composer

參考網友


安裝 phpMyAdmin

因為 CentOS 上的 phpMyAdmin 都是支援舊版的 PHP 5,目前找不到 yum 方式可以安裝最新版本,所以我們使用 phpMyAdmin 其中一項的建議透過 composer 安裝。

1. CentOS 使用 yum 會安裝出現衝突 (這部分就不建議了,參考方法 2)

目前會造成 php72w-common conflicts with php-common-5.4.16-36.3.el7_2.x86_64 的衝突,暫時無解,若有好方法歡迎告知 : )

yum -y install phpMyAdmin

透過 vi 指令修改

vim /etc/httpd/conf.d/phpMyAdmin.conf
#<Directory /usr/share/phpMyAdmin/>
#   <IfModule mod_authz_core.c>
#     # Apache 2.4
#     <RequireAny>
#       Require ip 127.0.0.1
#       Require ip ::1
#     </RequireAny>
#   </IfModule>
#   <IfModule !mod_authz_core.c>
#     # Apache 2.2
#     Order Deny,Allow
#     Deny from All
#     Allow from 127.0.0.1
#     Allow from ::1
#   </IfModule>
#</Directory>

修改成

<Directory /usr/share/phpMyAdmin/>
        Options none
        AllowOverride Limit
        Require all granted
</Directory>

接著再修改

vim /etc/phpMyAdmin/config.inc.php

將 $cfg[‘Servers’][$i][‘auth_type’] 改為使用 http 的方式

$cfg['Servers'][$i]['auth_type'] = 'http'; // Authentication method (config, http or cookie based)?

重新啟動伺服器

systemctl restart  httpd.service
2. 用 composer 下載 (建議,因為版本最新,解決許多問題)

由 root 更改權限給使用者,如我的帳號叫 jason

chown -R jason:jason /var/www/html
chmod 777 /var/www/html  <-- 提供寫入權限給 composer 建立路徑

因為是使用 composer 手動安裝,所以未來更新 phpMyAdmin 也只能透過 composer 而無法透過 yum 了,這點要注意。參考 phpMyAdmin 官網 安裝

cd /var/www/html
composer create-project phpmyadmin/phpmyadmin

網址打上就可以進入,預設使用 MySQL 帳號登入。詳細設定檔可參考 /var/www/html/phpmyadmin/libraries/config.default.php (千萬不要直接修改)。

如果遇到了 Authentication plugin ‘caching_sha2_password’ cannot be loaded 問題,請參考我上述 MySQL 修改密碼的方法。

接著我們複製預設的範例來製作設定檔

cp -i /var/www/html/phpmyadmin/config.sample.inc.php /var/www/html/phpmyadmin/config.inc.php
vim /var/www/html/phpmyadmin/config.inc.php
登入方式有兩種:
1. 若要由 Web 登入

指定 blowfish_secret 密碼要 32 個字。auth_type 使用 cookie。

$cfg['blowfish_secret'] = '1{dd0`<Q),5XP_:R9UK%%8\"EEcyH#{o'; 
$cfg['Servers'][$i]['auth_type'] = 'cookie';

$cfg['TempDir'] = '/tmp'; <-- 自行添加可解決錯誤
2. 若要自動登入

不安全但很方便,建議僅在開發時使用,若為 config 則務必要指定 user、password。網址進入 phpmyadmin 就不需要輸入帳號密碼,當然也無法登出。

/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'config';
$cfg['Servers'][$i]['user'] = 'root';
$cfg['Servers'][$i]['password'] = '1234';

接著匯入 phpmyadmin 的設定資料庫,這樣我們在修改 phpmyadmin 的時候才能儲存設定

mysql -u root -p < /var/www/html/phpmyadmin/sql/create_tables.sql
ifconfig (可查看 ip)

從網址連進 http://xxx.xxx.xxx.xxx/phpmyadmin/ 以後,應該就會看到資料庫多出 phpmyadmin 。這可以解決「尚未設定 phpMyAdmin 設定儲存空間,部份延伸功能將無法使用。」的問題。


建立FTP

yum -y install vsftpd
vim /etc/vsftpd/vsftpd.conf

透過 vi 修改為

anonymous_enable=NO

接著下指令

systemctl restart vsftpd
systemctl enable vsftpd
firewall-cmd --permanent --add-port=21/tcp
firewall-cmd --reload

啟動FTP

firewall-cmd --permanent --zone=public --add-service=http
firewall-cmd --permanent --zone=public --add-service=https 
firewall-cmd --reload
firewall-cmd --permanent --add-port=21/tcp 
firewall-cmd --permanent --add-service=ftp 
firewall-cmd --reload

設置家目錄

setsebool -P tftp_home_dir on
setsebool -P ftpd_use_passive_mode  1
setsebool -P ftpd_anon_write  1
setsebool -P ftpd_full_access  1
setsebool -P httpd_can_network_connect on    (要設定這個,才能透過smtp.gmail.com寄信)
service vsftpd restart

接著就可以使用 Linux 原本系統已存在的使用者做登入。但是 root 預設不可登入

這時 Linux 預設的路徑可以看到整個系統,我們希望做一些限制,例如只能限制在 /var/www/html。

  1. 先修改使用者的家目錄
    usermod -m -d /var/www 你的使用者名稱
  2. 不可離開家目錄
    vim /etc/vsftpd/vsftpd.conf

    修改以下為開啟

    chroot_local_user=YES    是否要將使用者限制在自己的家目錄之內(chroot)
    chroot_list_enable=YES   是否啟用 chroot 寫入列表的功能?與底下的 chroot_list_flie 有關
    chroot_list_file=/etc/vsftpd/chroot_list 如果 chroot_list_enable=YES 那麼就可以設定
    allow_writeable_chroot=YES <-- 非常重要,文件裡沒有這行請自行添加
    

    因為 vsftp 安全設定不允許你的家目錄有寫入權限,所以必須添加允許可寫入(參考網友)。在檔案中添加『不會被限制在家目錄的使用者』,如果沒有就保持空白

    vim /etc/vsftpd/chroot_list

    使用者帳號的添加,一行一個。這樣 tom 跟 jason 都不會被限制在家目錄。

    tom
    jason
    service vsftpd restart
    
  3. 修改 /var/www/html 擁有人與群組
    因為 /var/www/html 預設屬於 root,我們要修改為 FTP 登入的使用者,這樣這個使用者才可以進行上傳、修改、刪除。詳細參考

    chown -R jason:jason /var/www/html (chown [-R] 帳號名稱:群組名稱 檔案或目錄)

SSH

yum -y install openssh
cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
vim /etc/ssh/sshd_config

修改一些參數

Port 8022 // 更改 SSH Port 22 為其他 Port (防止掃瞄Port)
PermitRootLogin no // 不允許 root 登入 SSH
AllowUsers jason nana // 指定可以登入 SSH 的帳號,若有多個帳號可以登入,就用空格隔開
systemctl restart sshd.service
systemctl enable sshd.service
firewall-cmd --permanent --zone=public --add-port=8022/tcp
firewall-cmd --reload

檢測是否開啟 port

netstat -ant | grep :8022

參考網友

Comments

  1. 關於完整替代的部分 … 請問MariaDB如何操作使用 ?
    phpMyAdmin過去都可以用web的方式管理資料庫 ~
    一樣有套件可以抓嗎 ?

    • 基本上操作起來完全跟 MySQL 一樣喔!只是基底核心不一樣,仍然可以透過 phpMyAdmin 操作資料庫喔

  2. Tai-Shun Huang
    2016-05-18 - 10:59

    哇 每次搜尋php相關的東西 中文的 都會出現你的網站耶!!!

  3. 好讚,搜了好多教程都安裝不成功,一大堆問題,用這個直接一部成功
    能不能寫一篇文章,關於centos7下如何同時安裝php7和php5.6,具體怎麼去配置

  4. 安裝 PHP (v7.2)->我們安裝這些套件 裡面有個php72w-idap是php72w-ldap嗎?

  5. 有在國外查到說webtatic這個repo可能造成衝突,所以試著把remi跟remi-php72以外的repo通通禁用後yum clean all 在 yum install phpmyadmin就成功了,沒有再跳出衝突

發表迴響