Linux 建立網站流程

(一) 更新系統

更新系統軟件包

在開始任何事情之前,確保你的系統是最新的。

  1. Debian / Ubuntu 系統:使用 apt
sudo apt update
sudo apt upgrade
  1. Red Hat 系統(CentOS、Rocky Linux、Fedora):使用 dnf
sudo dnf check-update
sudo dnf upgrade

(二) 安裝必要套件

安裝 EPEL 存儲庫

sudo dnf install epel-release

安裝常用工具

sudo dnf install -y wget bzip2 zip

安裝 NGINX

# 安裝 NGINX
sudo dnf install -y nginx

# 啟動與開機自動啟動 NGINX
sudo systemctl enable nginx
sudo systemctl start nginx

# 查看 nginx 狀態
sudo systemctl status nginx

# 檢查是否監聽 TCP/80
ss -ntulp | grep nginx

# 查看版本
nginx -v

# 預設網站根目錄: /usr/share/nginx/html
# 可建立 info.php 檔案測試 PHP

info.php 測試 PHP 是否正常執行

<?php
phpinfo();
?>

mysql.php 測試資料庫連線

<?php
$host = 'localhost';
$dbname = 'your_database_name';
$username = 'your_username';
$password = 'your_password';

try {
    $pdo = new PDO("mysql:host=$host;dbname=$dbname", $username, $password);
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    echo "成功連接到數據庫";
} catch(PDOException $e) {
    echo "連接數據庫失敗: " . $e->getMessage();
}
?>

開啟防火牆對應 Port(80, 443, 3306)

sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent
sudo firewall-cmd --permanent --add-port=3306/tcp
sudo firewall-cmd --reload

安裝 MariaDB

# 安裝 MariaDB
sudo dnf install -y mariadb-server mariadb

# 啟動 MariaDB 並設為開機啟動
sudo systemctl enable --now mariadb
sudo systemctl status mariadb

# MariaDB 安全初始化
sudo mysql_secure_installation

# 登入資料庫
sudo mysql -u root -p

# 查看資料庫
SHOW DATABASES;
exit

安裝 PHP 與 php-fpm

安裝 Remi 儲存庫

sudo dnf install -y dnf-utils https://rpms.remirepo.net/enterprise/remi-release-8.rpm

啟用 PHP 模組

sudo dnf module reset php
sudo dnf module enable php:remi-8.0

安裝 PHP 及必要模組

sudo dnf install -y php php-fpm php-cli php-mysqlnd php-gd php-json php-opcache php-zip php-mbstring curl

啟動 php-fpm 並設為開機啟動

sudo systemctl enable --now php-fpm
sudo systemctl status php-fpm

修改 php-fpm 設定為 nginx 用戶

編輯設定檔:

sudo vim /etc/php-fpm.d/www.conf

找到並修改以下內容:

user = nginx
group = nginx
listen.acl_users = nginx

儲存後重新加載服務:

sudo systemctl reload php-fpm

確認 PHP 版本

php -v

安裝 Composer

# 下載安裝器
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"

# 安裝 Composer 至全域路徑
sudo php composer-setup.php --install-dir=/usr/local/bin --filename=composer

# 驗證安裝
composer --version

安裝 SSL 憑證 (Let's Encrypt)

# 安裝 Certbot
sudo dnf install -y certbot python3-certbot-nginx

# 建立憑證
sudo certbot --nginx -d your_domain.com

# 檢查憑證狀態
sudo certbot certificates

安裝 Laravel 專案

# 建議安裝位置
cd /var/www/html/projectName

# 建立 Laravel 專案
composer create-project --prefer-dist laravel/laravel .

# 建立應用程式金鑰
php artisan key:generate

# 調整 storage 權限
sudo chmod -R 775 storage
sudo chmod -R ugo+rw storage

# 建立符號連結
php artisan storage:link

安裝 Node.js

sudo dnf module install nodejs
sudo dnf install -y nodejs

# 檢查版本
node -v
npm -v

安裝 phpMyAdmin

安裝 PHPMyAdmin 所需模組

sudo dnf install -y php-pdo php-mysqli php-mbstring php-json php-xml

安裝 phpMyAdmin(建議手動下載)

  1. 下載最新版:https://www.phpmyadmin.net/
  2. 解壓縮:
tar -zxf phpMyAdmin-x.x.x-all-languages.tar.gz
mv phpMyAdmin-x.x.x-all-languages phpmyadmin
  1. 移至適當位置:
  • Apache 路徑:/var/www/html/phpmyadmin
  • Nginx 路徑:/usr/share/nginx/html/phpmyadmin
  1. 設定 config.inc.php
cp config.sample.inc.php config.inc.php

# 生成隨機密鑰
openssl rand -base64 32

修改內容:

$cfg['blowfish_secret'] = '生成的隨機字串';
$cfg['TempDir'] = '/usr/share/nginx/html/phpmyadmin/tmp';

建立並賦予權限:

mkdir /usr/share/nginx/html/phpmyadmin/tmp
chmod 777 /usr/share/nginx/html/phpmyadmin/tmp

開啟:

http://伺服器IP/phpmyadmin

(三) Nginx 設定

建立網站存放目錄與首頁

# 預設網頁路徑
cd /usr/share/nginx/html/
echo Hello > index.html

# 建立網站目錄
mkdir -p /var/www/html/projectName

建立網站設定檔

cd /etc/nginx/conf.d/
touch projectName.conf

設定檔內容範例(支援 PHP):

server {
    listen 80;
    server_name MyWeb.com.tw www.MyWeb.com.tw;

    root /var/www/html/projectName;
    index index.php index.html index.htm;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include fastcgi.conf;
        fastcgi_pass unix:/run/php-fpm/www.sock;
    }

    location ~ /\.ht {
        deny all;
    }
}

重新載入 Nginx 並測試設定

# 測試設定是否正確
sudo nginx -t

# 重啟或重新載入 Nginx
sudo systemctl restart nginx
# 或
sudo nginx -s reload
sudo systemctl reload nginx

SELinux 與權限設定(403 錯誤排除)

# 查看 SELinux 權限標籤
ls -Z /var/www/html/projectName

# 臨時關閉 SELinux(僅限測試)
sudo setenforce 0

# 若關閉後可正常顯示,再永久授權資料夾
sudo chcon -Rv --type=httpd_sys_content_t /var/www/html/projectName

強制使用 HTTPS 的 Nginx 設定範例

server {
    if ($host = localhost) {
        return 301 https://$host$request_uri;
    }

    listen 80;
    server_name localhost;
    return 404;
}

(四) Apache 安裝與設定

安裝 Apache(httpd)

sudo dnf install httpd
sudo systemctl enable httpd
sudo systemctl start httpd
sudo systemctl status httpd

設定防火牆開放 http

firewall-cmd --permanent --add-service=http
firewall-cmd --reload
firewall-cmd --list-all | grep http

網站預設首頁位置

cd /var/www/html/
echo "Apache 預設首頁" > index.html

提供多站台(VirtualHost)

建立設定檔

cd /etc/httpd/conf.d/
cp /usr/share/doc/httpd/httpd-vhosts.conf www.my-example.com.conf

修改範例如下:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/html/dummy-host.example.com"
    ServerName dummy-host.example.com
    ServerAlias www.dummy-host.example.com
    ErrorLog "/var/log/httpd/dummy-host.example.com-error_log"
    CustomLog "/var/log/httpd/dummy-host.example.com-access_log" common
</VirtualHost>
參數 說明
ServerName 網站主機名稱
DocumentRoot 網頁根目錄
ErrorLog 錯誤日誌儲存位置
CustomLog 存取日誌儲存位置

範例:設定 web1.domainX.linux.class

cd /etc/httpd/conf.d/
cp /usr/share/doc/httpd/httpd-vhosts.conf web1.domainX.linux.class.conf

編輯內容如下:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot "/var/www/html/web1.domainX.linux.class"
    ServerName web1.domainX.linux.class
    ErrorLog "/var/log/httpd/web1.domainX.linux.class-error_log"
    CustomLog "/var/log/httpd/web1.domainX.linux.class-access_log" common
</VirtualHost>

建立目錄並新增首頁:

mkdir -p /var/www/html/web1.domainX.linux.class/
cd /var/www/html/web1.domainX.linux.class/
echo "Hello World web1" > index.html

重新啟動 Apache:

systemctl restart httpd

使用 curl 測試:

curl http://web1.domainX.linux.class

(五) 使用 SFTP 上傳與下載檔案

# 連線到伺服器
sftp user@伺服器IP

# 上傳檔案
put /path/to/local/file

# 下載檔案
get /path/to/remote/file

本地端指令(sftp 模式下)

指令 功能
lcd 切換本地目錄
lls 列出本地檔案
lpwd 顯示本地目錄