Horizon 은 Django 로 만든 OpenStack 웹 대시보드다. 관리자와 사용자가 브라우저에서 인스턴스 · 네트워크 · 볼륨 · 이미지를 다룰 수 있다. Apache 아래에서 WSGI 로 동작하고 세션은 Memcached 에 둔다. 최소 배포에는 필요 없지만 공식 가이드가 설치를 권한다.
현행 릴리스는 2026.1 Gazpacho 다[1].
| 구성 요소 | 역할 |
|---|---|
| openstack-dashboard | Django 애플리케이션. /dashboard (RHEL 계열) 또는 /horizon (Ubuntu) 경로로 서비스 |
| Apache mod_wsgi | WSGI 호스팅 |
| Memcached | 세션 저장소 |
Ubuntu 24.04
apt install openstack-dashboard
CentOS Stream 9 · RHEL 9
dnf install openstack-dashboard
설정 파일은 Ubuntu 가 /etc/openstack-dashboard/local_settings.py, RHEL 계열이 /etc/openstack-dashboard/local_settings 다. 다음 항목을 고친다.
OPENSTACK_HOST = "controller"
# 접속을 허용할 호스트. 모두 허용하려면 ['*']
ALLOWED_HOSTS = ['one.example.com', 'two.example.com']
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.PyMemcacheCache',
'LOCATION': 'controller:11211',
}
}
# Keystone 엔드포인트. 공식 문서 예시는 "http://%s/identity/v3" 이나 이 환경은 5000 포트다
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"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
TIME_ZONE = "Asia/Seoul"
네트워크 옵션 1 (provider network) 을 골랐다면 L3 관련 기능을 끈다. 옵션 2 면 기본값을 둔다.
OPENSTACK_NEUTRON_NETWORK = {
'enable_router': False,
'enable_quotas': False,
'enable_ipv6': False,
'enable_distributed_router': False,
'enable_ha_router': False,
'enable_fip_topology_check': False,
}
RHEL 계열은 WEBROOT 도 맞춘다.
WEBROOT = '/dashboard/'
Apache 설정에 WSGIApplicationGroup 이 없으면 추가한다. Ubuntu 는 /etc/apache2/conf-available/openstack-dashboard.conf, RHEL 계열은 /etc/httpd/conf.d/openstack-dashboard.conf 다.
WSGIApplicationGroup %{GLOBAL}
Ubuntu 24.04 — 정적 파일을 모으고 압축한 뒤 Apache 를 다시 읽는다.
/usr/share/openstack-dashboard/manage.py collectstatic
/usr/share/openstack-dashboard/manage.py compress
systemctl reload apache2.service
CentOS Stream 9 · RHEL 9
systemctl restart httpd.service memcached.service
RHEL 계열에서 firewalld 를 쓰면 80/tcp 를 연다.
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
브라우저로 접속한다. Ubuntu 는 http://controller/horizon, RHEL 계열은 http://controller/dashboard 다. 도메인 default, 사용자 admin 또는 myuser 로 로그인한다.
CentOS Stream 8 · Victoria 의 /etc/openstack-dashboard/local_settings 에서 기본값과 다르게 둔 부분이다. 캐시 백엔드가 MemcachedCache 였고, 현행 릴리스는 PyMemcacheCache 를 쓴다.
DEBUG = False
ALLOWED_HOSTS = ['*', 'localhost']
LOCAL_PATH = '/tmp'
SECRET_KEY='${MASKED}'
EMAIL_BACKEND = 'django.core.mail.backends.console.EmailBackend'
OPENSTACK_HOST = "controller"
OPENSTACK_NEUTRON_NETWORK = {
'enable_auto_allocated_network': False,
'enable_distributed_router': False,
'enable_fip_topology_check': True,
'enable_ha_router': False,
'enable_ipv6': True,
'enable_quotas': True,
'enable_rbac_policy': True,
'enable_router': True,
'default_dns_nameservers': [],
'supported_provider_types': ['*'],
'segmentation_id_range': {},
'extra_provider_types': {},
'supported_vnic_types': ['*'],
'physical_networks': [],
}
TIME_ZONE = "UTC"
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
'LOCATION': 'controller:11211',
}
}
OPENSTACK_KEYSTONE_MULTIDOMAIN_SUPPORT = True
OPENSTACK_API_VERSIONS = {
"identity": 3,
"image": 2,
"volume": 3,
}
OPENSTACK_KEYSTONE_DEFAULT_DOMAIN = "Default"
OPENSTACK_KEYSTONE_DEFAULT_ROLE = "user"
WEBROOT = '/dashboard'
/etc/httpd/conf.d/openstack-dashboard.conf
WSGIDaemonProcess dashboard
WSGIProcessGroup dashboard
WSGISocketPrefix run/wsgi
WSGIApplicationGroup %{GLOBAL}
WSGIScriptAlias /dashboard /usr/share/openstack-dashboard/openstack_dashboard/wsgi/django.wsgi
Alias /dashboard/static /usr/share/openstack-dashboard/static
<Directory /usr/share/openstack-dashboard/openstack_dashboard/wsgi>
Options All
AllowOverride All
Require all granted
</Directory>
<Directory /usr/share/openstack-dashboard/static>
Options All
AllowOverride All
Require all granted
</Directory>
현행 릴리스 2026.1 Gazpacho — 2026-09-20 확인. https://docs.openstack.org/horizon/2026.1/install/ ↩︎