| layout | documentation |
|---|---|
| title | Apache Reverse Proxy |
These are the steps required to use Apache 2.4, a HTTP server, although you can use NGINX server or any other HTTP server which supports reverse proxying. If you are familiar with Apache/basic reverse proxy config and are only interested in OpenHAB specific caveats/directives skip to OpenHAB settings
[[toc]]
Apache runs as a service in most Linux distributions, installation should be as simple as:
sudo apt-get update && sudo apt-get install apache2
sudo service apache2 startfor Ubuntu/Debian based Linux, or
sudo yum install httpd
sudo systemctl enable httpd
sudo systemctl start httpdfor Fedora/CentOS/Red Hat Enterprise
Once installed, you can test to see if the service is running correctly by going to http://mydomain_or_myip, you should see the apache2 default page.
::: warning Security Warning It is not recommended to expose solely the configuration below to the internet. :::
Apache runs based on configuration files.
The location of the default setup is typically /etc/apache2/sites-available/000-default.conf. To allow Apache to proxy openHAB, you need to edit or replace this file. Common practice is to use the domain name of the website it serves, appended with ".conf" - for example, "mydomain.conf"
The configuration below assumes that you run the reverse proxy on the same machine as your openHAB runtime.
If this doesn't fit for you, you just have to replace localhost with your openHAB instance hostname or ip. Remember to replace mydomain with your actual domain.
<VirtualHost *:80>
ServerName mydomain
<Location />
ProxyPass "http://localhost/"
ProxyPassReverse "http://localhost/"
</Location>
ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log
CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined
</VirtualHost>The command apachectl configtest can be used to verify any config you write. To enable your new website a2ensite <config file name>. Once enabled, you will not have to enable your website again. Configuration can be reloaded with systemctl reload apache2. Please make sure to reload and clear browser cookies after every change.
Authentication is recommended for additional security. There are many ways to authenticate to a proxy, but basic auth is sufficient as long as it is over https. Note the below documentation about OpenHAB specific auth headers.
To add users to your reverse proxy, you must use following command. Use the -c modifier only for your first user. It will create a new password file. Do not use the -c modifier again as this will remove all previously created users. Don't forget to change username to something meaningful!
sudo htpasswd -c /etc/apache2/.htpasswd usernamesudo htpasswd /etc/apache2/.htpasswd usernameand to delete an existing user:
sudo htpasswd -D /etc/apache2/.htpasswd usernameThe below directives set the auth type to basic, set the auth name, point to our credentials file, and require a user to be authenticated before allowing them to access OpenHAB
<Location />
AuthType Basic
AuthName "Proxy Auth"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>In the interest of not duplicating documentation, please see the nginx encryption documentation for certificate generation options. The certificate directives for Apache are:
SSLEngine on
SSLCertificateFile /path/to/cert
SSLCertificateKeyFile /path/to/keyFor more details, read the apache mod_ssl docs
These settings are required due to the quirks and features of proxies and/or OpenHAB.
If you use authentication with your reverse proxy, the following two directives are necessary in OpenHAB 3.0 and later.
Header set Set-Cookie "X-OPENHAB-AUTH-HEADER=1"
This ensures that OpenHAB uses an alternative auth header, so it does not conflict with your proxy authentication credentials.
RequestHeader unset Authorization
This ensures that your proxy does not send your proxy authentication credentials to OpenHAB, interfering with login (and potentially sending them in plain text across a network).
Below is a minimal configuration for a reverse proxy that listens for https requests only, uses basic auth, and proxies to 8080 (default OpenHAB http port).
<VirtualHost *:443>
ServerName mydomain
SSLEngine on
SSLCertificateFile /path/to/cert
SSLCertificateKeyFile /path/to/key
Header set Set-Cookie "X-OPENHAB-AUTH-HEADER=1"
RequestHeader unset Authorization
<Location />
ProxyPass "http://localhost:8080/"
ProxyPassReverse "http://localhost:8080/"
AuthType Basic
AuthName "Proxy Auth"
AuthUserFile /etc/apache2/.htpasswd
Require valid-user
</Location>
ErrorLog ${APACHE_LOG_DIR}/mydomain-error.log
CustomLog ${APACHE_LOG_DIR}/mydomain-access.log combined
</VirtualHost>