---
# System prepended metadata

title: Unit設定
tags: [unit, nginx]

---

# Unit設定
 
 [toc]
###### tags:  `unit` `nginx`
### 1. Unit是一種基於微服務的框架  
![NGINX/UNIT](https://i.imgur.com/tncUX9o.png)

NGINX Unit可以用在多種場景中，Unit是一種基於微服務的框架，每個服務一個Unit，每個Unit 可使用不同的程式語言，現在可支援的有
* Go 1.6 or later
* Java 8 or later
* Node.js 8.11 or later
* PHP 5, 7
* Perl 5.12 or later
* Python 2.6, 2.7, 3.x
* Ruby 2.0 or later  
最後在由Nginx 整合所有的Unit，保有Nginx的效能與Unit的彈性。

### 2. 安裝Nginx-Unit
安裝Nginx-Unit的方法在Nginx-Unit的官方網站中說明得非常清楚。   
https://unit.nginx.org/installation/
可以直接安裝binary檔，也能自行compiler，個人建議直接裝編譯好的binary檔就好。  
以centos8為例，新增一個設定檔 nano /etc/yum.repos.d/unit.repo
內容如下  
```
[unit]
name=unit repo
baseurl=https://packages.nginx.org/unit/centos/$releasever/$basearch/
gpgcheck=0
enabled=1
然後執行安裝指令
yum -y install unit
yum -y install unit-devel unit-go unit-jsc8 unit-jsc11 unit-perl unit-php unit-python27 unit-python36
安裝好後
systemctl enable unit
systemctl start unit
```
ubuntu可參考 unit.nginx.org中的方法
[https://unit.nginx.org/installation/#ubuntu-2204](https://unit.nginx.org/installation/#ubuntu-2204)  
這樣就裝好了!下一篇來跑個 Hello World 第一個微服務吧!

### 3. Unit的指令  
Unit 的配置基於 JSON，可透過RESTful控制API ，並且由HTTP進行管理，控制API提供了四個主要選項  

| 選項 | 描述 |  
| --- | --- |
|/certificates|	負責TLS/SSL證書管理|
|/config	|設定與查詢一般配置管理|
|/control	|查詢應用程序重啟|
|/status	|查詢使用情況與統計資料|

第一步，我們將 Unit 配置為提供靜態網頁。假設您將其保存為/www/data/index.html
```htmlembedded=
<!DOCTYPE html>
<html>
   <head>
      <title>Welcome to NGINX Unit!</title>
   </head>
   <body>
      <h1>Welcome to NGINX Unit!</h1>
      <p>If you see this page, the NGINX Unit web server is successfully
         installed and working.  Further configuration is required.
      </p>
      <p>For online documentation and support, please refer to
         <a href="https://unit.nginx.org/">unit.nginx.org</a>.<br/>
      </p>
      <p><em>Thank you for using NGINX Unit.</em></p>
   </body>
</html>
```
*  /config 的使用方法  
Unit 需要監聽一個埠，該埠將傳入請求路由到一個share操作。  
“listeners” 監聽 ip:port pass 到 “routes”  
“routes” 路由動作action share “/www/data$uri”  
其中 $uri 為相對路徑
```jsonld=
{
    "listeners": {
        "*:80": {
            "pass": "routes"
        }
    }, 

    "routes": [
        {
            "action": {
                "share": "/www/data$uri"
            }
        }
    ]
}
```
將其保存並上傳為config.json，配置 Unit，PUT請將此config通過控制命令PUT到該部分。  
```
[centos]
curl -X PUT --data-binary @config.json --unix-socket /var/run/unit/control.sock http://localhost/config

[ubuntu]
curl -X PUT --data-binary @config.json --unix-socket /var/run/control.unit.sock http://localhost/config

```
若出現下列訊息表示設定成功，這裡要注意--unix-socket後面的/var/run/unit/control.sock會隨著不同的OS位置不同，請務必注意!

```
      {
          "success": "Reconfiguration done."
      }
```
可用瀏覽器看看是否成功!

* 來觀看現在 unit 的相關設定  
用指令   

```[centos]curl --unix-socket /var/run/unit/control.sock http://localhost/```   
```[ubuntu]curl --unix-socket /var/run/control.unit.sock http://localhost/```   


來觀看現在 unit 的相關設定
```jsonld=
{
        "certificates": {},
        "config": {
                "listeners": {
                        "*:80": {
                                "pass": "routes"
                        }
                },

                "routes": [
                        {
                                "action": {
                                        "share": "/home/kevin/html$uri"
                                }
                        }
                ]
        },

        "status": {
                "connections": {
                        "accepted": 6,
                        "active": 0,
                        "idle": 0,
                        "closed": 6
                },

                "requests": {
                        "total": 8
                },

                "applications": {}
        }
}
```
出現了 certificates config status 三個控制指令!  

* /control 的使用方法  
control指令用來重啟unit中的微服務  
**/control指令命令applications裡的app_name要求重啟**  
```bash=
curl -X GET --unix-socket /path/to/control.unit.sock http://localhost/control/applications/app_name/restart  
```
例如：  
```bash=
[centos]
curl -X GET --unix-socket /var/run/unit/control.sock http://localhost/control/applications/python/restart

[ubuntu]
curl -X GET --unix-socket /var/run/control.unit.sock http://localhost/control/applications/python/restart 

```  
  

執行下列指令  
**看unit 的設定**  
[centos]
curl --unix-socket /var/run/unit/control.sock http://localhost/config  
[ubuntu]
curl --unix-socket /var/run/control.unit.sock http://localhost/config  


### 4. 配置管理
Unit 的配置是基於 JSON 的，通過control socket訪問，並且完全可以通過 HTTP 進行管理

要處理部分配置，請通過 HTTP 查詢控制套接字；您對 API 的請求的 URI 路徑段必須是其JSON成員的名稱或其JSON元素的索引。
您可以使用以下 HTTP 方法操作 API：
方法	動作
GET	Returns the entity at the request URI as a JSON value in the HTTP response body.
POST	Updates the array at the request URI, appending the JSON value from the HTTP request body.
PUT	Replaces the entity at the request URI and returns status message in the HTTP response body.
DELETE	Deletes the entity at the request URI and returns status message in the HTTP response body.

在 centOS 或 Amalinux 中執行下列指令，可看到 unit 的設定  
curl --unix-socket /var/run/unit/control.sock http://localhost/config  
新增設定  
curl -X PUT -d '{ "pass": "routes" }' --unix-socket /var/run/unit/control.sock http://localhost/config/listeners/*:80  
刪除剛剛的設定  
curl -X DELETE -d '{ "pass": "routes" }' --unix-socket /var/run/unit/control.sock http://localhost/config/listeners/*:80  
我們透過這個例子可看出，unit可在不重啟的情況下更改unit的設定。  

以下為 unit 的一些設定例子  
(A)
```jsonld=
config2.json

{
        "listeners": {
                "*:80": {
                        "pass": "routes"
                }
        },

        "routes": [
                {
                        "match": {
                                "uri": "/static/*"
                        },

                        "action": {
                                "share": "/home/kevin$uri"
                        }
                },
                {
                        "action": {
                                "share": "/home/kevin/html$uri"
                        }
                }
        ]
}
```

/home/kevin/html
/home/kevin/static/

Set
curl -X PUT --data-binary @config2.json --unix-socket  /var/run/unit/control.sock http://localhost/config
READ Config
curl --unix-socket /var/run/unit/control.sock http://localhost/config

這個例子會將
http://host/static/uri -> /home/kevin/static/uri
http://host/ uri -> /home/kevin/html/uri
  
(B)
```jsonld=
config3.json
{
        "listeners": {
                "*:80": {
                        "pass": "routes"
                }
        },

        "routes": [
                {
                        "match": {
                                "uri": "/static/*"
                        },

                        "action": {
                                "share": "/home/kevin$uri"
                        }
                },
                {
                        "action": {
                                "pass": "applications/pythonapp"
                        }
                }
        ],

        "applications": {
                "pythonapp": {
                        "type": "python",
                        "path": "/home/kevin/project/",
                        "home": "/home/kevin/env/",
                        "module": "app",
                        "user": "kevin"
                }
        }
}
```

```python=
/home/kevin/project/app.py
def application(environ, start_response):
    status = '200 OK'
    headers = [('Content-Type', 'text/html; charset=utf8')]
    start_response(status, headers)
    path_info = environ['PATH_INFO']
    query_string = environ['QUERY_STRING']
    return [b'<h1>Hello, World!',b'PATH_INFO:',path_info.encode(),b'QUERY_STRING:',query_string.encode(),b'</h1>']
```

這部分與python內建的wsgiserver不同，直接用 unit 當這個 micro service的 server。
/home/kevin/project/
/home/kevin/static/

Set
```bash=
curl -X PUT --data-binary @config3.json --unix-socket  /var/run/unit/control.sock http://localhost/config
[READ Config]
curl --unix-socket /var/run/unit/control.sock http://localhost/config 
```
 



```
To check out the sample app, run these commands:

 sudo service unit restart
 cd /usr/share/doc/unit-python3.10/examples
 sudo curl -X PUT --data-binary @unit.config --unix-socket /var/run/control.unit.sock http://localhost/config
 curl http://localhost:8400/
 
 example:
 {
        "applications": {
                "example_python": {
                        "type": "python 3.10",
                        "processes": 2,
                        "path": "/usr/share/doc/unit-python3.10/examples/python-app",
                        "module": "wsgi"
                }
        },

        "listeners": {
                "*:8400": {
                        "pass": "applications/example_python"
                }
        }
}
 
 ```
 