1
  • Nextcloud is currently being served at my-domain.dev/nextcloud.
  • I'd like to have it be served at cloud.my-domain.dev.
  • I've already set up an A record for cloud.my-domain.dev to point to my servers' IP address.
  • Sitting alongside my /var/www/nextcloud, I've also got a /var/www/my-domain.dev, my main site which I've set up to use HTTPS using Let's-Encrypt.
  • I'm using Server version: Apache/2.4.41 (Ubuntu).

Now I need to set up the vhosts to play together. I'm assuming I'll have to convert the nextcloud.conf to sit within a virtual host, maybe under a different port? How do I proceed?

nextcloud.conf as recommended by nextcloud.

Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>    

  SetEnv HOME /var/www/nextcloud
  SetEnv HTTP_HOME /var/www/nextcloud

</Directory>

my-domain.dev.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName my-domain.dev
    ServerAlias www.my-domain.dev
    DocumentRoot /var/www/my-domain.dev
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

WHAT WORKED FOR ME:

Andrew Schulman's answer almost worked for me, I just had to make a few small changes:

  • Remove "Require all granted".
  • Move "AllowOverride All" and "Options FollowSymLinks MultiViews" into a directory tag.

Could someone explain why these steps were necessary?

Thanks Andrew!

nextcloud.conf:
  1 <VirtualHost *:80>
  2         ServerAdmin webmaster@b-t.dev
  3         ServerName cloud.b-t.dev
  4         DocumentRoot /var/www/nextcloud
  5
  6         #ErrorLog ${APACHE_LOG_DIR}/error.log
  7         #CustomLog ${APACHE_LOG_DIR}/access.log combined
  8
  9         <Directory "/var/www/nextcloud">
 10                 AllowOverride All
 11                 Options FollowSymLinks MultiViews
 12         </Directory>
 13
 14         #Satisfy Any
 15
 16         <IfModule mod_dav.c>
 17                 Dav off
 18         </IfModule>
 19
 20         SetEnv HOME /var/www/nextcloud
 21         SetEnv HTTP_HOME /var/www/nextcloud
 22 </VirtualHost>

1 Answer 1

1

You just need to add a new VirtualHost definition, in place of the Alias and Directory directives:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  ServerName cloud.my-domain.dev
  DocumentRoot /var/www/nextcloud

  Require all granted
  AllowOverride All
  Options FollowSymLinks MultiViews

  <IfModule mod_dav.c>
    Dav off
  </IfModule>    

  SetEnv HOME /var/www/nextcloud
  SetEnv HTTP_HOME /var/www/nextcloud
</VirtualHost>

Both virtual hosts can run on port 80. That's how name-based virtual hosting works - it lets you run multiple hosts on the same IP address and port. Apache matches the value of the Host header that the client sends against the ServerName and ServerAlias directives, to determine which virtual host to serve them.

You should read the Apache Virtual Host documentation, especially the part about name-based virtual hosts.

2
  • Thanks Andrew, I built upon this construction, as you can see in the update of my post. Would you mind taking a look and seeing why those changes were necessary and your solution didn't work as expected? Just trying to understand.
    – Karoh
    Dec 8, 2020 at 6:37
  • 1
    My mistake. The docs for Require and AllowOverride show that they only apply in a directory context, not virtual host. Options is allowed in a virtual host, though. Dec 8, 2020 at 13:02

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.