Posts

DOMPDF 內嵌圖片無法顯示的問題 pdf image background no show

Image
將測試站搬到正式站後(不同主機) 遇到由 dompdf 產生的 pdf 檔案內嵌圖片出不來的問題 圖片是用 img 跟 background 載入的 如果連結換成測試站的卻可以 比對兩邊 nginx 設定後才發現應該是 SSL 憑證的問題 測試站在 SSL Labs 拿到的是 A+ 等級 但正式站缺只有 B 後來修改 nginx 設定檔並將 ssl_certificate 設定正確的 .cer 檔案後 重啟 nginx 再次測試跑 SSL Labs 測試就拿到 A+ 喔 PS. 如果前後端分離的情狀下,主要修改的 API 站台,建議將所有站台一併更新至 A+

Lumen 10 CORS not working / Lumen 10 無法使用第三方 CORS 套件

由於 Laravel 9.2 後就內建 CORS 的關係 Lumen 10 之後的版本也沒有第三方套件支援 CORS 了 這邊主要是在說明該如何設定內建的 CORS 1. 新增 config/cors.php 檔案可以去複製 Laravel 10 的 cors.php 2. 修改 bootstrap/app.php,加入以下這段  $app->configure('cors'); $app->middleware([     \Illuminate\Http\Middleware\HandleCors::class, ]);

Google Cloud SQL 升級到 MySQL 8 遇到的權限問題

Image
 Google Cloud SQL 提供資料庫升級的方式很方便 幾乎是一鍵完成升級 這邊是從 5.7 升級到 8.0 在備份前先手動備份以外 另外還建立了一個副本 以確保在升級後有問題可迅速切回舊的資料庫 升級後發現有幾個資料庫使用者的權限有問題 在 phpMyAdmin 上面重新設定後也是一樣 phpMyAdmin 5.2.0 & 5.2.1 上設定 MySQL 8 的權限有點問題 由於 MySQL 8 上做了個修改 如果需要給予該使用者該資料庫 GRANT 的權限 需要在 GRANT 後面加上 WITH GRANT OPTION 指令 否則該使用者會無法存取該資料庫 基本上我是無法直接在 phpMyAdmin 上用點選的方式完成設定 正常權限的畫面 如果用 phpMyAdmin 勾選上方 Check all Administration 下的 GRANT 不會被勾選 即使手動勾選 GRANT 儲存後也是空的 可以使用以下指令修改完貼到 phpMyAdmin 上執行 CREATE USER ' db_user '@ '%' IDENTIFIED WITH mysql_native_password BY 'password' ; GRANT ALL PRIVILEGES ON your_database.* TO 'db_user' @ '%' WITH GRANT OPTION ; FLUSH PRIVILEGES; 測試環境 - Google Cloud SQL MySQL 8.0.26(測試過 MySQL 8.0.31 也是如此) - phpMyAdmin 5.2.0 & 5.2.1

Ubuntu 22 無法用 apt 安裝 php8.1-mcrypt & libmcrypt

先查詢是否已安裝 mcrypt # php -m | grep mcrypt 安裝 php-mcrypt 套件 # apt install php8.1-mcrypt 會出現以下的錯誤訊息 php8.1-mcrypt : Depends: libmcrypt4 (>= 2.5.8) but it is not installable 有看到資料說 mcrypt 於 php 7.2 後以移到 pecl 中 所以也嘗試用 pecl 安裝 mcrypt # pecl install mcrypt configure: error: mcrypt.h not found. Please reinstall libmcrypt. ERROR: `/tmp/pear/temp/mcrypt/configure --with-php-config=/usr/bin/php-config --with-mcrypt' failed 也是失敗 後來到這邊 直接下載 .deb 安裝 下載完後安裝 # dpkg -i libmcrypt4_2.5.8-7_amd64.deb 安裝完再用第一個指令確認一下 我的環境: Ubuntu 22.04 PHP 8.1.11

如何在 CentOS8 中安裝 pdo_oci

Image
由於有連接 Oracle 資料庫的需求 pdo_oci 安裝不像是 mysql 那樣的簡單 這邊主要分為三個部分 我的環境是: CentOS 8.6 x86_64 Oracle 是 21c Express Edition PHP 是 7.4 版 安裝 Oracle Instance Client 到 Oracle 官網下載 rpm 下來安裝,這邊需要兩個檔案 Base & Development and Runtime(SDK) 版 目前最新的 21.6 版 oracle-instantclient-basic-21.6.0.0.0-1.el8.x86_64.rpm oracle-instantclient-devel-21.6.0.0.0-1.el8.x86_64.rpm 要先安裝這個套件,否則下面的 rpm 安裝會有問題 # yum install libaio # mkdir /opt/oracle && cd /opt/oracle 然後用 wget 的方式下載上述兩個檔案 再執行安裝 # rpm -Uvh oracle-instantclient-basic-21.6.0.0.0-1.el8.x86_64.rpm # rpm -Uvh oracle-instantclient-devel-21.6.0.0.0-1.el8.x86_64.rpm 安裝 OCI 先安裝這個套件 # yum install php-pear systemtap-sdt-devel  然後使用 pecl 安裝 oci8-2.2.0(這個版本是 PHP 7 專用的,其他版本 請參照 ) # sudo PHP_DTRACE=yes pecl install oci8-2.2.0 安裝 PDO_OCI # yum install php-oci8 查看是否安裝成功 打開 phpinfo 頁面,搜尋 pdo_oci 及 oci8 會看到以下面話代表安裝成功!   參考文章來源: [1]  PHP 5.x PDO 連結 Oracle for CentOS 7 [2]  PHP oci8 won't install through pecl: "fatal error: oci8_dtrace_gen.h"

擴增 GCP 硬碟

到 Google Cloud Platform 擴增完硬碟後 在主機內下指令即可套用 # resize2fs /dev/sda1 免重開機  參考文章 [GCP] 不停機擴增 Linux 主機硬碟空間

如何處理/關閉 PHP 自動轉向圖片的功能

Image
Photo By Mae Mu 在 Lumen 中 某些圖片會自動轉向 會發生這種情況通常是單眼等較專業相機拍出來的照片 EXIF 中出現 Orientation 或是 Orientation 不是 0 影像處理的 lib 就會自動依照 Orientation 的值做對應的轉向 如果 Orientation 是 6 則是右轉 90 度,就會變成直立的照片 如果 Orientation 是 8 則是反方向轉 90 度 後來發現這似乎不是 Lumen 或套件的問題 問題出在 GD or iMagick 翻了文件 GD 似乎無法針對這部分去做設定 iMagick 可以,但我不想為了這個特別去裝肥肥的 iMagick 啊 如果想避免這個情況 由於無法單一清除 Orientation meta 資訊 最簡單的應該是一開始就把 EXIF 資訊給抹除掉 不然可以參考以下的方式,雖然有點繞 但可以 work 就好 XD 與其說關閉轉向功能 這邊實作的是,他轉幾度,我就轉幾度回來 orz...      // 如果照片中 exif 有 Orientation 資訊,則反轉 public function fixOrientation ( $imgObj , $image ) { $exif = @ exif_read_data ( $image ); if (! $exif ) { return ; } $orientation = ( $exif && isset ( $exif [ 'Orientation' ])) ? $exif [ 'Orientation' ] : NULL ; switch ( $orientation ) { case 6 : // rotate 90 degrees CW $imgObj -> rotate (- 90 ); break ; case 8 : // rotate 90 degrees C...

CentOS8 crash 之如何查詢 php-fpm 掛掉導致系統 crash 的查詢方式

Image
首先先搜尋 /var/log/message 裏面當機的原因 grep -i 'killed process' /var/log/messages 這篇主題主要是講述因 php-fpm 當掉的情形 php 當掉可以查詢的方向有: 1. php-fpm log 2. Nginx access or error log 可以從上述查詢到的時間點左右調查 這次的情況是某支 API 短時間內被大量的呼叫 剛好這支 API 又跑得比較慢 一時處理不及就炸了 順便也檢視一下 php-fpm 的設定 分享一下 `/etc/php-fpm.d/www.conf` 的設定 pm.max_children = 60 pm.start_servers = 5 pm.min_spare_servers = 5 pm.max_spare_servers = 35 pm.process_idle_timeout = 10s pm.max_requests = 500 其中參數該怎麼設定可以參考一下底下的 Reference 每個人講的似乎都不太一樣 可能要自己觀察看看怎樣比較適合自己 查詢 php 記憶體的平均使用量 ps --no-headers -o "rss,cmd" -C php-fpm | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }' 檢查共有開啟多少個 php-fpm process ps -ylC php-fpm --sort:rss 另外建議也可以查看 `systemctl status php-fpm` 剛好有些 process 不應該卡很久的剛好看到 主機規格 Google Compute Engine 1 vCPU 5G RAM Nginx 1. php-fpm 7.4.23 Reference Finding which process was killed by Linux OOM killer Nginx 與 PHP-FPM 最佳化效能設定教學與技巧 php-fpm 效能優化 PHP-FPM 效能調校 on CentOS 7 Nginx 啟用 PHP-FPM 服務狀態監控網頁教學 Linux 用 ps...

如何在 Google Cloud SQL 匯出 binlog

Image
  # mysqlbinlog --base64-output=AUTO --verbose -R -h [CLOUD SQL IP] -u root -p mysql-bin.000199 > /tmp/binlog-dump-000199.sql MySQL 5.6 開始支援 GTID 需要搭配上面的參數才能將 binlog 解析出 SQL 參考來源: Show sql statements from mysql binlog (GTID)

測試 GCP 硬碟硬碟效能(同場加映 Vultr)

Image
Photo by  Kolleen Gladden 標準永久硬碟 Zonal standard PD 寫入 # hdparm -t --direct /dev/sdc Timing O_DIRECT disk reads: 378 MB in  3.01 seconds = 125.47 MB/sec Timing O_DIRECT disk reads: 380 MB in  3.00 seconds = 126.53 MB/sec Timing O_DIRECT disk reads: 380 MB in  3.00 seconds = 126.66 MB/sec 讀取 # hdparm -t /dev/sdc Timing buffered disk reads: 374 MB in  3.00 seconds = 124.54 MB/sec Timing buffered disk reads: 380 MB in  3.01 seconds = 126.09 MB/sec Timing buffered disk reads: 380 MB in  3.01 seconds = 126.14 MB/sec SSD永久硬碟 Zonal SSD PD 寫入 # hdparm -t --direct /dev/sda2 Timing O_DIRECT disk reads: 738 MB in  3.00 seconds = 245.72 MB/sec Timing O_DIRECT disk reads: 608 MB in  3.02 seconds = 201.53 MB/sec Timing O_DIRECT disk reads: 396 MB in  3.07 seconds = 128.95 MB/sec 讀取 # hdparm -t /dev/sda2 Timing buffered disk reads: 740 MB in  3.00 seconds = 246.42 MB/sec Timing buffered disk reads: 53...

CentOS 8 中安裝 chrome 環境

node:102799) UnhandledPromiseRejectionWarning: Error: Failed to launch the browser process! /var/www/crawler/chromium/linux-800071/chrome-linux/chrome: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory TROUBLESHOOTING: https://github.com/puppeteer/puppeteer/blob/main/docs/troubleshooting.md     at onClose (/snapshot/crawler/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:193:20)     at Interface.<anonymous> (/snapshot/crawler/node_modules/puppeteer/lib/cjs/puppeteer/node/BrowserRunner.js:183:68)     at Interface.emit (events.js:327:22)     at Interface.close (readline.js:424:8)     at Socket.onend (readline.js:202:10)     at Socket.emit (events.js:327:22)     at endReadableNT (_stream_readable.js:1224:12)     at processTicksAndRejections (internal/process/task_queues.js:84:21) (Use `crawler --trace-warnings ...` to show where the ...

Sendmail high cpu usage on CentOS

最近某台主機的 sendmail 使用率偏高 影響到其他程式的執行效率 但我的主機沒有裝 sendmail 後來排除種種問題後發現跟 crontab 有直接的關係 先暫時關掉 crontab 並將餘孽 kill 掉 `top` 中就看不到 sendmail 這支 process 了 原本以為主機中了木馬或是病毒 用 rkhunter 掃了之後跟其他主機都正常 後來想說 sendmail CPU 使用率這麼高 因應該是信件卡住寄不出去之類的 就去查找 queue list 輸入 `mailq` 發現一堆 queue(但輸入 `mail` 卻顯示 No mail for root) 後來查看 /var/log/messages 看到一堆下方的錯誤訊息 `crond[1652]: No configuration file found at /root/.esmtprc or /etc/esmtprc` 查找了一下 esmtp 這個套件相依性跟之前安裝的 google-fluentd 有關 難怪其他主機都沒這個問題 解決方式很簡單 裝個 postfix 就真的解決了 `yum install postfix -y` 參考文章 No configuration file found at /root/.esmtprc or /etc/esmtprc

Cordova Status Bar blank

由於之前因為 WKWebView 的關係 所以升級到 c ordova-ios @5(後來發現跟 io5 似乎沒關係) 但卻也造成 Status Bar 一片白的問題,只會出現綠色的電量 原本會出現日期等資訊 1. 請安裝 cordova-plugin-statusbar 套件 $ cordova plugin add cordova-plugin-statusbar 2. 將下方加入 config.xml         <preference name="StatusBarOverlaysWebView" value="false" />         <preference name="StatusBarBackgroundColor" value="#000000" />         <preference name="StatusBarStyle" value="lightcontent" />         <preference name="StatusBarDefaultScrollToTop" value="false" /> 3. 重新 build $ cordova platform rm ios $ cordova platform add ios@5 請注意,一定要使用 5 的版本 不然會無效喔 參考資訊 Status bar is always white #109

使用 acme.sh 搭配 Let's encrypt 申請 wildcard ssl 憑證

Image
之前一直都是使用 certbot 套件 不過換到 CentOS 8 後 這個套件到今天(2020.05.28)為止還沒支援就是 由於 certbot 是用 pythlon 開發的 所以安裝時會安裝一堆相依的套件 這也是我一直不喜歡用 certbot 的原因 會間接搞亂我的環境 後來找到 acme.sh 是使用 shell script 撰寫的 相對來說單純很多 安裝也很簡單 這個範例是搭配 Cloudflare DNS 做設定 安裝 acme.sh 我是使用 root 執行安裝的 curl  https://get.acme.sh | sh 所以安裝完會出現 /root/.acme.sh 這個資料夾 取得 Cloudflare 的 key 登入你的 cloudflare 帳號後 到這個頁面  https://dash.cloudflare.com/profile/api-tokens 點選下方「Global API Key」右邊的 View 認證完後會取得一組 Key 申請 SSL 憑證 在 /root/ 下新增一個 ssl_cert.sh 檔案 其中 yourdomain.tld 為你自己的網域名稱,如 google.com 因為有指定目錄於 /etc/letsencrypt 中 所以憑證應該會出現在 /etc/letsencrypt/yourdomain.tld 下 由於是 wildcard 的關係,所以會指定兩個 domain 分別為 yourdomian.tld 及 *.yourdomain.tld 請注意,務必讓 yourdomain.tld 在第一個,如果讓 *.yourdomain.tld 在前面的話,你的資料夾就會是 *.yourdomain.tld export CF_Key="your global api key" export CF_Email="你的 cloudflare 登入的帳號(信箱)" /root/.acme.sh/acme.sh --issue -d yourdomain.tld -d *.yourdomain.tld --cert-home /etc/letsencrypt --keylength 2048 --dns dns_cf \ --reloadcmd "system...

ITMS-90809: Deprecated API Usage - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability.

Image
我的環境是 Cordova 8.1.2 Cordova 4.5.5 由於 Apple 之前已經有預告 2020.4.30 後不支援 UIWebView 需改成 WKWebView 如果沒改的話就會出現下面的錯誤 且上傳自動審核時會直接踢掉 然後直接發如上圖那封信給你 ITMS-90809: Deprecated API Usage  - New apps that use UIWebView are no longer accepted. Instead, use WKWebView for improved security and reliability. Learn more ( https://developer.apple.com/ documentation/uikit/uiwebview ) . 只要依照下面幾個步驟就可以解決這個問題 1. 安裝 cordova-plugin-wkwebview-engine 套件 # cordova plugin add cordova-plugin-wkwebview-engine 2. 使用 cordova-ios 5 的版本(我的環境預設是 4,所以要手動) # cordova platform rm ios # cordova platform add ios@5 3. 修改 config.xml <platform name= "ios" > <preference name= "WKWebViewOnly" value= "true" /> <feature name= "CDVWKWebViewEngine" > <param name= "ios-package" value= "CDVWKWebViewEngine" /> </feature> <preference name= "CordovaWebViewEngine" value= ...

Drupal 8.4 upgrade to 8.6

紀錄從 Drupal 8.4.8 升級到目前最新的 8.6.16 不升級到 8.7.1 是因為可能還不是很 stable 的關係 請注意:更新前先備份資料夾跟資料庫,如果更新失敗還可以復原 Drupal8 升級 Kernel 的方式好像跟之前不太一樣 主要是透過移除 `/core` 及 '/vendor' 資料夾後 再將新版本的這兩個資料夾上傳 上傳完後執行 `update.php` 執行 `update.php` 需要注意 `/sites/default/files` 的權限問題 另外不建議一直就直接跨越升級 8.4 -> 8.6 建議先升到下個版本的最新版 然後執行上述步驟重傳 `/core` & `/vendor` 及執行 `update.php` 等 Kernel 升級完後 最後再來升級 modules Drupal8 的 modules 預設在 `/modules/contrib` 裡面 也是將舊版的 module 資料夾刪除後重新上傳 module 都上傳完後再執行 `update.php` 即可 環境: Drupal 8.4.8 PHP 7.1.27 CentOS 7.5

mac 安裝 mtr

Image
macOS 上要安裝 mtr 看似簡單 $ brew install mtr 如果沒安裝過 HomeBrew 請參考這邊 mtr 可拿來檢查點對點中間的網路狀態 它結合 ping 及 traceroute 的功能 已內建於大多數的 Linux 中 詳細的說明可參考這邊 但這邊有個坑 由於安裝好的 mtr 不在 /usr/local/sbin 中 macOS 中也不存在這這個目錄(macOS 10.14.3) 所以會出現以下的錯誤 Error: The brew link step did not complete successfully The formula built, but is not symlinked into /usr/local Could not symlink sbin/mtr /usr/local/sbin is not writable. You can try again using: brew link mtr ==> Caveats mtr requires root privileges so you will need to run sudo mtr . You should be certain that you trust any software you grant root privileges. 執行 brew link mtr 會出現 Linking /usr/local/Cellar/mtr/0.92… Error: Could not symlink sbin/mtr /usr/local/sbin is not writable. 如何設定 1. 建立目錄及設定權限 sudo mkdir /usr/local/sbin && sudo chmod ug+rwx /usr/local/sbin && sudo chown $(id -un):admin /usr/local/sbin 2. 設定 PATH 如果有裝 zsh 的話 請編輯 vi .zshrc 如果沒有使用 zsh 請編輯 vi .bash_profile 將下面的部分貼到最下方 export PA...

如何抓取最近生日的人

Image
如果想要抓取今天前後一週生日的人 SELECT * FROM customer t WHERE MOD(DAYOFYEAR(CURDATE()) - DAYOFYEAR(t.birth) + 365, 365) <= 7 OR MOD(DAYOFYEAR(t.birth) - DAYOFYEAR(CURDATE()) + 365, 365) <= 7 如果要抓取未來兩週生日的人 SELECT * FROM customer t WHERE MOD(DAYOFYEAR(t.birth) - DAYOFYEAR(CURDATE()) + 365, 365) <= 14 參考來源

Chrome Extension: 使用 Native Messaging 的方式串接讀卡機

Image
前提 由於需用 NFC 登入系統 評估後使用 新錼 CL-2100R 來實作 構想是用 Chrome Extension 串接讀卡機可快速登入系統 因 NPAPI 已經被淘汰了 所以用 Native Messaging 來開發 網路上有關 winscard.dll 跟 native messaging 的資料不多 一開始一直被誤導 以為可以直接呼叫 winscard.dll 今天看到 這篇文章 才晃然大悟 直接在 path 中帶入 winscard.dll 是 NPAPI 的做法 (因為直接 call .dll 不安全,所以才捨棄 NPAPI 的啊 XD) 如何在 Mac 上測試是否有抓到讀卡機 可以輸入以下指令 如果有出現讀卡機的型號就代表有抓到 $ pcsctest MUSCLE PC/SC Lite Test Program Testing SCardEstablishContext : Command successful. Testing SCardGetStatusChange Please insert a working reader :(我在這邊就卡住了) 如何執行 Chrome Extension 這邊不講解要如何載入開發的程式 只提該怎麼把 Chrome Extension 程式呼叫出來 可在 Chrome 網址列輸入 chrome://apps 就會出現安裝好的 Extension 如果沒出現請確認 Extensions 頁面有開啟該程式 註 winscard.dll 是 Microsoft Windows 內建的動態連結函式庫 基本上讀卡機都是用 winscard.dll 來提供服務 Linux/Mac 上則是使用 PC/SC lite 通常讀卡機廠商都不是自己寫 driver 都用公版程式 Mac 上早在 10.9 版以後就不支援了(10.8 還支援) 我用過兩個牌子都一樣 問過讀卡機廠商也是不了了之 所以目前要在 Mac 上面支援是有困難的(目前的 Mac 版本是 10.14) Reference Chrome Native Messaging Exampl Calling a C dll through chrome browser exten...

使用 certbot 讓 wildcard certificate 可自動更新憑證

Image
由於 Let’s Encrypt Wildcard Certificate 使用 DNS 認證 所以無法用傳統的方式自動更新 ./certbot renew 如果你剛好使用 Cloudflare 的話就有福了! Cloudflare 支援 API key 認證 可以透過一些第三方的模組來自動認證 這樣就不用每三個月都要手動認證了 以下教學參考此篇文章 前情提要 下方使用 CentOS7 當作示範環境 如果你還沒裝 certbot,請先執行 $ yum install certbot 1. 首先要先登入 Cloudflare,右上角 My Profile 那就可找到 Global API Key 請點選 View 輸入密碼就會出現,這把 Key 很重要請小心保管 2. 由於這把 Key 很重要,所以要放在一個安全的地方 原作者把它放在 /root/.secrets 裡面(你要改地方也行,最後的參數路徑記得改就好) 但系統預設沒有 /root/.secrets 這個目錄 所以要先建立這個目錄 $ mkdir /root/.secrets 然後把下面這兩行填好後放到 /root/.secrets/cloudflare.ini 裡面 dns_cloudflare_email = "請填你的cloudflare帳號,也就是email" dns_cloudflare_api_key = "請輸入上述的 Global API Key" 3. 修改 /root/.secrets/cloudflare.ini 權限 $ sudo chmod 0700 /root/.secrets/ $ sudo chmod 0400 /root/.secrets/cloudflare.ini 4. 安裝 Certbot 及 CloudFlare DNS 認證套件 $ sudo yum install python-pip $ sudo pip install certbot-dns-cloudflare 5. 申請 Wildcard SSL 憑證 example.com 請帶入自己的 domain $ sudo /usr/local/bin/certbot certonly --dns...