---
# System prepended metadata

title: VM & LB configuration
tags: [azure]

---

# VM & LB configuration
#### npm & pm2 설치
```
sudo apt install curl
curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -
sudo apt install -y nodejs
sudo npm install pm2 -g
```

#### Repository 설정 및 실행
- Jenkins의 ssh rsa public key를 vm의 ~/.ssh/authorized_keys에 등록
- Doss의 Personal access token으로 repository clone
- Project Build & Run
    ```
    npm i
    npm run build
    pm2 start /home/$USER/workspace/server-name/ecosystem.config.js --time --watch
    ```
- Run configuration
    ```
    # ecosystem.config.js
    module.exports = {
        apps : [
            {
                name: "server-name",
                script: "node ./dist/main",
                watch: ["./dist"],
                env: {
                    "NODE_ENV": "development",
                },
                env_production: {
                    "NODE_ENV": "production",
                },
                out_file: process.env.BLOBPATH + "/output.log",
                error_file: process.env.BLOBPATH + "/error.log"
            }
        ]
    }
    ```

#### MySQL 방화벽 설정 (optional)
- Azure Console 에서 VM public ip 허용 등록
- Mysql에 User 추가
    ```
    CREATE USER 'username'@'vm ip address' IDENTIFIED BY 'password';
    GRANT ALL ON dbname.* TO 'username'@'vm ip address';
    COMMIT;
    ```

#### NginX 설정
- 설치 & 실행
    ```
    sudo apt install nginx
    sudo systemctl start nginx
    ```
- SSL 셋팅 (optional)
    - [SSL 생성방법 링크](https://hackmd.io/-9JVhw9yRGyMOmQr-XGvcQ?view)
    - cert.pem파일과 key.pem파일 준비
- Nginx proxy 설정
    ```
    # /etc/nginx/sites-available/default
    upstream server_name {
      server 127.0.0.1:3000; # 3000번 포트의 웹서버
    }

    server {
      listen 443 ssl;
      ssl_certificate /home/hasadmin/workspace/cert_file.cert.pem;
      ssl_certificate_key /home/hasadmin/workspace/key_file.key.pem;
      location / {
        proxy_set_header        Host                    $host;
        proxy_set_header        X-Real-IP               $remote_addr;
        proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto       $scheme;
        # 443 포트로 들어오는 request를 3000번 포트의 웹서버로 proxy
        proxy_pass http://server_name; 
      }
      client_max_body_size 20M;
    } 

    server {
      listen 80;
      location / {
        proxy_set_header        Host                    $host;
        proxy_set_header        X-Real-IP               $remote_addr;
        proxy_set_header        X-Forwarded-For         $proxy_add_x_forwarded_for;
        proxy_set_header        X-Forwarded-Proto       $scheme;
        # 80 포트로 들어오는 request를 3000번 포트의 웹서버로 proxy
        proxy_pass http://server_name;
      }
      client_max_body_size 20M;
    }
    ```
- 재시작 & 상태확인
    ```
    sudo systemctl restart nginx
    # /etc/nginx/sites-enabled/default 파일에 위 설정이 적용되었는지 확인
    systemctl status nginx.service
    ```
    
#### VM 생성 및 IP 할당 시 주의사항
- Load Balancer와 VM간 연결가능한 case
    1) public ip 없는 VM들은 LB stadard(NIC)로 붙일 수 있음
    2) public ip + avaialbilty set(fault domain 1개)이면 basic, std LB 모두 붙일 수 있음
- Load Balancer와 VM간 불가능한 case
    1) public ip + no or different availability set/zone
       ![](https://i.imgur.com/bmD8nwQ.png =200x)
    2) SKU 타입이 LB와 VM의 public IP간 상이할 때
       ![](https://i.imgur.com/MoNy6O4.png =200x)
- VM 생성 시 가용성 및 public ip SKU 확인
    ![](https://i.imgur.com/qM568YY.png =600x)
    
    ![](https://i.imgur.com/xkydNhK.png =230x)
- LB 생성 시 SKU 확인
    ![](https://i.imgur.com/GUxCmbq.png =600x)