在 Ubuntu Server 安裝 Apache + MariaDB + PHP

RedHat / CentOS 系列小差異說明

特別先提醒一下,和 RedHat / CentOS 系列的 Apache 管理不大一樣,在 RedHat / CentOS 平台中要啟用特定的模組,只要安裝好對應的模組套件,再重新啟用 httpd 服務即可。

但是在 Ubuntu Server 中,除了要安裝對應的模組套件外,要額外使用 a2emod 指令來指用模組,並重新啟用 Apache 服務才可啟用,不然會發生明明就裝了模組但是一定沒有啟用對應功能的情況,這部份後續會再介紹其使用方式。

安裝指令說明

  • sudo(substitute user [或 superuser] do),是一種程式,用於類Unix作業系統允許使用者透過安全的方式使用特殊的權限執行程式 (通常為系統的超級使用者)。
  • add-apt-repository 將 PPA 添加到您的來源列表中,以便 Ubuntu 知道從該 PPA 以及官方 Ubuntu 源中查找更新。
  • apt-get update 告訴 apt-get 去更新其資料庫,安裝哪些 package 以及從哪裡安裝它。
  • apt-get install 讓 apt-get 去資料庫中找到 package 並下載並安裝指定的文件。

安裝網路工具

$ sudo apt install net-tools

安裝 Apache 伺服器

// 安裝 Apache 與工具
$ sudo apt -y install apache2 apache2-utils

// 檢查 apache 運行狀況
$ sudo service apache2 status

// 利用 netstat 指令確認服務是否有啟動(有發現 80 port 運作中,但是 443 預設沒有啟用)。
$ netstat -tlnp

// 也利用 systemctl 指令查看一下相關服務的啟用情況。
$ sudo systemctl status apache2

啟用 SSL 模組

先啟用 Apache ssl 模組,並 restart  apache2 服務。

$ sudo a2enmod ssl
$ sudo systemctl restart apache2

此時一樣用 netstat 指令查一下,會發現有 443 port 已啟用。但是直接連結網頁會失敗。

// 調整 SSL 網站設定檔
$ sudo a2ensite default-ssl.conf
$ sudo systemctl reload apache2 

Apache 設定檔位置

// 一般設定檔
/etc/apache2/apache2.conf

// SSL 設定檔
/etc/apache2/sites-available/default-ssl.conf

這樣子就完第了 apache server 的初步安裝作業了~

安裝 PHP 8.2 or 8.1 版

增加新版 PHP 套件庫來源

要安裝新版的 PHP 8 需要加入 Ondřej Surý (PHP 和 Debian 的首席開發人員,並維護 Ubuntu 和 Debian 套件) PHP PPA 的來源,指令如下

$ sudo apt install software-properties-common

接下來新增 PHP 8 的 PPA 來源,指令如下

$ sudo add-apt-repository ppa:ondrej/php

更新 apt 來源

執行 apt update 指令,也許會有需要更新的套件。

$ sudo apt update

// 可以查詢那些套件可以升級
$ apt list --upgradeable

// 系統會提示您那些服務需要重啟
$ sudo apt upgrade -y

安裝 PHP 8.1 相關套件

PHP 的套件與模組很多,以下是一般常會用到的套件,安裝指令如下

$ sudo apt install php8.1 libapache2-mod-php8.1 php8.1-gd php8.1-mysql php8.1-curl php8.1-mbstring php8.1-intl -y

$ sudo apt install php8.1-gmp php8.1-bcmath php8.1-imagick php8.1-xml php8.1-zip php8.1-pdo php8.1-common php8.1-cli -y

啟用 Apache 的 PHP8.1 模組

如同文章開頭所述,Ubuntu 下的 Apache 模組需要先以 a2enmod 的指令啟用,指令如下

$ sudo a2enmod php8.1
$ sudo systemctl restart apache2

安裝 PHP 8.2 相關套件(以此為主)

$ sudo apt install php8.2 libapache2-mod-php8.2 php8.2-gd php8.2-mysql php8.2-curl php8.2-mbstring php8.2-intl -y
$ sudo apt install php8.2-fpm php8.2-gmp php8.2-bcmath php8.2-imagick php8.2-xml php8.2-zip php8.2-cli libapache2-mod-fcgid -y
$ sudo apt install php-common  php-tokenizer php-json -y

啟用 Apache 的 PHP8.2 模組

$ sudo a2enmod php8.2
$ sudo systemctl restart apache2

測試 PHP 版本資訊

啟動完成後,在 /var/www/html/ 的目錄下新增一個名叫 phpinfo.php 的檔案,指令如下

$ sudo vim /var/www/html/phpinfo.php

內容如下

<?php
   phpinfo();

安裝 MariaDB 10.x 版

安裝 MariaDB  套件

在 Ubuntu Server 20.04 安裝 MariaDB 10.x 相對簡單,目前建議使用預設的版本,安裝指令如下所示,這個版本的 MariaDB 相依了非常多的套件。

$ sudo apt install mariadb-server -y

初始化 MariaDB 資料庫環境

因為 Ubuntu Server 20.04 預設會啟用服務,所以可以直接初始化 MariaDB 的環境,指令如下

// 先直接切換成 root 身份,使用 sudo 指令會有奇怪的狀況發生
$ sudo su -
# mysql_secure_installation

接下來會一直問各種問題,如下所示,詢問目前 root 用戶的密碼,因為一開始沒有設定,請直接按 Enter 鍵繼續。

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB
      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current
password for the root user.  If you've just installed MariaDB, and
you haven't set the root password yet, the password will be blank,
so you should just press enter here.

Enter current password for root (enter for none):直接按 Enter 

要不要設定 root 密碼?按下 Y 並輸入二次密碼。

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB
root user without the proper authorisation.

Set root password? [Y/n] Y
New password: laravel
Re-enter new password: laravel
Password updated successfully!
Reloading privilege tables..
 ... Success!

重新啟動 MariaDB 服務

$ sudo systemctl restart mariadb

確認 MariaDB 服務狀態

利用 netstat 指令確認服務是否有啟動(有發現 3306 port 運作中)。

$ sudo netstat -tlnp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      22965/mysqld
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      603/systemd-resolve
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      690/sshd: /usr/sbin
tcp        0      0 127.0.0.1:6010          0.0.0.0:*               LISTEN      22203/sshd: ossii@p
tcp6       0      0 :::80                   :::*                    LISTEN      21359/apache2
tcp6       0      0 :::22                   :::*                    LISTEN      690/sshd: /usr/sbin
tcp6       0      0 ::1:6010                :::*                    LISTEN      22203/sshd: ossii@p
tcp6       0      0 :::443                  :::*                    LISTEN      21359/apache2

//利用 systemctl 指令查看一下相關服務的啟用情況。
$ sudo systemctl status mariadb

安裝 phpMyAdmin

安裝 phpMyAdmin

// php 8.1
$ sudo apt install phpmyadmin php8.1 

// php 8.2
$ sudo apt install phpmyadmin php8.2

設定 phpMyAdmin

第一次安裝時,會跳出以下的畫面,詢問是配合哪一個 Web 服務,預設為 apache2,請將<tab>鍵切換到 OK 並按下 Enter 鍵繼續。

接下來的畫面請選擇 Yes 並按 Enter 以安裝和設定資料庫。

接下來的畫面,MySQL application password 僅會在 phpMyAdmin 內部用於與資料庫(本例為 MariaDB )溝通時使用。可以將此留空,系統會自動生成密碼。只需按 ENTER 繼續。 設為:laravel 或留空

為了更安全的使用 phpmyadmin,建議在 apache2 的設定檔中,加入以下內容,指令如下

$ sudo vim /etc/apache2/conf-available/phpmyadmin.conf

// phpMyAdmin default Apache configuration

Alias /phpMyAdmin /usr/share/phpmyadmin
Alias /phpmyadmin /usr/share/phpmyadmin

<Directory /usr/share/phpmyadmin>
    Options SymLinksIfOwnerMatch
    DirectoryIndex index.php
    AddDefaultCharset UTF-8

    # limit libapache2-mod-php to files and directories necessary by pma
    <IfModule mod_php7.c>
        php_admin_value upload_tmp_dir /var/lib/phpmyadmin/tmp
        php_admin_value open_basedir /usr/share/phpmyadmin/:/usr/share/doc/phpmyadmin/:/etc/phpmyadmin/:/var/lib/phpmyadmin/:/usr/share/php/:/usr/share/javascript/
    </IfModule>

    <IfModule mod_authz_core.c>
       # Apache 2.4
       # Require all granted      
       Require ip 192.168.200.53 192.168.200.0/24
     </IfModule>

</Directory>

# Disallow web access to directories that don't need it
<Directory /usr/share/phpmyadmin/templates>
    Require all denied
</Directory>
<Directory /usr/share/phpmyadmin/libraries>
    Require all denied
</Directory>

因為 phpMyAdmin 管理工具不需要開放給一般人去使用,所以建議只需開放給特定 IP 來源編輯即可(如: 第22行),利用修改 Apache 的設定檔即可達到此目的。

存檔之後,執行以下指令啟用 php mbstring 模組及 phpmyadmin 的設定檔,並重新啟動 apahce2。

$ sudo a2enconf phpmyadmin
$ sudo phpenmod mbstring
$ sudo systemctl restart apache2

在網址後面打 /phpmyadmin 或是 /phpMyAdmin 即可登入使用,最後即完成初步的安裝設定工作。

建立 MySQL 使用者

因為要透過 phpMyAdmin 來管理 MariaDB,在 Ubuntu Server 22.04 的環境中預設無法以 root 身份登入你的 MariaDB 伺服器,所以透過建立一個 MariaDB 使用者,即可透過 phpMyAdmin 來管理資料庫,指令如下

// 用資料庫的權限進入, 不用輸入密碼
$ sudo mariadb -u root

// 先以指令,以 root 身份在本機登入 MariaDB:這要輸入 OS:root 的密碼
$ sudo mysql -u root -p

建立帳號

// 建立帳號, user 請換作您想要的帳號名, password 也請置換
CREATE USER 'user'@'%' IDENTIFIED VIA mysql_native_password USING 'password';

// 授予系統資源
GRANT USAGE ON *.* TO 'user'@'%' REQUIRE NONE WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0;

// 給予資料庫權限
GRANT ALL PRIVILEGES ON `yourDbName`.* TO 'user'@'localhost' WITH GRANT OPTION;

存檔後重新啟動 Apache 伺服器。

$ sudo systemctl restart apache2

安裝 Composer

下載/安裝 Composer

有了 php 指令後,就可以直接使用 Composer 官網上的下載指令來安裝 Composer:

// 先切換到 root:  
$ sudo su -

// 下載/安裝 Composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === 'e21205b207c3ff031906575712edab6f13eb0b361f2085f1f1237b7126d785e826a450292b6cfd1d64d92e6563bbde02') { 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-setup.php 這個安裝程式,由於指令裡會驗證這個 .php 檔的雜湊值,所以請自行到官網複製這段指令,完成後,可以把 composer.phar 變成全域指令:

laravel@ubuntu-srv:~$ sudo mv composer.phar /usr/local/bin/composer

// 查詢 composer 版本
laravel@ubuntu-srv:~$ composer --version
Composer version 2.6.2 2023-09-03 14:09:15

安裝 git

$ sudo apt-get install git

安裝 nvm

$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh | bash

設定環境變數

.profile 檔,最後加入

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion

執行下行生效環境參數

$source ~/.profile

安裝 nodejs

$ nvm install 14

安裝完成以後可以輸入 node 查看是否有正確安裝。

建立新 Laravel 專案

進入 /var/www 建立專案

// 進入 /var/www 建立專案
$ sudo git clone https://github.com/polinwei/laravel_starter.git

// Laravel 在運行的時候,會將應用程式的 cache 及 log 寫入檔案,因此別忘了把資料夾權限開大
$ cd laravel_starter/
$ sudo chmod -R 777 storage/
$ sudo chmod -R 777 bootstrap/cache/

安裝 Laravel & vite 套件

$ sudo composer install

// 切換成 root 執行
$ sudo su -
# npm install

//執行有問題時, 則執行下行
# npm cache --force clean && npm install --force

# npm run build

啟用 Enabling mod_rewrite

Apache’s mod_rewrite module is used for URL rewriting, a crucial aspect for Laravel’s routing mechanism. If it’s not enabled, you might encounter a 404 error. To enable mod_rewrite, open your terminal and run the following command:

$ sudo a2enmod rewrite
$ sudo systemctl restart apache2

開啟虛擬站台支援

Ubuntu Apache啟用虛擬多網站(VirtualHost)

設定Apache

Ubuntu Apache的設定檔不是在/etc/httpd/conf/httpd.conf ,而是在/etc/apache2/sites-available/000-default.conf 中。複制 /etc/apache2/sites-available/000-default.conf 給虛擬網站

$ sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/ubuntu-srv.demo.com.tw.conf
$ sudo vim /etc/apache2/sites-available/ubuntu-srv.demo.com.tw.conf

虛擬網站內容如下

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/laravel_starter/public"
    ServerName ubuntu-srv.demo.com.tw
    <Directory "/var/www/laravel_starter">
        Options All
        AllowOverride All
        Require all granted
    </Directory>
    ErrorLog "logs/dummy-laravel-error_log"
    CustomLog "logs/dummy-laravel-access_log" common
</VirtualHost>

啟用設定檔

$ sudo a2ensite ubuntu-srv.demo.com.tw.conf

// 重讀設定檔
$ sudo systemctl reload apache2

設定Apache 啟用 SSL

// 複制 /etc/apache2/sites-available/default-ssl.conf 給虛擬網站
$sudo cp /etc/apache2/sites-available/default-ssl.conf ssl-laravel.conf
$sudo vi vi ssl-laravel.conf

ssl-laravel.conf 內容如下

<IfModule mod_ssl.c>
        <VirtualHost _default_:443>
                ServerAdmin webmaster@localhost
                DocumentRoot /var/www/laravel_starter/public
                ServerName ubuntu-srv.demo.com.tw
                <Directory "/var/www/laravel_starter">
                  Options All
                  AllowOverride All
                  Require all granted
                </Directory>

                ErrorLog ${APACHE_LOG_DIR}/error.log
                CustomLog ${APACHE_LOG_DIR}/access.log combined

                #   SSL Engine Switch:
                #   Enable/Disable SSL for this virtual host.
                SSLEngine on

                #   SSLCertificateFile directive is needed.
                SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
                SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key

                <FilesMatch "\.(cgi|shtml|phtml|php)$">
                    SSLOptions +StdEnvVars
                </FilesMatch>

                <Directory /usr/lib/cgi-bin>
                    SSLOptions +StdEnvVars
                </Directory>
        </VirtualHost>
</IfModule>

啟用 虛擬多網站(VirtualHost) SSL

$ sudo a2ensite ssl-laravel.conf
$ sudo systemctl restart apache2

CURL 遇到 SSL tls_process_ske_dhe:dh key too small 解法

這個問題應該是網站的 SSL 太舊,所以 SSL 需要降級

$ sudo vim /etc/ssl/openssl.cnf

// openssl.cnf
[system_default_sect]
# CipherString = DEFAULT:@SECLEVEL=2
MinProtocol = TLSv1.2
CipherString = DEFAULT:@SECLEVEL=1

以上,完成這些步驟後就可以執行 Laravel 了。

https://ubuntu-srv.demo.com.tw

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *