Nginx + SSL + HTTP/2 + Rails 在 Mac 本機開發設定

有一陣子 Rails 在本機開發流行 Pow,但是因為缺少維護問題多多,我個人是不太愛用。平常我也沒有需要一直開新專案,所以偏好自己在 Mac 上安裝 Nginx 做 reverse-proxy 導流,而且還可以把 HTTP/2 打開加快靜態檔案下載速度。

以下示範如何將 https://ihower.localhost 導流進 localhost:3001

1. 編輯 /etc/hosts

sudo vi /etc/hosts 加上

127.0.0.1       ihower.localhost

2. 產生自簽的 SSL key

以下指令參考自 https://localhost 這篇文章

cd; mkdir .ssl

openssl req -newkey rsa:2048 -x509 -nodes -keyout .ssl/ihower.key -new -out .ssl/ihower.crt -subj /CN=ihower.localhost -reqexts SAN -extensions SAN -config <(cat /System/Library/OpenSSL/openssl.cnf <(printf '[SAN]\nsubjectAltName=DNS:ihower.localhost')) -sha256 -days 3650

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain .ssl/ihower.crt

這樣會產生 ihower.localhost 的 SSL key 放在 ~/.ssl/ 下,並且把這個 key 加入信任名單

3. 安裝和設定 Nginx

brew install nginx

編輯 /usr/local/etc/nginx/nginx.conf,新增一段:

server {
  listen 80;
  server_name ihower.localhost;
  root /Users/ihower/projects/ihower/public; # 你的 Rails 項目的 public 目錄

  listen 443 ssl http2; 
  ssl_certificate /Users/ihower/.ssl/ihower.crt;
  ssl_certificate_key /Users/ihower/.ssl/ihower.key;

  location / {
    proxy_pass http://localhost:3001;
    proxy_set_header  Host $host;
  }
}

重啟 Nginx

sudo brew services stop nginx
sudo brew services start nginx

4. 啟動 Rails 在 Port 3001

rails s -p 3001

打開瀏覽器就前往 https://ihower.localhost 就有 SSL 又有 HTTP/2 啦。

Leave a Reply