Microsoft Azure установка/настройка WEB сервера

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

Небольшая инструкция по установке и настройке Web-сервера на Microsoft Azure. За основу берем Ubuntu 14.04, сервер будет работать на NGINX + LAMP, php модулем mod_fcgid, в качестве ftp сервера возьмем VSFTPD. Приступим!

Добавляем новую виртуальную машину и настраиваем конфигурацию Ubuntu Server 14.04 LTS. Инфраструктуру системы выбираем DS1 Standart, позже создадим хранилище и примонтируем к рабочей папке. Выбираем датацентр, описывать не стану ниже по скринам думаю понятно. Жмем создать и ждем!

 

Виртуальный сервер создан, приступаем к первичной настройке. Добавим новый диск в окружение, и настроем firewall открываем порты для nginx, apache, ftp.

 

Отлично, настройка виртуальный машины и его окружения закончена, переходим к установке web-сервера

Авторизовываемся на сервере по SSH протоколу используя логин и пароль указанный при установке виртуальной машины dev адрес сервера aspr.cloudapp.net или 168.61.110.141

sudo -i // переход в root

 Находим диск командой:

dmesg | grep SCSI
dmesg | grep SCSI
[    0.313609] SCSI subsystem initialized
[    0.589134] Block layer SCSI generic (bsg) driver version 0.4 loaded (major 252)
[    6.098257] sd 2:0:0:0: [sda] Attached SCSI disk
[    6.215376] sd 3:0:1:0: [sdb] Attached SCSI disk
[    8.185439] sd 5:0:0:0: [sdc] Attached SCSI disk

Диск sdc является именно тем диском, который мы создали и подключили к виртуальной машине. Теперь разобьем диск с помощью sudo fdisk /dev/sdc, установим его как основной раздел 1 и примем остальные значения по умолчанию.

fdisk /dev/sdc
Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel
Building a new DOS disklabel with disk identifier 0x2a59b123.
Changes will remain in memory only, until you decide to write them.
After that, of course, the previous content won't be recoverable.

Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)

Command (m for help): n
Partition type:
   p   primary (0 primary, 0 extended, 4 free)
   e   extended
Select (default p): p
Partition number (1-4, default 1): 1
First sector (2048-419430399, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-419430399, default 419430399):
Using default value 419430399

Command (m for help): p

Disk /dev/sdc: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders, total 419430400 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x2a59b123

   Device Boot      Start         End      Blocks   Id  System
/dev/sdc1            2048    419430399    209714176   83  Linux

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

Запишем файловую систему на раздел:

sudo mkfs -t ext4 /dev/sdc1

Теперь нам необходимо примонтировать новый диск к папке с данными web сервера /var

mkdir /tmp/var # создаем временную папку
ls /var # проверяем, что там лежит
mount /dev/sdc1 /tmp/var # монтируем диск во временную папку
ls /tmp/var # проверим не лежит ли там чего лишнего, т.к. папка нам нужна пустой
lost+found
rm -rf /tmp/var/lost+found # удаляем его
cp -ax /var /tmp # копируем каталог /var в новый раздел
umount /dev/sdc1 # отмонтируем диск
rm -rf /tmp/var # теперь можно удалить временную папку
rm -rf /var # и оригинал
mkdir /var # пересоздаем папку
mount /dev/sdc1 /var # подключаем раздел к /var
ls /var # проверяем. если папки на месте, все хорошо.

Остается добавить монтирование в автозагрузку

nano /etc/fstab
# добавим свою запись на монтирование, запись в строке разделяется клавишей [tab]
/dev/sdс1 /var ext4 defaults 0 2

Давайте перезагрузим сервер, лишний раз проверить автомонтирование не помешает.

reboot

Приступим к установке web-сервера

apt-get update
apt-get upgrade
apt-get install nginx apache2 apache2-suexec libapache2-mod-fcgid php5-cgi php-pear php5-dev php5-gd mysql-server mysql-client php5-mysql postfix mc -y
apt-get install libapache2-mod-rpaf -y
echo It works

И так! PHP завелся, проверим работает ли Apache, открывает браузер и переходим на сервер dev.cloudapp.net или 168.61.110.141 если увидели страничку apache - радуемся

 

Осталось настроить бэкенд nginx на 80 порт и проксировать фронтенд apache на 81 порт. Расписывать не буду, приведу два архива с конфигурацией apache2.zip, nginx.zip

Заменяем конфигурацию на новую, на всякий случай проверяем конфиг Nginx

nginx -t

Если все нормально, перезапускаем apache и nginx

/etc/init.d/apache2 restart
/etc/init.d/nginx restart

Открываем браузер и проверяем что показывает сервер. Вуаля отвечает Nginx

Мы на полпути ))) Переходим к настройке хостов, покажу на примере технического dev.cloudapp.net

Активируем Apache модули

a2enmod rewrite
a2enmod suexec
a2enmod include
a2enmod fcgid

Открываем php.ini и меняем значение cgi.fix_pathinfo на 1

nano /etc/php5/cgi/php.ini

Открываем fcgid.conf меняем на:

nano /etc/apache2/mods-available/fcgid.conf 
<IfModule mod_fcgid.c>
  AddHandler    fcgid-script .fcgi
  FcgidConnectTimeout 20
  PHP_Fix_Pathinfo_Enable 1
</IfModule>

Перезагружаем Апачь

/etc/init.d/apache2 restart

Создаем хост

Добавляем пользователя, группу и домашнюю папку. (не рекомендую использовать технические имена в том числе www-data)

groupadd dev
useradd -s /bin/false -d /var/www/dev -m -g dev dev
mkdir -p /var/www/dev/www
chown dev:dev /var/www/dev/www

Проверяем Suexec, корневой директорией PHP должна быть /var/www

/usr/lib/apache2/suexec -V
 -D AP_DOC_ROOT="/var/www"
 -D AP_GID_MIN=100
 -D AP_HTTPD_USER="www-data"
 -D AP_LOG_EXEC="/var/log/apache2/suexec.log"
 -D AP_SAFE_PATH="/usr/local/bin:/usr/bin:/bin"
 -D AP_UID_MIN=100
 -D AP_USERDIR_SUFFIX="public_html"

Для того что бы php работал для нашего пользователя создадим исполняемый скрипт

mkdir -p /var/www/php-fcgi-scripts/dev
nano /var/www/php-fcgi-scripts/dev/php-fcgi-starter

с содержанием

#!/bin/sh
PHPRC=/etc/php5/cgi/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Даем права

chmod 755 /var/www/php-fcgi-scripts/dev/php-fcgi-starter
chown -R dev:dev /var/www/php-fcgi-scripts/dev

Создаем виртуальный хост Apache

nano /etc/apache2/sites-available/dev.conf
<VirtualHost *:81>
  ServerName dev.cloudapp.net
  ServerAlias www.dev.cloudapp.net
  ServerAdmin info @ dev.cloudapp.net //Убрать лишние пробелы
  DocumentRoot /var/www/dev/www/

  <IfModule mod_fcgid.c>
    SuexecUserGroup dev dev
    <Directory /var/www/dev/www/>
      Options +ExecCGI
      AllowOverride All
      AddHandler fcgid-script .php .php3 .php4 .php5 .phtml
      FCGIWrapper /var/www/php-fcgi-scripts/dev/php-fcgi-starter .php
      Order allow,deny
      Allow from all
    </Directory>
  </IfModule>

  # ErrorLog /var/log/apache2/error.log
  # CustomLog /var/log/apache2/access.log combined
  ServerSignature Off

</VirtualHost>
a2ensite dev
nano /var/www/dev/www/index.php
<?php phpinfo(); ?>

Создаем хост в Nginx

nano /etc/nginx/sites-available/dev
server {
	server_name dev.cloudapp.net www.dev.cloudapp.net;
	disable_symlinks if_not_owner from=$root_path;
	access_log /var/log/nginx/access.log;
	set $root_path /var/www/dev/www;
	location ~* ^.+\.(jpg|jpeg|gif|png|svg|mp3|ogg|mpe?g|avi|zip|gz|bz2?|rar|swf)$ {
		root $root_path;
		expires 720h;
		access_log off;
		log_not_found     off;
		error_page 404 = @fallback;
	}
	location ~* ^.+\.(js|css)$ {
		root $root_path;
		expires 168h;
		access_log off;
		error_page 404 = @fallback;
	}
	location / {
		proxy_pass http://127.0.0.1:81;
		proxy_redirect http://127.0.0.1:81/ /;
	}
	location @fallback {
		proxy_pass http://127.0.0.1:81;	
	}
}

Создаем симлинк

ln -s /etc/nginx/sites-available/dev /etc/nginx/sites-enabled

На всякий случай проверяем создан ли симлинк на хост в Apache, по идее он создается при активации пользователя. Перезагружаем Nginx и Apache

/etc/init.d/apache2 restart
/etc/init.d/nginx restart

Открываем браузер и проверяем работу PHP c бэкендом Nginx. Если видим такую картинку, значит у нас все получилось. Обращаем внимание что php работает как FastCGI.

Реализуем возможность индивидуальной настройки php для пользователей

cp /etc/php5/cgi/php.ini /var/www/dev/
chown dev:dev /var/www/dev/php.ini

Редактируем скрипт запуска php

nano /var/www/php-fcgi-scripts/dev/php-fcgi-starter
#!/bin/sh
PHPRC=/var/www/dev/
export PHPRC
export PHP_FCGI_MAX_REQUESTS=5000
export PHP_FCGI_CHILDREN=8
exec /usr/lib/cgi-bin/php

Перезагружаем Apache

/etc/init.d/apache2 reload

Установка и настройка FTP сервера.

Устанавливать будем VSFTPD

sudo apt-get install vsftpd

Устанавливаем следующие настройки

nano /etc/vsftpd.conf
listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
pasv_enable=YES
pasv_address=127.0.0.1  // или внешний IP
pasv_min_port=12000
pasv_max_port=12003
dirmessage_enable=YES
use_localtime=YES
xferlog_enable=YES
connect_from_port_20=YES
async_abor_enable=YES
chroot_local_user=YES
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd.chroot_list
ls_recurse_enable=YES
secure_chroot_dir=/var/run/vsftpd/empty
user_config_dir=/etc/vsftpd
pam_service_name=ftp
rsa_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
rsa_private_key_file=/etc/ssl/private/ssl-cert-snakeoil.key

Создаем папку с конфигами пользователей.

mkdir /etc/vsftpd
nano /etc/vsftpd/dev

добавим пользователя в белый лист (по одному в строчке)

nano /etc/vsftpd.chroot_list

Перегружаем ftp-сервер

sudo service vsftpd restart

Это типичные настройки, расширенных инструкций полно в интернете.

Вот и все на сегодня, что хотел рассказать.