2020年8月31日 星期一

Linux安裝VirtualBox

先說結論

1.到Linux Mint20(ubuntu 20.04)Virtualbox 只支援到6.0 請不要裝6.1

2.需要更改啟動 mok 


安裝VirtualBox

wget -q https://www.virtualbox.org/download/oracle_vbox_2016.asc -O- | sudo apt-key add -

echo "deb [arch=amd64] http://download.virtualbox.org/virtualbox/debian focal contrib" | sudo tee /etc/apt/sources.list.d/virtualbox.list

sudo apt update

sudo apt install -y virtualbox-6.0

sudo systemctl status vboxdrv

最後一步 如果成功 恭喜就可以省略下列步驟

但應該都會失敗


設定載入vboxdrv


1.安裝mokutil

sudo apt-get update

sudo apt-get upgrade

sudo apt-get install mokutil


2.註冊security boot密碼

openssl req -new -x509 -newkey rsa:2048 -keyout MOK.priv -outform DER -out MOK.der -nodes -days 36500 -subj "/CN=VirtualBox/"

sudo /usr/src/linux-headers-$(uname -r)/scripts/sign-file sha256 ./MOK.priv ./MOK.der $(modinfo -n vboxdrv)

sudo mokutil --import MOK.der

會要求設定密碼 用在 rebbot使用enroll mok輸入密碼時用

注意這個密碼只能使用一次

如果重新安裝virtualbox 需再重複此步驟重新設定密碼


3.重新開機

選擇 Enroll MOK/ Continue 到輸入密碼

輸入完密碼重新reboot即可

4.安裝vagrant

sudo apt update

curl -O https://releases.hashicorp.com/vagrant/2.2.6/vagrant_2.2.6_x86_64.deb

sudo apt install ./vagrant_2.2.6_x86_64.deb

參考連結

https://www.itzgeek.com/post/how-to-install-virtualbox-on-linux-mint-20/

https://askubuntu.com/questions/760671/could-not-load-vboxdrv-after-upgrade-to-ubuntu-16-04-and-i-want-to-keep-secur

2020年8月15日 星期六

nginx 使用return 與proxy_pass的差異

最近在做官網的移轉

舊的主機系統為Window的架構

新的主機則是Linux Docker架構

官網domain移轉後 原本有跑一些.net aspx的服務

就透過nginx轉回舊站上


轉回去是要用return 301 轉址還是用proxy_pass轉呢?

先說結論

如果是會經過瀏覽器顯示的網頁 使用return

如果是程式內執行的api使用proxy_pass

譬如說 www網站要移轉

我們把www給了新的主機, 舊的主機改用old 這網址

因此我們需要在新的主機上 把部分的www轉回old上


在新主機上使用return 網址上看到的網址會是old

如果程式內呼叫的api是透過return轉的

那麼程式內會先收到301 code而發生錯誤 而非你想像的

轉址後的api所產生的結果


而網頁的部分應該是透過browser呈現的

在收到 301 或307 都會自動轉到新的網址上

並不會出錯


在新主機上使用proxy_pass 看到的網址還是www 並不會因為內容是轉回old而顯示old

但是如果網頁的部分也使用proxy_pass 當然還是可以運作

但是每個連結就都會再經過新主機的nginx再轉過一次


另外透過proxy_pass 到old的domain上 是在主機內部運作

有可能發生不認得old這個domain 只要加上resolve dns就可以了

ex

location ~* .(php)$ {

  resolver 8.8.8.8 valid=30s;

  proxy_set_header Host $host;

  proxy_pass https://old.com$request_uri;

}


至於轉址的部分 透過$request_uri就可以取得host後面的完整網址

$args則是取得?後面的query參數

注意的是如果使用$request_uri 就不需要$args

ex: https://old.com/hello/me?name=oz&tel=123

$request_uri = /hello/me?name=oz&tel=123

$args = name=oz&tel=123


2020年8月9日 星期日

nginx 設定檔讀取與ansible安裝範例

在安裝好nginx 可以看到/etc/nginx下包含了
nginx.conf
conf.d/
sites-enabled/
sites-available/
幾個目錄
通常我們做異動修改的都會是sites-available/下
檢視一下幾個目錄之間的關係
nginx讀取的設定檔入口是nginx.conf檔案
可以看到包含了
include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;
也就是說預設會去讀讀目錄是在sites-enabled
而在sites-enabled目錄下看到只有一個default的檔案

實際運作的方式
可以sites-available/ 下建立default.conf
然後把default.conf 做symblelink到sites-enabled/default
就可以
以 ansible做nginx的設定與安裝範例如下

---
- name: Install host nginx
  hosts: all
  become: yes
  tasks:
    - name: ensure nginx is at the latest version
      apt: name=nginx state=latest
    - name: start nginx
      service:
        name: nginx
        state: started
    - name: copy the nginx main config
      copy:
        src: ../../files/nginx/default.conf
        dest: /etc/nginx/sites-available/default.conf
    - name: remove old nginx conf
      file:
        path: /etc/nginx/sites-available/conf
        state: absent
    - name: copy conf folder to sites-available
      copy:
        src: ../../files/nginx/conf
        dest: /etc/nginx/sites-available
    - name: create symlink
      file:
        src: /etc/nginx/sites-available/default.conf
        dest: /etc/nginx/sites-enabled/default
        state: link
    - name: restart nginx
      service:
        name: nginx
        state: restarted

nginx 使用 rewrite return的差異

最近要將官網搬到另外一台主機上

但有些服務還是要回到原機器上

透過nginx的設定來達成預期目標

如果是method get 可以透過rewrite完成

ex:

server {
  server_name web.ozzysun.com
  location / {
      rewrite /api/send_get http://oldweb.ozzysun.com/api/send_get;
      rewrite /api/send_get2 http://oldweb.ozzysun.com/api/send_get2;
  }
}
如果要轉的url都是method:get 就可以在一個location內把要轉的都一起設定完
注意 只能對應get
如果是post的轉址 可以透過return去做
ex:
server {
  server_name web.ozzysun.com
  location /api/send_post {
      return 307 http://oldweb.ozzysun.com/api/send_post;
  }
}
但get可以透過return去轉嗎?
可以 但要把參數用$args帶過去
ex:

server {
  server_name web.ozzysun.com
  location /api/send_get {
      return 307 http://oldweb.ozzysun.com/api/send_get?$args;
  }
}
要注意的是rewrite真正的意義是
重整你的url 再交給下一個處理
當然 如果rewrite 有帶到http作用就跟return很像了

2020年8月8日 星期六

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use

原本將nginx以docker部署

調整改成用ansible部署到主機上

安裝啟動一直發生錯誤

/etc/nginx目錄下的檔案不齊全

還有在/run/下找不到nginx.pid

報錯為

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use

這是個低級錯誤

就是80 port已經被佔用

乾淨移除nginx的部分

可以執行以下指令

sudo apt-get remove nginx nginx-common

sudo apt-get purge nginx nginx-common

sudo apt-get autoremove


查看是哪個程序佔用了80 port

netstat -anp |grep 80


查看才發現原本被停用 docker container nginx 在開機時被啟用

把80port佔住了 才發生在主機上無法安裝nginx的錯誤

停掉container 就一切正常了


2020年8月5日 星期三

vagrant 網路設定與ssh連線

當使用vagrant跑起vm後
要透過ssh進入vm內
預設可以使用vagrant ssh就可以直接連線
vagrant ssh指令的運作是
預設已經將vm的port 22 轉接上host的port 2222
vagrant ssh實際上就是連上127.0.0.1:2222

但如果要讓vm 可以讓host同一個lan裡面的其他機器可以連接到
也就是必須給vm 一個同區網的ip
可以在Vagrantfile加上設定指定ip
config.vm.network :public_network, ip: "192.168.0.88"
這樣就可以透過 標準的ssh 指令連線
至於連線要使用的private key在哪裏
vagrant預設會將key放在安裝目錄下的
.vagrant/machines/default/virtualbox/private_key
完整的ssh連線
ssh -i .vagrant/machines/default/virtualbox/private_key vagrant@192.168.0.88
就可以進去了