Сегодня мы будем настраивать веб сервер на нашем Raspberry Pi мини сервере либо его аналоге. Плюсы такого решения это малое потребление электричества, бесшумная работа так как все охлаждение пассивное, кстати если есть источник бесперебойного питания, то роутер и данный мини сервер достаточно долго могут висеть на бесперебойнике при аварийном отключении электричества. Из минусов только недостаточная мощность для высоконагруженных сайтов, магазинов, то есть тех, перерыв в работе которых будет ощутим для бизнеса. Малые сайты, сайты визитки данный сервер потянет только так, естественно никакой ддосс атаки не выдержит, но когда берутся за ддосс и при хороших деньгах его практически никто не выдержит.
Добавляем репозиторий для установки необходимых пакетов:
Для Debian 7 Wheezy:
deb http://archive.raspbian.org/raspbian wheezy main contrib non-free deb-src http://archive.raspbian.org/raspbian wheezy main contrib non-free deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi
Для Debian 8 Jessie:
deb http://archive.raspbian.org/raspbian jessie main contrib non-free deb-src http://archive.raspbian.org/raspbian jessie main contrib non-free deb http://mirrordirector.raspbian.org/raspbian/ jessie main contrib non-free rpi
Добавляем ключи репозиториев в систему:
wget -O /tmp/raspbian.public1.key http://archive.raspbian.org/raspbian.public.key && apt-key add /tmp/raspbian.public1.key wget -O /tmp/raspbian.public2.key http://mirrordirector.raspbian.org/raspbian.public.key && apt-key add /tmp/raspbian.public2.key
Есть одна из особенностей установки версии PHP языка, которые необходимо учитывать при установке операционной системы для работы вашего сайта на мини сервере Raspberry Pi:
в Debian 7 Wheezy устанавливается по умолчанию версия PHP 5.4
в Debian 8 Jessie устанавливается по умолчанию версия PHP 5.6
В моем распоряжении Raspberry Pi сервер с такими параметрами: 1Gb System Flash, 512Mb RAM и 8Gb Flash мы разобьем на 3 раздела: /var - 1Gb, /usr - 1Gb, /home - все оставшееся место и перенесем данные разделы с системной флешки. Операционная система на мини сервере Debian 7 Wheezy либо Debian 8 Jessie которую мы установили ранее по инструкции Установка Debian на мини сервер Raspberry Pi, а также блок питания мощностью 1A от старого мобильного телефона.
!!! Если системная флешка имеет раздел более 4 Gb можно переносом разделов не замарачиватся, так как для сервера системной флешки в 4Gb и выше достаточно.
!!! Внимание Настоятельно рекомендую использовать для Raspberry Pi флешки для установки системы отличные от Transcend, так как при установке на Transcend система после перезагрузки либо обновления может побить файловую систему и не грузится. С Kingston и Apacer такой проблемы не наблюдал. Такая проблема была с двумя Raspberry Pi платами с несколькими Transcend картами разного размера и класса.
Так как железо у нас не супер мощное, будем ставить легкий веб сервер Nginx, PHP-FPM, APC и MYSQL сервер баз данных с phpmyadmin.
Устанавливаем необходимые пакеты программ:
apt-get install exim4 ntp ntpdate apache2-utils nginx php5-fpm php-apc php5-curl mysql-client mysql-server php5-mysql phpmyadmin sudo
Соглашаемся на все вопросы инсталятора нажав букву y. При установке базы данных mysql инсталятор предложит ввести и повторить пароль пользователя root баз данных, обязательно необходимо записать в надежном месте, например в блокнот, чтобы не пришлось восстанавливать.
Монтируем флешку 8gb на которой будут находится файлы и логи веб сайта
Подключаем флешку 8GB в USB порт мини сервера и проверяем видима ли флешка в системе выполнив команду:
fdisk -l
Ответ ситемы:
Disk /dev/mmcblk0: 1023 MB, 1023934464 bytes 4 heads, 16 sectors/track, 31248 cylinders, total 1999872 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: 0x00000000 Device Boot Start End Blocks Id System /dev/mmcblk0p1 8192 122879 57344 6 FAT16 /dev/mmcblk0p2 122880 1999871 938496 83 Linux Disk /dev/sdb: 7948 MB, 7948206080 bytes 255 heads, 63 sectors/track, 966 cylinders, total 15523840 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: 0x000f1f67 Device Boot Start End Blocks Id System /dev/sdb1 63 15518789 7759363+ b W95 FAT32
Тут мы видим, что система видит флешку /dev/sdb: размером 7948 MB(8Gb), а так же, что флешка отформатирована в Windows файловую систему Fat32.
Приступим к разбивке флешки выполнив команду:.
fdisk /dev/sdb
Для просмотра параметров работы програмы fdisk необходимо набрать букву m, програма выдаст список возможных команд:
Command (m for help): m Command action a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition l list known partition types m print this menu n add a new partition o create a new empty DOS partition table p print the partition table q quit without saving changes s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit x extra functionality (experts only)
Проверяем таблицу разделов на флешке нажав p:
Command (m for help): p Disk /dev/sdb: 7948 MB, 7948206080 bytes 255 heads, 63 sectors/track, 966 cylinders, total 15523840 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: 0x000f1f67 Device Boot Start End Blocks Id System /dev/sdb1 63 15518789 7759363+ b W95 FAT32
Удаляем существующий раздел на флешке нажав букву d:
Command (m for help): d Selected partition 1
Проверяем, что раздел удален набрав букву p:
Command (m for help): p Disk /dev/sdb: 7948 MB, 7948206080 bytes 255 heads, 63 sectors/track, 966 cylinders, total 15523840 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: 0x000f1f67 Device Boot Start End Blocks Id System
Создаем раздел /usr размером 1Gb набрав букву n:
Command (m for help): n Partition type: p primary (0 primary, 0 extended, 4 free) e extended Select (default p): Using default response p Partition number (1-4, default 1): Using default value 1 First sector (2048-15523839, default 2048): Using default value 2048 Last sector, +sectors or +size{K,M,G} (2048-15523839, default 15523839): +1G
Создаем раздел /var размером 1Gb набрав букву n:
Command (m for help): n Partition type: p primary (1 primary, 0 extended, 3 free) e extended Select (default p): Using default response p Partition number (1-4, default 2): Using default value 2 First sector (2099200-15523839, default 2099200): Using default value 2099200 Last sector, +sectors or +size{K,M,G} (2099200-15523839, default 15523839): +1G
Создаем раздел /home размером на все оставшееся место набрав букву n:
Command (m for help): n Partition type: p primary (2 primary, 0 extended, 2 free) e extended Select (default p): Using default response p Partition number (1-4, default 3): Using default value 3 First sector (4196352-15523839, default 4196352): Using default value 4196352 Last sector, +sectors or +size{K,M,G} (4196352-15523839, default 15523839): Using default value 15523839
Проверяем созданные разделы набрав букву p:
Command (m for help): p Disk /dev/sdb: 7948 MB, 7948206080 bytes 255 heads, 63 sectors/track, 966 cylinders, total 15523840 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: 0x000f1f67 Device Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 83 Linux /dev/sdb2 2099200 4196351 1048576 83 Linux /dev/sdb3 4196352 15523839 5663744 83 Linux
Записываем внесенные в флешку изменения набрав букву w:
Command (m for help): w The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks.
Проверяем разбивку флешки выполнив команду:
fdisk -l ... Disk /dev/sdb: 7948 MB, 7948206080 bytes 245 heads, 62 sectors/track, 1021 cylinders, total 15523840 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: 0x000f1f67 Device Boot Start End Blocks Id System /dev/sdb1 2048 2099199 1048576 83 Linux /dev/sdb2 2099200 4196351 1048576 83 Linux /dev/sdb3 4196352 15523839 5663744 83 Linux
Приступаем к форматированию созданных разделов выполнив команды:
mkfs.ext4 /dev/sdb1 mkfs.ext4 /dev/sdb2 mkfs.ext4 /dev/sdb3
Монтируем первый раздел в папку /mnt, копируем содержимое раздела /usr и размонтируем раздел выполнив команды:
mount /dev/sdb1 /mnt/ cp -Rp /usr/* /mnt/ umount /mnt
Монтируем второй раздел в папку /mnt, копируем содержимое раздела /var и размонтируем раздел выполнив команды:
mount /dev/sdb2 /mnt/ cp -Rp /var/* /mnt/ umount /mnt
Монтируем третий раздел в папку /mnt, копируем содержимое раздела /home и размонтируем раздел выполнив команды:
mount /dev/sdb3 /mnt/ cp -Rp /home/* /mnt/ umount /mnt
Вносим изменения в файл монтирования разделов /etc/fstab
vi /etc/fstab ... /dev/sdb1 /usr ext4 defaults,noatime 0 2 /dev/sdb2 /var ext4 defaults,noatime 0 2 /dev/sdb3 /home ext4 defaults,noatime 0 2 # монтирум папку логов в оперативную память для дольшей работы флешки: tmpfs /var/log tmpfs rw,size=150m 0 0
Так как системная флешка маленькая, и системные разделы /usr и /var мы скопировали на отдельную флешку, fstab настроили, тогда файлы с системной флешки удаляем и перезагружаем плату выполнив команды:
rm -rf /usr/* rm -rf /var/* reboot
После перезагрузки плата загрузится с двух флешек. Обязательно необходимо сделать образы обоих флешек после завершения настройки, чтобы не пришлось заново все настривать при выходе какой-либо флешки из строя.
Настраиваем PHP
Вносим изменения в конфигурационный файл PHP:
vi /etc/php5/fpm/php.ini
было:
... ;cgi.fix_pathinfo=1 ... ;date.timezone = ...
стало:
... cgi.fix_pathinfo=0 ... date.timezone="Europe/Kiev" ...
Настраиваем APC для кеширования php скриптов:
vi /etc/php5/fpm/conf.d/20-apc.ini extension=apc.so ; Включаем APC: apc.enabled=1 ; Количество сегментов памяти: apc.shm_segments=1 ; Размер одного сегмента памяти": apc.shm_size=64
Настраиваем Nginx
Настраиваем веб сервер, добавляем домен на котором будет работать сайт на нашей плате, для примера сайт будет называться webserver.loc
Добавляем группу в которую будем добавлять пользователя под которым будет работать веб сервер выполнив команду:
addgroup --gid 10000 webserver
Добавляем пользователя с домашней директории /home/www/webserver.loc выполнив команду:
adduser --home /home/www/webserver.loc --shell /dev/null --uid 10000 --gid 10000 --disabled-password --disabled-login --gecos '' webserver
Создаем структуру директорий веб сайта:
mkdir /home/www/webserver.loc/logs mkdir /home/www/webserver.loc/www mkdir /home/www/webserver.loc/tmp mkdir /home/www/webserver.loc/sessions chown -R webserver:webserver /home/www/webserver.loc/
Создаем конфигурационный файл webserver.loc.conf в папке pool.d для создаваемого домена webserver.loc и вносим изменения в данный файл:
vi /etc/php5/fpm/pool.d/webserver.loc.conf [webserver.loc] user = webserver group = webserver listen = 127.0.0.1:9000 listen.owner = webserver listen.group = webserver listen.mode = 0660 pm = dynamic pm.max_children = 5 pm.start_servers = 2 pm.min_spare_servers = 1 pm.max_spare_servers = 3 chdir = / php_admin_value[sendmail_path] = /usr/sbin/sendmail -t -i -f [email protected] php_flag[display_errors] = off php_admin_value[error_log] = /home/www/webserver.loc/logs/fpm-php.www.log php_admin_flag[log_errors] = on php_admin_value[upload_tmp_dir] = /home/www/webserver.loc/tmp php_admin_value[session.save_path] = /home/www/webserver.loc/sessions php_admin_value[open_basedir] = /home/www/webserver.loc/www:/home/www/webserver.loc/tmp:/home/www/webserver.loc/sessions:/usr/share/phpmyadmin php_admin_value[mail.log] = /home/www/webserver.loc/logs/mail.log php_admin_value[memory_limit] = 128M php_admin_value[post_max_size] = 18M php_admin_value[max_execution_time] = 300 php_admin_value[allow_url_fopen] = Off php_admin_value[upload_max_filesize] = 18M php_admin_value[date.timezone] = Europe/Kiev
Отключаем настройки по умолчанию для веб сервера выполнив команду:
unlink /etc/nginx/sites-enabled/default
Создаем конфигурационный файл веб сервера Nginx для нашего домена webserver.loc:
vi /etc/nginx/sites-available/webserver.loc.conf # redirect www server { listen 80; server_name www.webserver.loc; return 301 $scheme://webserver.loc$request_uri; } server { listen 80; ## listen for ipv4 # root dir of your pages root /home/www/webserver.loc/www/; index index.php index.html index.htm; server_name webserver.loc; location / { try_files $uri $uri/ /index.html; } # pass the PHP scripts to FastCGI location ~ \.php$ { try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; # php5-fpm : fastcgi_pass 127.0.0.1:9000; fastcgi_read_timeout 300; fastcgi_index index.php; include fastcgi_params; } # deny access to .htaccess files, if Apache's document root concurs with nginx's one location ~ /\.ht { deny all; } # error and access logs # error_log /home/www/webserver.loc/logs/nginx-error.log crit; error_log /home/www/webserver.loc/logs/nginx-error.log; access_log /home/www/webserver.loc/logs/nginx-access.log; #Работа с phpMyAdmin location /phpmyadmin { root /usr/share/; index index.php index.html index.htm; location ~ ^/phpmyadmin/(.+\.php)$ { try_files $uri =404; root /usr/share/; fastcgi_pass 127.0.0.1:9000; fastcgi_read_timeout 300; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $request_filename; include /etc/nginx/fastcgi_params; } location ~* ^/phpmyadmin/(.+\.(jpg|jpeg|gif|css|png|js|ico|html|xml|txt))$ { root /usr/share/; } } location /phpMyAdmin { rewrite ^/* /phpmyadmin last; } }
В файл /etc/nginx/nginx.conf вносим данные:
vi /etc/nginx/nginx.conf user www-data; # Число рабочих процессов nginx, рекомендуется ставить по количеству процессоров/ядер на вашем сервере worker_processes 1; # Уменьшает число системных вызовов gettimeofday(), что приводит к увеличению производительности timer_resolution 100ms; # Изменяет ограничение на число используемых файлов RLIMIT_NOFILE для рабочего процесса. worker_rlimit_nofile 8192; # Директива задаёт приоритет рабочих процессов от -20 до 20 (отрицательное число означает более высокий приоритет). worker_priority -20; # Путь к логу ошибок error_log /var/log/nginx/error.log; pid /var/run/nginx.pid; events { worker_connections 768; use epoll; # multi_accept on; } http { server_names_hash_bucket_size 64; include /etc/nginx/mime.types; default_type application/octet-stream; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE ssl_prefer_server_ciphers on; # log options log_format main '$remote_addr - $remote_user [$time_local] ' '"$request" $status $bytes_sent ' '"$http_referer" "$http_user_agent" ' '"$gzip_ratio" "$request_time"'; access_log /var/log/nginx/access.log main; # Включить sendfile(). Использование sendfile() экономит системные вызовы, уменьшает число копирований данных, позволяет использовать меньше физической памяти. sendfile on; # Разрешаем использовать TCP_CORK в Linux, что позволяет передавать заголовок ответа и начало файла в одном пакете в Linux tcp_nopush on; # Задаём таймаут, в течение которого keep-alive соединение с клиентом не будет закрыто со стороны сервера. Второй параметр задаёт значение в строке "Keep-Alive: timeout=время" в заголовке ответа. #keepalive_timeout 0; keepalive_timeout 35 45; # Разрешаем использовать опцию TCP_NODELAY tcp_nodelay on; # Запрещаем выдавать версию nginx'а в сообщениях об ошибках и в строке заголовка ответа "Server". server_tokens off; # Разрешаем сжатие ответа методом gzip. gzip on; #Разрешаем проверку готового сжатого файла. gzip_static on; # Устанавливаем уровень сжатия ответа методом gzip. gzip_comp_level 4; # Устанавливаем минимальную длину ответа, для которых будет выполняться сжатие ответа методом gzip gzip_min_length 1024; gzip_disable "MSIE [1-6]\.(?!.*SV1)"; gzip_buffers 64 8k; gzip_http_version 1.1; gzip_proxied any; gzip_types text/plain text/css text/x-js text/xml text/javascript application/javascript application/x-javascript application/json aplication/xml application/xml+rss application/vnd.ms-fontobject application/x-font-ttf font/ttf font/opentype; proxy_connect_timeout 600 ; proxy_send_timeout 600 ; proxy_read_timeout 600 ; send_timeout 600 ; include /etc/nginx/conf.d/*.conf; include /etc/nginx/sites-enabled/*; }
Внимание!!! Если при перезагрузке веб сервера выдает ошибку:
Restarting nginx: nginx: [emerg] could not build the server_names_hash, you should increase server_names_hash_bucket_size: 32 nginx: configuration file /etc/nginx/nginx.conf test failed
Необходимо в секцию http добавляем параметр server_names_hash_bucket_size:
http { server_names_hash_bucket_size 64; ...
Для проверки работы PHP скриптов на сервере, создаем в директории сайта файл index.php с содержимым:
<?php phpinfo(); ?>
Можно этот же файл создать выполнив команду:
echo '<?php phpinfo(); ?>' > /home/www/webserver.loc/www/index.php
Включаем домен создав символическую ссылку и перезагружаем Nginx и php5-fpm выполнив команды:
ln -s /etc/nginx/sites-available/webserver.loc.conf /etc/nginx/sites-enabled/ /etc/init.d/nginx restart /etc/init.d/php5-fpm restart
После этого можем открывать в браузере адрес вашего домена webserver.loc и посмотреть на открывшуюся страницу с параметрами PHP.
Внимание!!! Если у Вас установлена операционная система Debian Jessie и открывается белый экран вместо страницы с информацией о PHP, необходимо внести изменения в файл /etc/nginx/fastcgi_params:
vi /etc/nginx/fastcgi_params fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; ...
Перегружаем Nginx WEB сервер выполнив команду:
/etc/init.d/nginx restart
Если необходимо открыть phpmyadmin для работы с Mysql, открываем в браузере адрес и вводим логин root и пароль который Вы вводили во время установки mysql сервера:
http://webserver.loc/phpmyadmin/
Сегодня мы установили веб и бд сервер на одноплатном компьютере Raspberry Pi либо его аналоге например Orange Pi достаточный для работы небольшого веб сайта, телефонной АТС.
С Вами был Сергей Лазаренко.
Сделаем небольшой перерыв и посмотрим видео как можно сделать баню в походе:
Add new comment