---
title: "OpenStack 수동 설치 7 — Horizon 웹 대시보드 설치"
description: "Horizon을 설치하고 "
date: "2026-08-07"
last_modified: "2026-08-27T19:01:00.000Z"
type: "Post"
tags:
  - "openstack"
  - "install"
  - "ubuntu"
categories:
  - "📗 Docs"
series:
  - "오픈스택 설치"
canonical_url: "https://blog.pieroot.xyz/openstack-horizon-install"
markdown_url: "https://blog.pieroot.xyz/openstack-horizon-install.md"
---

# OpenStack 수동 설치 7 — Horizon 웹 대시보드 설치

Horizon을 설치하고 

Keystone, Glance, Placement, Nova, Neutron, Cinder 설치가 끝났다면 운영·검증을 편하게 하기 위해 Horizon을 추가한다. Horizon은 별도 OpenStack API 서비스가 아니라 기존 서비스의 API를 호출하는 Django 기반 웹 대시보드다.

따라서 DB, 서비스 사용자, 엔드포인트를 새로 만들지 않고 패키지와 웹 설정만 구성하면 된다.

### 이 글에서 다루는 내용

- Horizon과 기존 서비스의 연결 구조

- `openstack-dashboard` 설치

- `local_settings.py` 설정

- Apache와 Memcached 연동

- 브라우저 로그인과 서비스 패널 검증

> **전제 환경**
> 
> - OpenStack 2026.1 (Gazpacho)
> 
> - Keystone, Glance, Placement, Nova, Neutron 설치 완료
> 
> - controller `192.168.56.101`
> 
> - Keystone admin 계정과 `ADMIN_PASS` 준비

### Horizon은 왜 DB와 엔드포인트가 없을까

Horizon은 API를 제공하는 서비스가 아니라 브라우저 요청을 OpenStack API로 변환하는 클라이언트다.

```mermaid
flowchart LR
    B["브라우저"] --> H["Horizon<br>Apache mod_wsgi"]
    H --> K["Keystone :5000"]
    H --> S["Glance · Nova · Neutron"]
    H --> M["Memcached :11211"]
```

- 인증은 Keystone에 위임한다.

- 서비스 주소는 Keystone 카탈로그에서 읽는다.

- 로그인 세션은 Memcached에 저장한다.

- Horizon 자체 DB나 서비스 사용자는 만들지 않는다.

### 1. 패키지 설치

controller에서 실행한다.

```bash
sudo apt install -y openstack-dashboard
```

### 2. `local_settings.py` 설정

`/etc/openstack-dashboard/local_settings.py`에서 아래 값을 찾거나 추가한다.

```python
OPENSTACK_HOST = "controller"
ALLOWED_HOSTS = ['*']

SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
        'LOCATION': 'controller:11211',
    }
}

OPENSTACK_KEYSTONE_URL = "http://%s:5000/v3" % OPENSTACK_HOST
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True

OPENSTACK_API_VERSIONS = {
    "identity": 3,
    "image": 2,
    "volume": 3,
}

OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
TIME_ZONE = "Asia/Seoul"
```

> 공식 문서의 `/identity/v3` 예시는 배포 방식에 따라 다르다. 현재 Keystone이 포트 5000의 `/v3`에서 동작한다면 `http://%s:5000/v3`를 사용한다.

`ALLOWED_HOSTS = ['*']`는 실습에 편리하지만 운영 환경에는 적합하지 않다. 운영에서는 실제 도메인과 IP만 허용한다.

### 3. Apache 설정 확인

`/etc/apache2/conf-available/openstack-dashboard.conf`에 아래 항목이 있는지 확인한다.

```javascript
WSGIApplicationGroup %{GLOBAL}
```

설정 검사 후 Apache를 다시 불러온다.

```bash
sudo apache2ctl configtest
sudo systemctl reload apache2
```

### 4. HTTP 응답 확인

```bash
systemctl status apache2
systemctl status memcached
curl -sI http://controller/horizon | head
```

200 또는 로그인 페이지로 이동하는 302 응답이면 정상이다.

### 5. 브라우저 로그인

호스트 PC에서 다음 주소로 접속한다.

```
http://192.168.56.101/horizon
```

![image](https://blog.pieroot.xyz/api/image-proxy?id=6b3f6c66-f913-4ce1-8836-a3c2c73d37ff&kind=s3&pageId=102ffc4d-40e1-46e6-9132-4905e2fee75b&source=block&blockId=3e7e468c-abf5-4e6b-9ba2-83c8da2a2031)

- Domain: `default`

- User: `admin`

- Password: `ADMIN_PASS`

로그인 후 다음 항목을 확인한다.

### 오류 확인 순서

```bash
sudo tail -100 /var/log/apache2/error.log
openstack catalog list
```

### 핵심 정리

1. Horizon은 API 서비스가 아니라 Django 웹 클라이언트다.

1. Keystone URL, Memcached, `ALLOWED_HOSTS`가 핵심 설정이다.

1. 로그인 후 각 패널이 보이면 이전 단계의 서비스 연동까지 함께 검증할 수 있다.

### 재발 방지 체크리스트

- [ ] `openstack-dashboard`가 설치됐다.

- [ ] Keystone URL이 현재 배포 경로와 일치한다.

- [ ] Memcached 세션 설정이 하나만 존재한다.

- [ ] Apache 설정 검사를 통과했다.

- [ ] 호스트 PC에서 Horizon 로그인에 성공했다.

- [ ] 이미지, 하이퍼바이저, 네트워크 패널이 정상이다.

### 설치 시리즈 완료

이제 OpenStack 설치 시리즈에는 **Keystone → Glance → Placement → Nova → Neutron → Cinder → Horizon**의 수동 설치 과정이 갖춰졌다. Provider 네트워크에서 첫 인스턴스를 부팅하고, Cinder 볼륨을 attach한 뒤 Horizon의 이미지·하이퍼바이저·네트워크·볼륨 패널로 전체 상태를 함께 검증하면 된다.

### 참고 자료

- [Horizon Installation Guide](https://docs.openstack.org/horizon/2026.1/install/)

- [Install Horizon on Ubuntu](https://docs.openstack.org/horizon/2026.1/install/install-ubuntu.html)

- [Verify Horizon](https://docs.openstack.org/horizon/2026.1/install/verify-ubuntu.html)
