Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[筆記]部署 AWS EC2 虛擬主機 + Ubuntu LAMP 環境 + phpmyadmin #31

Open
enter3017sky opened this issue Dec 17, 2018 · 3 comments

Comments

@enter3017sky
Copy link
Owner

enter3017sky commented Dec 17, 2018

部署 AWS EC2 虛擬主機 + Ubuntu LAMP 環境 + phpmyadmin

主要參考這兩個同學的筆記
一小時完成 VPS (Virtual Private Server) 部署
部署 AWS EC2 遠端主機 + Ubuntu LAMP 環境 + phpmyadmin

AWS EC2 跟 ubuntu 環境都建立好了之後。

在 CLI 登入雲端虛擬主機

  • 在 AWS EC2 的 Instance 的畫面,如圖所示上面的 Connect,可以直接複製指令。
    • ssh -i ~/.ssh/awsKey.pem ubuntu@ec2-xx-xxx-xxx-xx.ap-northeast-1.compute.amazonaws.com
  • 也可以自己打簡短的 IP
    • ssh -i ~/.ssh/awsKey.pem ubuntu@IP(public)

image

  • 允許使用 PHP Short tag,輸入 sudo vim /etc/php/7.2/apache2/php.ini
    • 如果用vim,按/輸入關鍵字,按n查找下一個,`找到 short_open_tag = 改成 ON
  • 離開 vim 編輯器(權限問題無法編輯文件):輸入 q! 指令強制離開。

MySQL 設定時區

  • 登入 VPS 後
  • 先找到檔案 locate my.cnf
  • root 權限用 vim 開啟檔案 sudo vim /etc/mysql/my.cnf
  • 找到[mysqld],在下面增加設定值 default-time-zone = '+8:00'
  • ESC->:wq 存檔離開。

參考資料:修改 MySQL 時區

在 CLI 操作 MySQL

  • 登入資料庫 mysql -u root -p

  • 如果已經用 sudo -isudo -u登入 root 的話,不需要指定使用者,直接mysql -p後輸入密碼登入。

  • 不登入查詢資料庫

    • 顯示 MySQL 伺服器中資料庫資訊:mysqlshow -h localhost -u root -p
    • 顯示每個資料表中的資料的行數: mysqlshow -h localhost -u root -p --count
    • root 顯示 MySQL 伺服器中資料庫資訊:mysqlshow -p
    • root 顯示每個資料表中的資料的行數: mysqlshow -p --count
  • 說明

    • -h: 指定資料庫伺服器的主機名稱或 IP
    • -u: 連接資料庫伺服器的使用者名稱
    • -p: 連接資料庫伺服器的使用者密碼

在 MySQL 的 CLI 上使用

  1. 資料庫基本操作

    • 建立資料庫:create database your_database_name;
    • 顯示所有資料庫:show databases;
    • 刪除資料庫:drop database your_database_name;
    • 使用/選擇資料庫:use your_database_name;
  2. 選擇資料庫 USE your_database 之後。

    • 顯示資料表:show tables
    • 列出資料表欄位資訊: describe your_table_name
  3. 就可以操作 CRUD 相關指令

用 FileZilla 連接 EC2

  1. 打開 FileZilla 的"編輯" -> "設置" 對話框,在左邊的“選擇頁面” 選擇“SFTP”, 右邊點擊“添加密鑰文件...” 按鈕,導入Amazon給的密鑰文件。
  2. 打開“文件”-> “站點管理器” , 點擊左邊的“新站點”按鈕, 在右邊“常規”標籤中填入主機信息(即AWS Console中 的 Public DNS)
  • "協議"中選"SFTP - SSH FileTransfer Protocol" ,
  • “登錄類型” 選“交互式”
  • “用戶” 中輸入用戶名(注意不能用默認的匿名用戶)
  1. 點“連接”。完成。

參考資料:用 FileZilla 連接 EC2

AWS EC2 設置固定IP地址

  • 進入EC2控制面板,進入左側下方的“Elastic IPs”,
  • 點擊“Allocate New Address”申請一個固定的IP地址。
  • 選中IP地址,點擊“Associate Address”,然後選擇要使用的EC2主機即可。
  • 注意:不要申請IP後閒置(不綁定到雲主機),可能被收取額外費用。

參考資料:
(AWS EC2) Service for EC2 指定固定IP及釋放IP
Amazon EC2防止被扣费的方法

使用 SSH 設定檔簡化指令與連線網址:

指令列都要打長長的一串,ip 還可能忘記,所以想到用別名的方式去改善

  1. 首先,在 ~/.ssh 下新增 config 檔案
  • 在 CLI 輸入 vim ~/.ssh/config
    • info: ~/ : 用戶根目錄。ex./Users/enter3017sky
  1. 設定 ssh config
    image

  2. 開始使用 alias 連線

參考資料:

ssh_config(5):OpenSSH SSH客戶端配置文件 - Linux手冊頁
增進 SSH 使用效率 - ssh_config
Using an SSH Config File - Media Temple
使用 SSH config 文件


故障排除

Ubuntu 下 phpMyAdmin 的 404 Not Found 頁面

  1. 方法1:(我用這個解決的)
  1. 方法2:
# link configure file to apache
$ sudo ln -s /etc/phpmyadmin/apache.conf /etc/apache2/conf.d/phpmyadmin.conf
# restart apache
$ sudo /etc/init.d/apache2 restart
  1. 方法3: 關於phpmyadmin的問題
  • 重新設定你的「phpmyadmin」: sudo dpkg-reconfigure phpmyadmin

參考資料:
解決 Ubuntu 下 phpMyAdmin 的 404 Not Found 頁面 - kuoe0's dots
鏈結檔案 ln 指令


phpmyadmin 一直出現錯誤訊息

參考資料:

大家來學VIM(一個歷久彌新的編輯器)[六]
阿旺的 Linux 開竅手冊
Linux常用指令整理

設定留言參考資料:
How To Install Linux, Apache, MySQL, PHP (LAMP) stack on Ubuntu 18.04
45 How To Install and Secure phpMyAdmin on Ubuntu 18.04
How to Install a LAMP Stack on Ubuntu 18.04
How to setup Linux, Apache, MySQL, PHP (LAMP) Stack on Ubuntu 16.04
ubuntu 默認防火牆安裝、啟用、查看狀態ufw

@enter3017sky
Copy link
Owner Author

enter3017sky commented Dec 17, 2018

錯誤訊息:ERROR 1364 (HY000): Field 'xxx' doesn't have a default value

  1. 初次排除:雲端虛擬主機部署完成之後,首先當然是放些東西確認看看。後來發現留言板編輯、刪除、更新都正常。但是新增留言就是 sql fail,最後在 add_comments.php 裡面用 var_dump($variable)印出有嫌疑的變數,發現 if($stmt->execute()) 的結果是 false,然後最後 $conn->error 印出 General error: 1364 Field 'user_ID' doesn't have a default value,發現 user_id 沒有用到,phpmyadmin 裡面與沒有設定預設值,但這個也蠻奇怪的,在自己的伺服器跟mentor 的伺服器都沒遇到,或許有設定配置的問題。最後在 phpmyadmin 直接設定預測值為 null,就正常運作了。

  2. 第二次解決:後來在 CLI 練習指令的時候,又發現了這個問題 insert into時,如果某個值沒放輸入又沒預設值,就會跳 ERROR。然後找到了,原來 sql_mode 是嚴格模式的關係。

取消 mysql 的 strict mode 模式:

  1. SSH 連線到伺服器的 root,輸入sudo vim /etc/mysql/conf.d/disable_strict_mode.cnf,以新增並建立一個 disable_strict_mode.cnf 檔案,

  2. 輸入

[mysqld]
sql_mode=IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
  1. 輸入指令重新啟用 mysql :sudo service mysql restart

為了確認strict mode模式是不是已經被關閉了,可以在 phpMyAdmin 的 sql 中輸入 SELECT @@GLOBAL.sql_mode 進行測試
如果顯示 IGNORE_SPACE,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FO 則表示 strict mode 模式已經被關閉。

參考資料:關閉Ubuntu預設mysql5.7版的strict mode設定方法(嚴格模式)

@enter3017sky
Copy link
Owner Author

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111)

@enter3017sky
Copy link
Owner Author

再次相遇 ERROR 2002 (HY000)

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock' (2)

  • 看系統日誌(參考這篇):sudo vim /var/log/syslog 之後,才發現問題是出現想解決「伺服器開啟含有中文字的檔案(.js, .md)會亂碼」的問題時,在 vim /etc/mysql/my.cnf 加上的參數 default-character-set=utf8
    • [ERROR] unknown variable 'default-character-set=utf8'
      image
  • 然後就解決了第一個問題:mysql 沒反應
    • Job for mysql.service failed because the control process exited with error code.
      See "systemctl status mysql.service" and "journalctl -xe" for details.

      image
  • 過程中參考了很多處理的方式,而在搞不清楚設定的幹嘛用的情況,先恢復原狀吧!
  • 最後在 vim /etc/mysql/my.cnf 裡面關於 [mysqld] 的配置,恢復配置後解決最後一個 ERROR 2002 的問題
### note
[mysqld]
# 會出現錯誤
# bind-address = ec2_public_IP

# 最後註解下行就解決了 ERROR 2002
# socket=/var/lib/mysql/mysql.sock

參考資料


用以下的方式啟動、停止、重啟 ubuntu mysql 會完整的訊息。

  • On Linux start/stop/restart from the command line:
/etc/init.d/mysqld start
/etc/init.d/mysqld stop
/etc/init.d/mysqld restart
# or
/etc/init.d/mysql start
/etc/init.d/mysql stop
/etc/init.d/mysql restart
# 像這樣
[ ok ] Starting mysql (via systemctl): mysql.service.
[ ok ] Stopping mysql (via systemctl): mysql.service.
[ ok ] Restarting mysql (via systemctl): mysql.service.
  • systemctl start|stop|restart mysql.service 這種類型的就不會顯示

參考資料:


更改 ubuntu 系統時間、 mysql error.log 時間

  1. 更改成台北時間: timedatectl set-timezone Asia/Taipei
  2. 用 timedatectl 指令檢查時區是否設定正確: timedatectl
  3. date 再確認一次

查看 log 的方式

  • tail -(筆數, 數字) 檔案名稱
    範例:查看 mysql 最後十筆錯誤訊息tail -10 /etc/log/mysql/error.log

  • You can view log files that are compressed.
    zcat /var/log/mysql/error.1.gz | more

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant