Виртуальные хосты Apache2, доступные из локальной сети

С недавних пор пришлось озаботиться доступом к сайтам на локалхосте из локальной сети. Кому-то эго потешить, кому-то дать доступ к внутрикорпоративному порталу, кому-то просто, чтобы дома можно было работать не только за одним компьютером.
Итак, поехали.

Будем считать, что у нас есть сайт на виртуальном хосте. Например,, пусть это будет site.loc. Также даны два компьютера — один под Open SUSE (Apache2 + PHP + MySQL, IP: 192.168.0.100, например), второй — под WinXP (пусть это будет ноутбук, если кому-то интересно). Мне нужно, чтобы я мог зайти в phpMyAdmin и работать с админкой site.loc c ноутбука. Ну, или просто посмотреть из-под винды, как оно будет выглядеть 🙂

Настроим сеть

Для начала, на компьютере, откуда хотим получить доступ (в нашем случае, с WinXP), открываем файл C:/Windows/System32/drivers/etc/hosts и добавляем строчку после 127.0.0.1:

192.168.0.100 site.loc

Сохраняем файл. что тут написано — при наборе адреса «site.loc» идти на IP «192.168.0.100«. Это вместо того, чтобы поднимать DNS ради одного-двух-пяти сайтов.

Если второй компьютер на Linux — файл будет /etc/hosts, действия — те же.

phpMyAdmin

Если с phpMyAdmin все относительно просто — пишем http://192.168.0.100/phpMyAdmin (регистр тут важен) и все открывается, то с виртуальными хостами придется расковырять пару файлов.

Виртуальные хосты

site.loc, соответственно, живет на виртуальном хосте, который прописан так:

sudo nano /etc/apache2/vhosts.d/site.loc.conf

<VirtualHost 127.0.0.1:80>
	DocumentRoot /srv/www/vhosts/site.loc
	ServerName site.loc
	ServerAdmin mail@ya.ru
	<Directory /srv/www/vhosts/site.loc>
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>
	UserDir public_html
</VirtualHost>

Все прекрасно работает на локалхосте, но при попытке зайти на site.loc cо второго компьютера, нас ждет облом. Откроется страница, находящаяся в папке WWW (по умолчанию там будет написано «It worws!«). Вот тут-то мы и начинаем.

Для начала, апачу нужно сказать, какие порты слушать и на каких интерфейсах (он же не телепат, правильно?). Открываем файл /etc/apache2/listen.conf и видим там нечто следующее (исключая коммментарии, конечно):

sudo nano /etc/apache2/listen.conf

Listen 80
<IfDefine SSL>
	<IfDefine !NOSSL>
		<IfModule mod_ssl.c>
			Listen 443
		</IfModule>
	</IfDefine>
</IfDefine>

К этому всему добру надо указать апачу слушать два интерфейса — локальный (127.0.0.1), чтобы можно было смотреть сайт на локалхосте как раньше, и внешний (192.168.0.100), чтобы апач принимал запросы еще и с того интерфейса, который смотрит в локалку.

NameVirtualHost 192.168.0.100:80
NameVirtualHost 127.0.0.1:80

Можно добавить это в самый конец файла, можно в начало.

Чтобы апач слушал все интерфейсы на 80 порту — вместо того, что выше, добавляем

NameVirtualHost *:80

Этот вариант хорош именно в нашем случае, когда у нас по сути 2 интерфейса (значимых для дела) — 127.0.0.1 и 192.168.0.100

Чтобы все интерфейсы на всех портах (а надо ли?)

NameVirtualHost *

В принципе, все это описано в комментариях в этом же файле. Правда, на английском…

Теперь открываем известный нам уже файл /etc/apache2/vhosts.d/site.loc.conf и добавляем в него блок:

<VirtualHost 127.0.0.1:80>
	DocumentRoot /srv/www/vhosts/site.loc
	ServerName site.loc
	ServerAdmin mail@ya.ru
	<Directory /srv/www/vhosts/site.loc>
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>
	UserDir public_html
</VirtualHost>

Таким образом, должно получиться так:

sudo nano /etc/apache2/vhosts.d/site.loc.conf

<VirtualHost 192.168.0.100:80>
	DocumentRoot /srv/www/vhosts/site.loc
	ServerName site.loc
	ServerAdmin mail@ya.ru
	<Directory /srv/www/vhosts/site.loc>
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>
	UserDir public_html
</VirtualHost> 

<VirtualHost 127.0.0.1:80>
	DocumentRoot /srv/www/vhosts/site.loc
	ServerName site.loc
	ServerAdmin mail@ya.ru
	<Directory /srv/www/vhosts/site.loc>
		AllowOverride All
		Order allow,deny
		Allow from all
	</Directory>
	UserDir public_html
</VirtualHost>

Собственно, осталось перезапустить апач:

sudo /etc/init.d/apache2 restart

и проверять. Все должно работать на обоих компьютерах.

0

Виртуальные хосты Apache2, доступные из локальной сети: 31 комментарий

  1. Sasha

    Искал долго в интернете решение проблемы и нашел вот эту статью. Спасибо автору! Но вот только есть маленькая проблема: у меня на компьютере нет файлов site.loc и site.loc.conf. Могли бы Вы помочь в данной ситуации? Заранее благодарен.

  2. merinovkv

    site.loc — это папка
    site.loc.conf — это конфиг виртуального хоста
    Конфиг виртуального хоста можно сделать или руками, или доверить это дело Yast (Сервер HTTP)

  3. Sasha

    Все, вроде, сделал. Но при попытке зайти на site.loc со второго компа chrome выдает ошибку: «К сожалению, Google Chrome не может открыть страницу site.loc». Проверял ping-ом: все нормально. Не подскажете, что делать?

        1. merinovkv Автор записи

          куда уж подробнее-то? )))
          site.loc — это папка, где лежит ваш сайт.
          site.loc.conf — это файл с конфигурацией вашего виртуального хоста для сайта site.loc
          соответственно, с локалхоста сайт должен открываться по пути http://site.loc (loc — это вымышленный домен первого уровня, чтобы обозначить, что он локальный, чтобы не было путаницы и если например я начну делать yandex.ru — я назову его yandex.loc, чтобы браузер не ломился на внешку)

          site.loc.conf должен быть тут: /etc/apache2/vhosts.d/site.loc.conf (именно тут апач хранит конфиги для виртуальных хостов)

          папка site.loc может храниться где угодно, у меня она лежит в папке /srv/www/vhosts/site.loc
          где она должна лежать у вас — смотрите конфиг самого Апача. Мне удобнее было смонтировать отдельный раздел под это дело и складывать все туда.

          В файле site.loc.conf по умолчанию лежит конфиг, который я привел в статье. Описал, как должен выглядеть конфиг после правки.

  4. Sasha

    я когда файл site.loc.conf добавляю в vhosts.d, тогда у меня и прекращает работать апач. на перезагрузку, командная строка говорит «Job failed. See system journal and ‘systemctl status’ for details.». А в логе написано «[Wed Nov 28 13:34:15 2012] [notice] caught SIGTERM, shutting down». Что делать? сейчас сам попытаюсь исправить, но надеюсь на вашу поддержку)

    1. Sasha

      А вот это мне говорит командная строка на команду systemctl status:
      apache2.service — apache
      Loaded: loaded (/lib/systemd/system/apache2.service; enabled)
      Active: failed (Result: exit-code) since Wed, 28 Nov 2012 13:39:09 +0400; 2min 51s ago
      Process: 9608 ExecStop=/usr/sbin/httpd2 -D SYSTEMD -k stop (code=exited, status=0/SUCCESS)
      Process: 9911 ExecStart=/usr/sbin/start_apache2 -D SYSTEMD -k start (code=exited, status=1/FAILURE)
      Main PID: 6908 (code=exited, status=0/SUCCESS)
      CGroup: name=systemd:/system/apache2.service

    2. merinovkv Автор записи

      [notice] caught SIGTERM, shutting down — это сообщение информационное. Оно сообщает о том, что апач завершился.
      Там же наверняка ДО этой строки есть какое-то объяснение, почему он «shutting down».
      Что вы написали в site.loc.conf?

      1. Sasha

        sudo nano /etc/apache2/vhosts.d/Like.loc.conf

        DocumentRoot /srv/www/my_test/Like.loc/Main.html
        ServerName МОЕ ДОМЕННОЕ ИМЯ
        ServerAdmin МОЕ МЫЛО

        AllowOverride All
        Order allow,deny
        Allow from all

        ErrorLog /var/log/apache2/error.log
        LogLevel notice
        CustomLog /var/log/apache2/access.log combined
        UserDir public_html

        DocumentRoot /srv/www/my_test/Like.loc/Main.html
        ServerName МОЕ ДОМЕННОЕ ИМЯ
        ServerAdmin МОЕ МЫЛО

        AllowOverride All
        Order allow,deny
        Allow from all

        ErrorLog /var/log/apache2/error.log
        LogLevel notice
        CustomLog /var/log/apache2/access.log combined
        UserDir public_html

        Только у меня сайт не site.loc, а Like.loc. И файл conf соответственно так же называется

    1. merinovkv Автор записи

      /srv/www/htdocs/
      и
      /srv/www/my_test/
      ничего не напоминает?

      что за my_test?
      Откуда он взялся? Он вообще есть в конфиге апача?

      /srv/www
      это мой путь. У вас он такой же?

  5. merinovkv Автор записи

    А до внесения изменений вообще сайты какие-нибудь работали на локалхосте?
    До того, как появились попытки виртуальный хост в сеть вывести, он вообще работал?
    Что-то мне подсказывает, что не работало…

  6. ЩмукРуфв

    Если апач слушает на 80 порту все интерфейсы, а их по ТЗ всего 2. то делать в конф файле виртуального хоста 2 одинаковых блока, но на разные адреса особого смысла нет.
    Можно написать

Добавить комментарий