顯示具有 Nginx 標籤的文章。 顯示所有文章
顯示具有 Nginx 標籤的文章。 顯示所有文章

星期一, 6月 25, 2018

Enable Https by Nginx in docker

對於那些提供 Web Service 的 docker image(如圖左側),要如何賦予 https 的連線能力?當然依各種服務都有不同的做法可行,例如 GitLab 要改 gitlab.rb,Jenkins 是個 war 等等,不過有沒有更簡單一致的做法?那就是隔壁也開一個 Nginx docker container,配置如圖:
假設申請簽署的網站名為 nginx.acme.com,pem 格式的金鑰對紀錄在 nginx.acme.com.key 檔案內,nginx.acme.com.crt 是 pem 格式的憑證檔, Nginx 設定當有以下段落:
  • server {
    • listen 443 ssl;
    • server_name nginx.acme.com;
    • ssl_certificate /etc/ssl/certs/nginx.acme.com.crt;
    • ssl_certificate_key /etc/ssl/certs/nginx.acme.com.key;
    • ...
    • location / {
      • proxy_pass http://172.17.0.2:80;
      • proxy_set_header Host $host;
      • proxy_set_header X-Real-IP $remote_addr;
      • proxy_set_header X-Forwarded-Proto https;
    • }
    • ...
  • }
東拼西湊來的有些不踏實,這裡有比較完整的說明。

[2018/06/27]
這件事似乎有個常見的名詞 SSL Termination,用 HAProxy 也可以,請參考這篇

[2018/08/17]
由於 Nginx 官方 docker image 只聽著 port 80,在不想改官方產出的前提下,可以:

  • 由外面的 443 對應到裡面的 80,-p 443:80
  • Nginx 設定檔 listen 80 ssl;
  • 在某些虛擬機環境,因為防火牆的規則比較亂,可能讓這個 image 開不起來,在這篇有人提到解法:
    • iptables -t filter -F
    • iptables -t filter -X
    • systemctl restart docker

星期五, 12月 02, 2016

Break Same-origin policy by Nginx

HTML 5 愈來愈成熟,可預見的未來不再容許 ActiveX 的存在,替代方案是 WebSocket 或類似的架構,說穿了就是把一些髒事有安全疑慮的工作交給本機的一個輕量化 Web Server 處理。

不過「同源政策」又出來搗亂了,因為網頁所在伺服器與瀏覽器本來就不該一樣,而我能拿到的一個 ActiveX 替代方案參考實作,又偏偏不開放 Access-Control-Allow-Origin 這個表頭(一定是故意!),沒關係,請 Nginx 來助陣,設定如下:


如此一來,原先在 JavaScript 存取 http://localhost:61161 受到同源政策拘束的問題,改往 http://localhost:6116 即可解決。

星期二, 8月 30, 2016

Nginx on CentOS 5/6/7

之前在 Windows 裝過 Nginx,這次是 CentOS。
  • Install
    • 建立 /etc/yum.repos.d/nginx.repo 文字檔,內容如下:
      • [nginx]
      • name=nginx repo
      • baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
      • gpgcheck=0
      • enabled=1
    • 注意上述的 $releasever 要換成 CentOS 的版本號,可以是 5、6 或是 7
    • 執行 sudo yum install nginx
    • 官網原文在
  • Start as a service
    • sudo service nginx start
  • Test
    • curl http://localhost
[2018/02/05]
也可以先裝 EPEL 就好:
  • sudo yum install epel-release
  • sudo yum install nginx

星期五, 9月 25, 2015

認識 Docker + HAProxy (Software Load Balancing)

首先當然要裝好 Docker,再來是準備一台以上的 WebServer,以 Nginx 為例:
  • docker run --name nginx1 -d -p 8081:80 nginx
  • docker run --name nginx2 -d -p 8082:80 nginx
其中 -p 是表示將 Docker Host 的埠對應到 container 裏,所以在 Docker Host 上的 http://localhost:8081、http://localhost:8082 就會分別導到 nginx1、nginx2 的 80 埠,可以檢查一下是否能看到 Nginx 預設的首頁。

為了要知道這些 WebServer 的位址,可以下指令:
  • docker inspect nginx1 | grep IPAddress
  • docker inspect nginx2 | grep IPAddress
假設得到的結果是 nginx1: 172.17.0.1;nginx2: 172.17.0.2。接下來準備 HAProxy,因為官網說「沒有兩個人的設定一樣」,所以他們索性就不放一個入門級的設定範例了。沒關係,自己寫一個:
  • listen balanceGroup1 :80
    • server nginx1 172.17.0.1:80
    • server nginx2 172.17.0.2:80
  • listen stats :1936
    • mode http
    • stats enable
    • stats uri /
以上內容存檔在 /var/docker/haproxy.cfg,接著是重點:
  • docker run --name haproxy1 -d -p 80:80 -p 1936:1936 -v /var/docker:/usr/local/etc/haproxy:Z haproxy
如此就可以在 Docker Host 上訪問 localhost(會輪流導向 nginx1、nginx2),也可以在 localhost:1936 監控。因為瀏覽器的快取做得好,有時候反而不利於觀察 HAProxy 的行為,可以改用 curl 命令列工具。

[2018/05/12]
事隔多年,設定檔必須小改以符合新版的規定,如原先:
  • listen balanceGroup1 :80
要拆成兩行
  • listen balanceGroup1
    • bind :80
[2018/08/31]
服務與監控使用同一個埠似乎比較簡潔,就是整併上述 listen stats 段落,改為:
  • listen balanceGroup1
    • mode http
    • bind :80
    • stats enable
    • stats uri /admin?stats
    • server nginx1 172.17.0.1:80
    • server nginx2 172.17.0.2:80

星期五, 8月 21, 2015

nginx 試用

為了一個案子查問題需要幾個靜態網頁放在伺服器上,抓了 nginx for Windows 來用,還真小,解壓縮後也不到 4MB。紀錄幾點重要事項:
  • 靜態網頁都放在 html 目錄下,預設首頁是 index.html。
  • 若要修改埠號,在 conf/nginx.conf 很容易找到。
  • 根目錄就有一個 nginx.exe,點兩下執行即可啟動。
  • 預設就有紀錄,都在 logs 目錄內。