Удобный веб сервер на Virtualbox

от автора

nginx
Когда делаешь простые сайты на WordPress, то с вебсервером все просто, поставил себе Xampp и споконо работаешь.

Но приходит момент когда начинаешь заниматься серьезными проектами, а там уже конигурация на сервере не совсем обычная и пользоваться Xampp не совсем удобно, к тому же у меня аллергия на Apache.

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

Что именно хочется:

  • Поддержку нормальных url типа sitename.ru
  • Не редактировать /etc/hosts
  • Не редактировать конфиги nginx
  • Работать в локальной папке
  • Удобное адинистратирование конфигурации сервера
  • Изолированое окружение
  • Поставить и забыть

Есть еще вариант просто у себя поднять все, но есть загвоздка, если что нибудь сломается, упадет жесткий диск, или еще что нибудь, то потом опять все собирать будет лень, а так просто можно сделать бэкап файла виртуальной машины, так же получаем независимое окружение.

Поэтому я поднял дебиан на виртуальной машине (virtualbox) и настроил nginx+phpfpm, за пару часов, но это не очередное хау ту по связке nginx+phpfpm, мы делаем готовое решение по типу xampp.

Подготовка

Итак мы имеем свежеустановленны Debian 7 (wheezy). Виртуальная машина имеет имя webserver. На локальной машине установлен так же Debian wheezy.

Первым делом хотелось бы избавиться от диалогового окна и пользоваться ssh.

Выключаем виртуальную машину и пишем:

# VBoxManage modifyvm "webserver" --natpf1 "guestssh,tcp,127.0.0.1,2222,10.0.2.15,22" 

Заодно пробросим 80 порт для вебсервера.
У меня почему то не получилось пробросить 80 порт, я не разобрался почему, в общем я просто пробросил 8888 порт и перенаправил с 80 порта на 8888.

# VBoxManage modifyvm "webserver" --natpf1 "web,tcp,127.0.0.1,8888,10.0.2.15,80" # iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to 8888 # echo "iptables -t nat -A OUTPUT -d 127.0.0.1 -p tcp --dport 80 -j REDIRECT --to 8888" >> /etc/rc.local 

Тут вместо 10.0.2.15 может быть другой ip, смотрите вывод команды ifconfig на eth0.

Запускаем виртуальную машину в фоне, это очень удобно, прошу заметить что запускаем от обычного пользователя, у которого находится виртуальная машина webserver

$ (vboxheadless -s webserver &) 

Жмем энтер

Все, мы пробросили 2222 порт на 22 внутренний, 80 порт будет работать, позже увидим. Пробуем коннектиться:

# ssh root@127.0.0.1 -p 2222 

Устанавливаем пакеты:

# apt-get install nginx php5 php5-fpm php5-mysql php5-gd php5-mcrypt mysql-server mysql-utilities 

Настраиваем php-fpm.

Поскольку тут нам париться с безопасностью не надо, поэтому все будет работать от одного юзера www-data.
Так же мы будем обращаться через сокет. Предлагаю готовый конфиг, на самом деле я там особо своего ничего не добавлял, не забываем делать бэкапы.

# mv /etc/php5/fpm/php-fpm.conf /etc/php5/fpm/php-fpm.conf.default # nano /etc/php5/fpm/php-fpm.conf 

Вставляем следующее:

[global]  pid = /var/run/php5-fpm.pid error_log = /var/log/php5-fpm.log include = /etc/php5/fpm/pool.d/*.conf 

Здесь опять же дефолт, можете вообще этого не делать, т.к. это тот же конфиг только без комментариев, но мне так проще ореинтироваться в конфиге.

Теперь надо подготовить пулл, который будет обрабатывать наши php запросы. Приводим конфиг к следующему виду.

# nano /etc/php5/fpm/pool.d/www.conf 

Вставляем следующее

[www]  user = www-data group = www-data  listen = /tmp/php5-fpm.sock pm = dynamic pm.max_children = 10 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 chdir = / 

Параметры pm хорошо описаны на других ресурсах, поэтому тут я ничего не буду объяснять, просто держите готовое.

Осталось поправить php.ini. На самом деле кого то может устроить и дефолтный, он неплохой. Но я все же приведу свой.

# nano /etc/php5/fpm/php.ini 

Конфиг большой и необязательный, поэтому выкладываю сюда hastebin.com/siqehilola.hs

Перезагружаем php-fpm

# service php5-fpm restart 

Настраиваем nginx.

В общем остается проблема с конфигами, лень каждый раз лезть на сервер, добавлять конфиг, перезагружать nginx. Поэтому собрал универсальный конфиг.
После можно будет просто создать папку, залить файлы и работать. Сказано, сделано. Вот Вам готовый конфиг nginx:

http { 	## 	# Базовые настройки 	## 	sendfile on; 	tcp_nopush on; 	tcp_nodelay on; 	keepalive_timeout 65; 	types_hash_max_size 2048;  	# При ошибках не говорим врагу версию nginx 	server_tokens off; 	include /etc/nginx/mime.types; 	default_type application/octet-stream;  	## 	# Настройка логов 	## 	access_log /var/log/nginx/access.log; 	error_log /var/log/nginx/error.log;  	## 	# Настройки сжатия 	## 	gzip on; 	gzip_disable "msie6";  	## 	# Настройка виртуальных доменов 	## 	include /etc/nginx/conf.d/*.conf;   	server { 		 		server_name phpmyadmin.l;  		listen 80;  		root /web/utils/phpmyadmin.l; 		index index.php index.html index.htm;   		access_log /web/access.log; 		error_log /web/error.log;  		location / { 			try_files $uri $uri/ /index.php?q=$uri&$args; 		} 		 		location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico)$ { 		        access_log        off; 		        expires           max; 		}  		location ~ \.php$ { 		        # fastcgi_split_path_info ^(.+\.php)(.*)$; 		        fastcgi_pass   unix:/tmp/php5-fpm.sock; 		        fastcgi_index  index.php; 		  		        fastcgi_param  DOCUMENT_ROOT    $document_root; 		        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 		        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_script_name;  		        include fastcgi_params; 		        fastcgi_param  QUERY_STRING     $query_string; 		        fastcgi_param  REQUEST_METHOD   $request_method; 		        fastcgi_param  CONTENT_TYPE     $content_type; 		        fastcgi_param  CONTENT_LENGTH   $content_length; 		        fastcgi_intercept_errors        off; 		        fastcgi_ignore_client_abort     off; 		        fastcgi_connect_timeout 60; 		        fastcgi_send_timeout 180; 		        fastcgi_read_timeout 180; 		        fastcgi_buffer_size 128k; 		        fastcgi_buffers 4 256k; 		        fastcgi_busy_buffers_size 256k; 		        fastcgi_temp_file_write_size 256k; 		}   	}    	server { 		 		server_name ~^(.*)$;  		listen 80;  		set $p $host;	 		if ($host ~ www\.(.*)) { set $p $1; }   		root /web/sites/$p; 		index index.php index.html index.htm;   		access_log /web/access.log; 		error_log /web/error.log;  		location / { 			try_files $uri $uri/ /index.php?q=$uri&$args; 		} 		 		location ~* ^.+.(js|css|png|jpg|jpeg|gif|ico)$ { 		        access_log        off; 		        expires           max; 		} 		location ~ \.php$ { 		        # fastcgi_split_path_info ^(.+\.php)(.*)$; 		        fastcgi_pass   unix:/tmp/php5-fpm.sock; 		        fastcgi_index  index.php; 		  		        fastcgi_param  DOCUMENT_ROOT    $document_root; 		        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name; 		        fastcgi_param  PATH_TRANSLATED  $document_root$fastcgi_script_name;  		        include fastcgi_params; 		        fastcgi_param  QUERY_STRING     $query_string; 			fastcgi_param  SERVER_NAME      $p; 		        fastcgi_param  REQUEST_METHOD   $request_method; 		        fastcgi_param  CONTENT_TYPE     $content_type; 		        fastcgi_param  CONTENT_LENGTH   $content_length; 		        fastcgi_intercept_errors        off; 		        fastcgi_ignore_client_abort     off; 		        fastcgi_connect_timeout 60; 		        fastcgi_send_timeout 180; 		        fastcgi_read_timeout 180; 		        fastcgi_buffer_size 128k; 		        fastcgi_buffers 4 256k; 		        fastcgi_busy_buffers_size 256k; 		        fastcgi_temp_file_write_size 256k; 		}  		location = /favicon.ico { 		        log_not_found off; 		        access_log off; 		}  	}   } 
# mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.default # nano /etc/nginx/nginx.conf 

Вставляем вышеприведеный конфиг

Я не претендую на то что конфиг хорош и идеален, но он у меня работает и проблем пока не возникало. Я буду очень рад если тут найдутся люди которым есть что сюда добавить.

Ну все, осталось только настроить дериктории. Немного поясню как у нас будет все происходить.

  • /web папка где будет лежать весь сервер, за исключением конфигов конечно же
  • /web/utils — туда мы будем складывать все наши дополнительные, вспомогательные скрипты типа phpmyadmin, пока я не придумал что туда еще положить, т.к. пока больше ничего не надо.
  • /web/sites — тут наши все сайты.

Так же будут логи, access и error.

Создаем папки

# mkdir /web && mkdir /web/sites && mkdir /web/utils 

Задаем права

# chmod -R a-rwx,u+rwX,g+rX /web && chown www-data:www-data -R /web 

Перезагружаем nginx.

# service nginx restart 

Осталось поставить phpmyadmin.

На сервере выполняем

# su www-data # cd /web/utils/phpmyadmin.l && wget http://jaist.dl.sourceforge.net/project/phpmyadmin/phpMyAdmin/4.0.4.2/phpMyAdmin-4.0.4.2-all-languages.zip && unzip phpMyAdmin-4.0.4.2-all-languages.zip && mv phpMyAdmin-4.0.4.2-all-languages/* ./ && rm -r phpMyAdmin-4.0.4.2-all-languages/ && rm phpMyAdmin-4.0.4.2-all-languages.zip # exit 

Все, phpmyadmin готов к труду и обороне. можно его теперь найти по адресу phpmyadmin.l

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

Немного опишу стратегию, после того как виртуальная машина загрузится, мы при помощи sshfs маунтим директорию с сайтами, и я сделал это автоматом.

Так же мне лень каждый раз редактировать файл /etc/hosts при добавлении очередного сайта, поэтому мы все это автоматизируем.

Автоматизация

Делаем авторизацию по ключу

На сервере надо:

Остановить демоны nginx и php5-fpm, и установить домашнюю дерикторию для юзера www-data.

# service nginx stop && service php5-fpm stop # mkdir /home/www-data && usermod -d /home/www-data www-data # service nginx start && service php5-fpm start 

Сгенерировать ключ от рута, и после поместить публичный в файл /home/www-data/.ssh/authorized_keys

На клиенте проверяем:

# ssh www-data@127.0.0.1 -p 2222 

Если зашли без пароля, то все хорошо, если нет, то что то Вы сделали не так с ключами.

Теперь осталось создать 2 скрипта.

1) Скрипт проверки доступности виртуальной машины, и автоматический маунтинг, так же генерация файла /etc/hosts.

# nano /usr/bin/webserver 

Вставляем следующий код

#!/bin/bash  sleep=60 # Интервал  when_mount='/mnt/webserver' # Дериктория куда все это будет маунтиться  directories=`ls -p $when_mount | grep "/" | sed 's/\///g'`   while true; do  	if ! $(mount | grep "$when_mount" > /dev/null); then  		if [ "$(nmap -p 2222 -sT 127.0.0.1  | awk '{print $2}' | grep open)" = "open" ]; then 			sshfs -o allow_other -o port=2222 www-data@127.0.0.1:/web/sites "$when_mount" 		fi;  	elif ! [ "$directories" = $(ls -p $when_mount | grep "/" | sed 's/\///g') ]; then  		hosts=$(grep -v "127.0.0.1" /etc/hosts) 		directories=$(ls -p $when_mount | grep "/" | sed 's/\///g')   		if ! [ "$directories" = "" ] 		then 			echo "$hosts" > /etc/hosts 	    	echo "127.0.0.1 phpmyadmin.l "$directories >> /etc/hosts 	    fi;  	fi  	sleep "$sleep" done 

На правильность кода я не претендую, и буду рад тому кто найдет там баги. Но у меня он работает исправно.
Удобство скрипта в том что даже если перезагрузите виртуальную машину, ничего не поломается и все будет хорошо.

Теперь делаем его исполняемым

# chmod -x /usr/bin/webserver 

2) Небольшой скрипт который будет запускать и останавливать вебсервер.

# nano /etc/init.d/webserverd 

Вставляем следующий код

#!/bin/bash  case "$1" in 	start) 		echo -n "Starting webserver: " 		(su - darkrain -c 'vboxheadless -s webserver' &) 		(webserver &) 		;;  	stop) 		echo -n "Stopping webserver: " 		(su - darkrain -c 'VBoxManage controlvm webserver savestate' &) 		killall webserver 		;; esac  exit 0 

darkrain — заменить на вашего юзера, т.к. созданая машина находится в подчинении у него, а не у рута.
Опять же я тут не профи, буду признателен если меня поправят, но это работает.

Выставляем права, и добавляем в список сервисов

# chmod -x /etc/init.d/webserverd && update-rc.d webserverd defaults 

Осталось создать каталог где будут видны наши сайты

# mkdir /mnt/webserver && chmod 777 /mnt/webserver 

Рестартуем наш сервер

# service webserverd stop # service webserverd start 

Все, теперь все счастливы и довольны, создаем для теста:

$ mkdir /mnt/webserver/testsite.ru.l && echo "<?php phpinfo();" > /mnt/webserver/testsite.ru.l/index.php 

Ждмем 60 секунд, и идем в браузер по адресу testsite.ru.l

Ну все, мы закончили! Можно забыть про то что у нас есть вообще виртуальная машина, пока конечно не понадобиться поставить какую нибудь либу или еще что то может понадобиться.

Теперь чтобы работать с новым сайтом я просто создам папку с именем домена в /mnt/webserver, и просто буду работать не отвлекаясь.

P.S.

Здесь более менее понятно описано про php-fpm, про пулы и прочее manualpages.pro/node/31

Остальная информация была взята по крупицам из Google.

Спасибо огромное тому кто мне дал инвайт! Да, к сожалению я так и не понял кто это.

ссылка на оригинал статьи http://habrahabr.ru/post/188702/


Комментарии

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *