Skip to content

zh

將 npm 模組導入 AWS Lambda 函數

當您在 Amazon Web Services (AWS) 上創建 Node.js Lambda 函數並開始使用線上編輯器進行編輯時,您可能會想要運行 npm install 並導入第三方庫,例如 lodash。不幸的是,透過網頁入口無法簡單地做到這一點。

要做到這一點,您需要在本地環境中編寫代碼,然後部署它。首先,在您的機器上創建一個資料夾,並將 index.js 文件複製到其中。接下來,運行以下命令以初始化您的項目並安裝相關性:

    npm init .
    npm install lodash --save

要在 index.js 中使用庫,添加以下行:

let _ = require("lodash")

當您完成編寫代碼後,使用以下命令壓縮整個資料夾,包括 node_modules 目錄:

    zip -r function.zip .

最後,使用 AWS CLI 工具從您的終端部署 zip 文件:

    aws lambda update-function-code --function-name yourFunctionName --zip-file fileb://function.zip

yourFunctionName 佔位符替換為您的函數名稱。如果部署成功,您應該會在終端中看到 "LastUpdateStatus": "Successful",然後您可以在 AWS 控制臺中進行函數測試。

修復WordPress插件安裝權限問題

問題

當我嘗試在WordPress中安裝插件時,遇到了以下錯誤:

安裝失敗:下載失敗。檔案串流的目標目錄不存在,或者無法寫入。

這個問題是由於內容文件夾的權限問題導致的。我已經以超級用戶(sudo su)的身份編輯了一些文件,但安裝需要ec2-user的寫入權限。

解決方案

假設你在AWS EC2實例上進行設定,並且已登入為ec2-user,並假設WordPress位於/var/www路徑中,執行以下命令以更改所有權:

sudo chown -R ec2-user:apache /var/www

改變所有權後,你現在應該可以成功地安裝插件。

修復WordPress,所有頁面都返回404未找到

問題

我遇到了一個關於WordPress的奇怪問題:首頁可以正常加載,但所有其他頁面都無法做到。相反,錯誤頁面顯示了這樣的信息:

未找到

找不到請求的URL在此服務器上。

然而,由於我已經將檔案從另一台服務器遷移過來,所以所有頁面都應該已經存在。我懷疑.htaccess檔案可能是問題所在,但經過幾個小時的故障排除,我仍然沒有線索。

解決方案

事實證明,在我的情況下,.htaccess檔案配置正確。問題在於其他地方。要解決它,编辑httpd.conf檔案:

    sudo vi /etc/httpd/conf/httpd.conf

找到以以下開頭的部分:

    <Directory "/var/www/html">

將配置從AllowOverride None改為:

    AllowOverride All

最後,重啟服務器:

    sudo systemctl restart httpd

做完這些,所有頁面都應該可以正常顯示。

使用AWS負載平衡器時,透過HTTPS設定修復WordPress的無盡重定向

問題

我在兩個位於不同可用性區域的Amazon Web Services (AWS) EC2實例上設置了一個WordPress博客。在這些實例前,配置了一個Elastic負載平衡器 (ELB),以將所有在80端口的HTTP請求重定向到443端口的HTTPS。由於wp-config.php文件未更新以反映此變更,請求仍在使用HTTP。為了糾正這個,我更新了以下值以使用HTTPS:

    define('WP_SITEURL', 'https://' . $_SERVER['HTTP_HOST'] . '/');
    define('WP_HOME', 'https://' . $_SERVER['HTTP_HOST'] . '/');

然而,這導致了一個無窮的重定向循環,最終導致一個錯誤,說明"重定向太多次"。

解決方案

要解決這個問題,需要在wp-config.php文件中添加以下行:

    $_SERVER['HTTPS'] = 'on';

這將修復此問題。這樣的配置可能難以排除故障,您可能會花費很多時間尋找一個簡單的解決方案。希望這篇文章能為您節省一些時間,如果您遇到這個特殊問題。

在Amazon Linux 2上安裝PHP 7.2而非PHP 5.4

問題

當你啟動一個新的 Amazon Linux 2 AMI 服務器並嘗試使用以下命令安裝 PHP:

yum install php

成功安裝後,如果你使用 php -v檢查版本,你會看到:

PHP 5.4.16 (cli) (建立日期: 2019年10月31號 18:34:05 )

不過,最新的PHP版本是7.2,你可能希望使用這個新版本。

解決方案

你可以透過 Amazon Linux Extras 啟動 PHP 7.2,使用以下命令:

sudo amazon-linux-extras enable php7.2

一旦已經啟動,按照接下來的指示完成安裝:

yum clean metadata
yum install php-cli php-pdo php-fpm php-json php-mysqlnd

就這樣。再次使用 php -v檢查 PHP 版本,現在應該會顯示:

PHP 7.2.28 (cli) (建立日期: 2020年3月2日 19:38:11 ) ( NTS )

使用Node.js讀取大型檔案

我最近面臨了分析由日誌文件組成的大數據集的任務。當我試圖在Excel中打開這個文件時,我的筆記本電腦簡直凍結了。鑑於可用工具的限制,我決定使用Node.js腳本解析該文件。

問題

要讀取一個小文件,你可能會使用以下腳本:

var fs = require("fs")

fs.readFile("path/mySmallFile.txt", "utf-8", (err, data) => {
  if (err) {
    throw err
  }
  console.log(data)
})

使用此腳本,你應該能夠讀取小文件的內容。然而,對於大文件,你可能會遇到緩存錯誤,例如 RangeError: 嘗試分配的緩衝區大於最大大小。該腳本將終止,產生類似於以下的錯誤:

Error: "toString" failed
  at stringSlice (buffer.js)
  at Buffer.toString (buffer.js)
  at FSReqWrap.readFileAfterClose [as oncomplete]

解決方案

要讀取一個大文件,你可以像這樣使用Node.js的本地 readline庫:

var fs = require("fs")
var readline = require("readline")

const rl = readline.createInterface({
  input: fs.createReadStream("path/largeFile.csv"),
  output: process.stdout,
  terminal: false,
})

rl.on("line", line => {
  console.log(line)
})

rl.on("pause", () => {
  console.log("Done!")
})

將文件路徑替換為你的大文件的路徑。在 on('line')函數內部,你可以逐行處理文件,例如將其解析為JSON並增加計數器。完成閱讀文件後,可以使用 on('pause')函數顯示最終總和。

使用這種方法,你現在應該能夠使用Node.js處理大量數據集。有關更多信息,請參閱官方文檔:Node.js 讀取API

將WordPress MySQL資料庫遷移到AWS RDS

在這篇文章中,我將說明如何將您本地的WordPress MySQL資料庫遷移到Amazon Web Services(AWS)關聯性資料庫服務(RDS)。你可能會想要這樣做以獲取以下好處:

  1. 改善性能,因為您的資料庫將與在EC2實例上運行的資源分開。
  2. 能夠橫向伸縮您的網站,允許多個EC2實例連接到同一個資料庫。
  3. 更容易進行資料庫維護和升級任務。

信服了嗎?下面是達成此次遷移的步驟:

首先,導航到AWS控制台並選擇RDS。建立一個MySQL資料庫,如下圖所示填寫表單:

DB實例識別碼: wordpress 主用戶名: admin 主密碼: [YourChoice]

您可以將大多數設置保留為其預設值,包括預設的VPC。

其次,編輯這個新建的資料庫的安全組。選擇資料庫,導航至連接和安全標籤,並選擇安全組。在入站規則標籤中,編輯入站規則以移除預設設定並選擇類型:MySQL,協議:TCP,以及端口範圍:3306。

在來源部分,您可以選擇與您的WordPress EC2實例相關聯的安全組,或者輸入您自己的IP地址。如果您還未創建您的WordPress EC2實例,現在你可以做,或者只需從市場使用Bitnami WordPress。

第三,SSH進入您的WordPress實例,並用此命令備份您現有的WordPress資料庫:

    mysqldump -u root -p [YourDatabaseName] > backup.sql

[YourDatabaseName]替換為您的資料庫名稱,例如bitnami_wordpress。應在您的現有目錄中創建backup.sql文件。通過運行命令將此文件導入到您新建的AWS RDS實例:

    mysql -u admin -p -h [RDS_ENDPOINT] -D wordpress < backup.sql

admin[RDS_ENDPOINT]替換為您自己的值。如果您遇到如下的錯誤:

    ERROR 1049 (42000): Unknown database 'wordpress'

這表示您的wordpress資料庫尚未被創建。首先,用以下命令連接到資料庫:

    mysql -h [RDS_ENDPOINT] --user=admin --password=[YourPassword]

一旦連接到MySQL,就用以下命令創建一個新的資料庫:

    mysql> CREATE DATABASE wordpress;
    Query OK, 1 row affected (0.00 sec)
    mysql> exit;
    Bye

最後,編輯您的WordPress EC2實例中的wp-config.php文件。該文件通常位於您的WordPress目錄中,例如倘若您使用的是Bitnami,那麼它位於/home/bitnami/apps/wordpress/htdocs。更新下列值:

    /** The name of the database for WordPress */
    define( 'DB_NAME', 'wordpress' );

    /** MySQL database username */
    define( 'DB_USER', 'admin' );

    /** MySQL database password */
    define( 'DB_PASSWORD', '[YourPassword]' );

    /** MySQL hostname */
    define( 'DB_HOST', '[RDS_ENDPOINT]' );

使用您自己的值替換占位符並保存文件。更改應立即生效。

完成。如果您有任何問題,請隨時聯繫我。

從 Git 倉庫中移除 .DS_Store 文件

如果你是一個同時使用 Mac 和 Git 的用戶,你可能會無意間提交 .DS_Store 文件。這可能會讓你的 Windows 同事感到困惑,他們可能不清楚這些文件的用途,也不明白你為何要提交它們。

首先,什麼是 .DS_Store 文件? DS 代表桌面服務(Desktop Services),這些文件被 Mac 用來確定當你打開它們時如何顯示文件夾。例如,它們存儲自定義屬性,如圖標的位置。這些文件由 Mac 的 Finder 應用程序創建並維護,並且通常是隱藏的。

這些 .DS_Store 文件對 Windows 用戶無益,也不需要提交到你的 GitHub 倉庫。要從你的倉庫中移除現有的 .DS_Store 文件,執行以下命令:

    find . -name .DS_Store -print0 | xargs -0 git rm -f --ignore-unmatch

然後,提交更改以移除這些文件,並推送到遠程倉庫。為了防止這些文件再次被添加,編輯你的 .gitignore 文件,並添加以下行:

    .DS_Store

這樣做將避免你的同事產生任何疑慮。

在Git中忽略已修改的文件

我遇到了一種罕見的情況,一個文件已經被修改,但是我不想將這個變更提交給Git。有各種方法可以實現這一點,比如使用.gitignore文件。然而,如果文件已經被追蹤,這種方法就不起作用。

解決方案是通過執行以下命令來手動忽略文件:

    git update-index --assume-unchanged <文件路徑>

要再次追蹤文件,您可以通過使用以下命令來撤消此操作:

    git update-index --no-assume-unchanged <文件路徑>

如果您有任何問題,請隨時聯繫我。

在 Mac 上尋找並終止鎖定特定端口的進程

問題:有時候,當您啟動一個本地 Node.js 服務器時,它可能會繼續在後台運行。如果您嘗試再次啟動服務器,您可能會遇到一個錯誤,指出端口(例如,8080)已經在使用中並被鎖定:

    throw er; // Unhandled 'error' event
    Error: listen EADDRINUSE 127.0.0.1:8080

解決方案:您可以使用 lsof 命令來識別鎖定端口的進程:

    lsof -n -i4TCP:8080

或者,您可以將 8080 替換為您想要調查的特定端口號。這將顯示當前使用該端口的進程列表。識別您希望終止的進程(例如,正在運行的 node 與 PID 6709)並執行以下命令來將其殺死:

    kill -9 <PID>

最後,重新啟動您的服務器。一旦端口被釋放,它應該可以正常運行。