JustHost лог установки веб-сервера на Debian 8 Nginx + PHP 7

Drupal: 
Уровень сложности: 

Тут уже есть начальный мануал о том, как запустить VPS для Drupal 7: http://tlito.ru/node/251/
Drupal 8 отлично работает на PHP7, но ставить php7.0-fpm сложнее, потому что мануалов мало, все неполные, и приходится исправлять ошибки, адаптировать настройки согласно предпочтениям разных кодеров.

Установка получилась, но не в этом посте, php7-fpm никак не обрабатывал запросы через сокет. А в этом постеполучилось http://tlito.ru/node/697/ - разница - надо пул для каждого хота прописывать.

Недавно приобрёл дешёвых хостинг у компании с серверами в Москве. В выборе помогли отзывы на http://hostdb.ru/providers/opinions/id/59 и других. Меня привлёк ping justhost.ru 31-34ms ниже, чем в селектел, макхост, таймвеб, а также стоимость 171р в месяц за ВПСину для одного сайта.

Для Друпал 8 пробуем ставить PHP 7.

Оставляю лог установки сервера для упрощения повторения работы.

 

Установка на Debian 8 веб-сервера Nginx + php + mysql

Проверка наличия русской локали в системе http://saradmin.ru/?p=1501

locale -a

есть.

Удаление Апаче2, так как для Друпал 8 он не нужен (работаем на Nginx):

apt-get purge apache2*

Установка Nginx, PHP 7, php-fpm http://linux-notes.org/ustanovka-php-7-php-fpm-s-nginx-1-9-v-debian-8/

Добавление ключа для скачки Nginx, добавление репозитория в систему (соурслист) и установка Nginx:

apt-key adv --keyserver hkp://pgp.mit.edu:80 --recv-keys 573BFD6B3D8FBC641079A6ABABF5BD827BD9BF62

echo deb http://nginx.org/packages/mainline/debian/ jessie nginx >> /etc/apt/sources.list
apt-get update
apt-get install -y ca-certificates nginx

rm -rf /var/lib/apt/lists/*

Установка GNU PG - для шифрования, зачем пока непонятно

cd /usr/local/src && wget https://www.dotdeb.org/dotdeb.gpg && apt-key add dotdeb.gpg

apt-get update

Установка PHP 7 как fpm

Зависимости https://rusadmin.biz/web-server/ustanovka-php-7-0-5-na-debian/

apt-get install -y wget curl git vim make checkinstall build-essential libtool gettext libpcre3 libpcre3-dev libldap2-dev libpq-dev libxslt-dev libxpm-dev libmysqlclient-dev libgmp3-dev libpng12-dev libpng-dev libfreetype6-dev autoconf re2c bison libssl-dev libcurl4-openssl-dev pkg-config openssl libpng-dev libpspell-dev librecode-dev libreadline-dev libjpeg-dev libxml2 libxml2-dev libbz2-dev libmcrypt-dev libicu-dev libltdl-dev libcurl3

Зависимости 2 https://www.htpcguides.com/install-php7-nginx-mariadb-wordpress-debian-j...

sudo apt-get install php7.0-cli php7.0-curl php7.0-dev php7.0-fpm php7.0-gd php7.0-xml php7.0-mysql php7.0-mcrypt php7.0-opcache -y

 

Установка PHP7.0-fpm

https://codebeer.ru/ustanovka-php-7-s-dotdeb/

nano /etc/apt/sources.list

Добавить:

deb http://packages.dotdeb.org jessie all
deb-src http://packages.dotdeb.org jessie all

Обновить пакеты:

apt-get update

Скачивание GnuPG:

wget https://www.dotdeb.org/dotdeb.gpg
apt-key add dotdeb.gpg

Установить php7.0-fpm:

apt-get install php7.0-fpm

Установлено! Запуск и резапуск:

service php7.0-fpm start
service php7.0-fpm restart

Проверить, существует ли процесс php7.0-fpm:

ps -aux |grep php7

 

Добавление расширения xdebug в php7:

echo 'zend_extension="/usr/lib/xdebug.so"' > /etc/php/7.0/fpm/conf.d/20-xdebug.ini
echo 'xdebug.remote_enable=1' >> /etc/php/7.0/fpm/conf.d/20-xdebug.ini

ln -sf /etc/php/7.0/mods-available/xdebug.ini /etc/php/7.0/fpm/conf.d/20-xdebug.ini
ln -sf /etc/php/7.0/mods-available/xdebug.ini /etc/php/7.0/cli/conf.d/20-xdebug.ini

service php7.0-fpm restart

У меня проверка не сработала:
php -m | grep -i xdebug

должно отобразить:
xdebug
Xdebug

Не напечаталось.

Теперь модули по вкусу:

aptitude install php7.0-mysql php7.0-curl php7.0-redis php7.0-gd

Запуск php7.0-fpm

service php7.0-fpm start

Если нужно, удаляем php5-fpm, но на justhost не нужно:

dpkg -l | grep php5 | grep -w 5 | awk '{print $2}'
aptitude purge php5-memcached php5-redis php5-curl
aptitude purge php5-fpm php5-common

 

Настройка PHP7-fpm

Исправление режима прослушивания сокета и его адреса:

nano /etc/php/7.0/fpm/pool.d/www.conf

Исправить строку listen = /run/php/php7.0-fpm.sock на
listen = /run/php/php7-fpm.sock

Раскомментировать строки:

listen.owner = www-data
listen.group = www-data
listen.mode = 0660

 

Конфигурирование веб-сервера. Настройка php7-fpm, nginx

http://linux-notes.org/ustanovka-php-7-php-fpm-s-nginx-1-9-v-debian-8/
Идем далее, копируем конфигурационный файл с php.ini в папку установки PHP:

cp /usr/src/php-7.0.2/php.ini-production /usr/local/etc/php.ini

Добавление расширения Zend Opcache

nano /usr/local/etc/modules.ini

Добавление строки opcache в этот файл:

  1. # Zend OPcache
  2. zend_extension=opcache.so

Настройки php7-fpm должны включать адрес сокета и другие параметры, создаём в папке /usr/local/php7 (в других мануалах может отличаться) файл:

nano /usr/local/php7/etc/php-fpm.d/php-fpm.conf

Добавить:

  1. [global]
  2.  
  3. pid = /var/run/php7-fpm.pid
  4. error_log = /var/log/php7-fpm.log
  5.  
  6. include=/usr/local/php7/etc/php-fpm.d/*.conf

Затем в этой же папке отредактировать файл www.conf

nano /usr/local/php7/etc/php-fpm.d/www.conf

Добавить в этот пустой файл строки:

  1. [www]
  2. user = www-data
  3. group = www-data
  4.  
  5. listen = /var/run/php7-fpm.sock
  6. listen.owner = www-data
  7. listen.group = www-data
  8. listen.mode = 0660
  9.  
  10. pm = dynamic
  11. pm.max_children = 5
  12. pm.start_servers = 2
  13. pm.min_spare_servers = 1
  14. pm.max_spare_servers = 3

 

Автозапуск php7-fpm

cd /etc/init.d

Создание скрипта запуска

nano php7-fpm

Листинг файла php7-fpm:

  1. #!/bin/sh
  2. ### BEGIN INIT INFO
  3. # Provides: php7-fpm
  4. # Required-Start: $remote_fs $network
  5. # Required-Stop: $remote_fs $network
  6. # Default-Start: 2 3 4 5
  7. # Default-Stop: 0 1 6
  8. # Short-Description: starts php7-fpm
  9. # Description: Starts The PHP FastCGI Process Manager Daemon
  10. ### END INIT INFO
  11.  
  12. PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/php7/sbin
  13. DESC="PHP7 FastCGI Process Manager"
  14. NAME=php7-fpm
  15. DAEMON=/usr/local/sbin/$NAME
  16. CONFFILE=/usr/local/php7/etc/php-fpm.conf
  17. DAEMON_ARGS="--daemonize --fpm-config $CONFFILE"
  18. CONF_PIDFILE=$(sed -n 's/^pid[ =]*//p' $CONFFILE)
  19. PIDFILE=${CONF_PIDFILE:-/var/run/php7-fpm.pid}
  20. TIMEOUT=30
  21. SCRIPTNAME=/etc/init.d/$NAME
  22.  
  23. # Exit if the package is not installed
  24. [ -x "$DAEMON" ] || exit 0
  25.  
  26. # Read configuration variable file if it is present
  27. [ -r /etc/default/$NAME ] && . /etc/default/$NAME
  28.  
  29. # Load the VERBOSE setting and other rcS variables
  30. . /lib/init/vars.sh
  31.  
  32. # Define LSB log_* functions.
  33. # Depend on lsb-base (>= 3.0-6) to ensure that this file is present.
  34. . /lib/lsb/init-functions
  35.  
  36. # Don't run if we are running upstart
  37. if init_is_upstart; then
  38. exit 1
  39. fi
  40.  
  41. #
  42. # Function to check the correctness of the config file
  43. #
  44. do_check()
  45. {
  46. # Run php-fpm with -t option to check the configuration file syntax
  47. errors=$($DAEMON --fpm-config $CONFFILE -t 2>&1 | grep "\[ERROR\]" || true);
  48. if [ -n "$errors" ]; then
  49. echo "Please fix your configuration file..."
  50. echo $errors
  51. return 1
  52. fi
  53. return 0
  54. }
  55.  
  56. #
  57. # Function that starts the daemon/service
  58. #
  59. do_start()
  60. {
  61. # Return
  62. # 0 if daemon has been started
  63. # 1 if daemon was already running
  64. # 2 if daemon could not be started
  65. start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
  66. || return 1
  67. start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
  68. $DAEMON_ARGS 2>/dev/null \
  69. || return 2
  70. # Add code here, if necessary, that waits for the process to be ready
  71. # to handle requests from services started subsequently which depend
  72. # on this one. As a last resort, sleep for some time.
  73. }
  74.  
  75. #
  76. # Function that stops the daemon/service
  77. #
  78. do_stop()
  79. {
  80. # Return
  81. # 0 if daemon has been stopped
  82. # 1 if daemon was already stopped
  83. # 2 if daemon could not be stopped
  84. # other if a failure occurred
  85. start-stop-daemon --stop --quiet --retry=QUIT/$TIMEOUT/TERM/5/KILL/5 --pidfile $PIDFILE --name $NAME
  86. RETVAL="$?"
  87. [ "$RETVAL" = 2 ] && return 2
  88. # Wait for children to finish too if this is a daemon that forks
  89. # and if the daemon is only ever run from this initscript.
  90. # If the above conditions are not satisfied then add some other code
  91. # that waits for the process to drop all resources that could be
  92. # needed by services started subsequently. A last resort is to
  93. # sleep for some time.
  94. start-stop-daemon --stop --quiet --oknodo --retry=0/30/TERM/5/KILL/5 --exec $DAEMON
  95. [ "$?" = 2 ] && return 2
  96. # Many daemons don't delete their pidfiles when they exit.
  97. rm -f $PIDFILE
  98. return "$RETVAL"
  99. }
  100.  
  101. #
  102. # Function that sends a SIGHUP to the daemon/service
  103. #
  104. do_reload() {
  105. #
  106. # If the daemon can reload its configuration without
  107. # restarting (for example, when it is sent a SIGHUP),
  108. # then implement that here.
  109. #
  110. start-stop-daemon --stop --signal USR2 --quiet --pidfile $PIDFILE --name $NAME
  111. return 0
  112. }
  113.  
  114. case "$1" in
  115. start)
  116. [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
  117. do_check $VERBOSE
  118. case "$?" in
  119. 0)
  120. do_start
  121. case "$?" in
  122. 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  123. 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  124. esac
  125. ;;
  126. 1) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  127. esac
  128. ;;
  129. stop)
  130. [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
  131. do_stop
  132. case "$?" in
  133. 0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
  134. 2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
  135. esac
  136. ;;
  137. status)
  138. status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
  139. ;;
  140. check)
  141. do_check yes
  142. ;;
  143. reload|force-reload)
  144. log_daemon_msg "Reloading $DESC" "$NAME"
  145. do_reload
  146. log_end_msg $?
  147. ;;
  148. reopen-logs)
  149. log_daemon_msg "Reopening $DESC logs" $NAME
  150. if start-stop-daemon --stop --signal USR1 --oknodo --quiet \
  151. --pidfile $PIDFILE --exec $DAEMON
  152. then
  153. log_end_msg 0
  154. else
  155. log_end_msg 1
  156. fi
  157. ;;
  158. restart)
  159. log_daemon_msg "Restarting $DESC" "$NAME"
  160. do_stop
  161. case "$?" in
  162. 0|1)
  163. do_start
  164. case "$?" in
  165. 0) log_end_msg 0 ;;
  166. 1) log_end_msg 1 ;; # Old process is still running
  167. *) log_end_msg 1 ;; # Failed to start
  168. esac
  169. ;;
  170. *)
  171. # Failed to stop
  172. log_end_msg 1
  173. ;;
  174. esac
  175. ;;
  176. *)
  177. echo "Usage: $SCRIPTNAME {start|stop|status|restart|reload|force-reload}" >&2
  178. exit 1
  179. ;;
  180. esac

 

Назначаем нужные права (исполнение) и добавляем скрипт в автозагрузку своей ОС:

chmod +x /etc/init.d/php7-fpm
update-rc.d php7-fpm defaults

service php7-fpm restart

Для работы php на сайте нужно добавлять виртуальным хостам Nginx следующую секцию. Обратите внимание на адрес сокета unix:/var/run/php7-fpm.sock, в этих мануалах авторы пропустили 7 https://codebeer.ru/ustanovka-php-7-v-debian-8/ service nginx restart && service php7-fpm restart

  1. location ~ .php$ {
  2. try_files $uri = 404;
  3. fastcgi_pass unix:/var/run/php7-fpm.sock;
  4. fastcgi_index index.php;
  5. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
  6. include fastcgi_params;
  7. }

 

Базы данных MySQL, PHPmyadmin

apt-get install mysql-server mysql-client

При установке phpmyadmin он стал тянуть пакеты php5, так что я отказался. Ищу как ставить phpmyadmin на сервер nginx + php7-fpm

Работает?

 

Папки сайтов /var/www/*

cd /var/www
mkdir site.ru/www -p
mkdir site.ru/tmp

 

Доступ к серверу по SSH, SFTP

http://wiki.enchtex.info/howto/ssh_sftp установка ssh-сервера и клиента

apt-get install ssh openssh-server

Создание пользователя и конфигурирование доступа

useradd -d /dev/null -M -s /bin/bash sftp
passwd sftp

chmod 755 /var/www/site.ru/www
chown sftp:sftp /var/www/site.ru/www -R

Настройки sshd

nano /etc/ssh/sshd_config

Исправить строку (sftp - это сервис, а не имя пользователя):

Subsystem sftp internal-sftp

Добавить в конце файла (sftp - это пользователь, можно заменить другим именем, /var/www - папка, куда будет авторизовываться пользователь):

  1. Match User user
  2. X11Forwarding no
  3. AllowTcpForwarding no
  4. AllowAgentForwarding no
  5. PermitTunnel no
  6. ForceCommand internal-sftp

А если добавить строку "ChrootDirectory /var/www", как в мануалах, то почему-то соединение по sftp не работает.

После настроек перезапуск ssh:

service ssh restart

Авторизоваться на сайте по ssh или sftp (в ftp-менеджере) можно так (55.55.55.55 - ip сервера):
ssh sftp@55.55.55.55

 

Настройки Nginx для работы с php7-fpm

https://romantelychko.com/blog/1303/

cd /etc/nginx

Узнать количество ядер

cat /proc/cpuinfo | grep ^processor |wc -l

Создание резервной копии и редактирование файла конфигурации nginx

cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf--orig
nano /etc/nginx/nginx.conf

Листинг файла nginx.conf
  1. user www-data www-data;
  2.  
  3. worker_processes 1; # указать текущее количество ядер процессора
  4. worker_priority -20;
  5.  
  6. pid /var/run/nginx.pid;
  7.  
  8. error_log /var/log/nginx/error.log warn;
  9.  
  10. events {
  11. worker_connections 1024;
  12. accept_mutex on;
  13. multi_accept on;
  14. }
  15.  
  16. http {
  17. include /etc/nginx/mime.types;
  18. default_type application/octet-stream;
  19.  
  20. reset_timedout_connection on;
  21. server_tokens off;
  22.  
  23. log_format main '$remote_addr - [$time_local] '
  24. '$host "$request" $status $bytes_sent '
  25. '"$http_referer" "$http_user_agent" '
  26. '"$gzip_ratio" $upstream_response_time';
  27.  
  28. sendfile on;
  29. tcp_nopush on;
  30. tcp_nodelay on;
  31.  
  32. keepalive_timeout 65;
  33.  
  34. client_max_body_size 512m;
  35.  
  36. server_names_hash_max_size 1024;
  37. server_names_hash_bucket_size 128;
  38.  
  39. port_in_redirect off;
  40.  
  41. gzip on;
  42. gzip_vary on;
  43. gzip_min_length 1024;
  44. gzip_buffers 16 8k;
  45. gzip_comp_level 5;
  46. gzip_http_version 1.0;
  47. gzip_proxied any;
  48. gzip_disable "msie6";
  49. gzip_types text/plain text/css application/x-javascript text/xml
  50. application/xml application/xml+rss text/javascript
  51. text/json;
  52.  
  53. fastcgi_temp_path /var/cache/nginx/fastcgi_temp;
  54. proxy_temp_path /var/cache/nginx/proxy_temp;
  55.  
  56. charset utf-8;
  57. index index.php index.html index.htm;
  58.  
  59. access_log off;
  60. error_log /dev/null;
  61.  
  62. set_real_ip_from 1.2.3.4/32; # указать "честный" IP сервера
  63. real_ip_header X-Real-IP;
  64.  
  65. include /etc/nginx/sites-enabled/*;
  66. }

Резервное копирование и настройка fastcgi_params

cp /etc/nginx/fastcgi_params /etc/nginx/fastcgi_params--orig
nano /etc/nginx/fastcgi_params

Листинг файла /etc/nginx/fastcgi_params
  1. fastcgi_pass unix:/var/run/php7-fpm.sock;
  2. fastcgi_index index.php;
  3.  
  4. fastcgi_split_path_info ^(.+\.php)(/.+)$;
  5.  
  6. fastcgi_param PATH_INFO $fastcgi_path_info;
  7.  
  8. fastcgi_param QUERY_STRING $query_string;
  9. fastcgi_param REQUEST_METHOD $request_method;
  10. fastcgi_param CONTENT_TYPE $content_type;
  11. fastcgi_param CONTENT_LENGTH $content_length;
  12.  
  13. fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  14. fastcgi_param REQUEST_URI $request_uri;
  15. fastcgi_param DOCUMENT_URI $document_uri;
  16. fastcgi_param SERVER_PROTOCOL $server_protocol;
  17.  
  18. fastcgi_param SCRIPT_URI $scheme://$host$request_uri;
  19.  
  20. fastcgi_param GATEWAY_INTERFACE CGI/1.1;
  21. fastcgi_param SERVER_SOFTWARE nginx;
  22.  
  23. fastcgi_param REMOTE_ADDR $remote_addr;
  24. fastcgi_param REMOTE_PORT $remote_port;
  25. fastcgi_param SERVER_ADDR $server_addr;
  26. fastcgi_param SERVER_PORT $server_port;
  27. fastcgi_param SERVER_NAME $server_name;
  28.  
  29. fastcgi_param Host $host;
  30. fastcgi_param HTTP_X_REAL_IP $remote_addr;
  31. fastcgi_param HTTP_X_FORWARDED_FOR $remote_addr;
  32.  
  33. fastcgi_param Range "";
  34. fastcgi_param Request-Range "";
  35.  
  36. fastcgi_buffer_size 128k;
  37. fastcgi_buffers 4 256k;
  38. fastcgi_busy_buffers_size 256k;
  39. fastcgi_temp_file_write_size 256k;
  40.  
  41. fastcgi_connect_timeout 600;
  42. fastcgi_send_timeout 600;
  43. fastcgi_read_timeout 600;

 

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

cd /etc/nginx
Создание папок для конфигурационных файлов хостов (если ещё нет):

mkdir sites-available sites-enabled

Пример конфигурационного файла хоста Nginx для сайта на Drupal 8

В файле обработка php не обозначена явно: подключается файл fastcgi_params, который содержит настройки для работы php-скриптов. Корневая папка сайта /var/www/site.ru/www

  1. server {
  2. server_name www.site.ru .site.ru;
  3. root /var/www/site.ru/www;
  4.  
  5. location = /favicon.ico {
  6. log_not_found off;
  7. access_log off;
  8. }
  9.  
  10. location = /robots.txt {
  11. allow all;
  12. log_not_found off;
  13. access_log off;
  14. }
  15.  
  16. # Very rarely should these ever be accessed outside of your lan
  17. location ~* \.(txt|log)$ {
  18. allow 192.168.0.0/16;
  19. deny all;
  20. }
  21.  
  22. location ~ \..*/.*\.php$ {
  23. return 403;
  24. }
  25.  
  26. location ~ ^/sites/.*/private/ {
  27. return 403;
  28. }
  29.  
  30. location ~ (^|/)\. {
  31. return 403;
  32. }
  33.  
  34. location / {
  35. try_files $uri /index.php?$query_string; # For Drupal >= 7
  36. }
  37.  
  38. location @rewrite {
  39. rewrite ^/(.*)$ /index.php?q=$1;
  40. }
  41.  
  42. location ~ '\.php$|^/update.php' {
  43. fastcgi_split_path_info ^(.+?\.php)(|/.*)$;
  44. #NOTE: You should have "cgi.fix_pathinfo = 0;" in php.ini
  45.  
  46. include /etc/nginx/fastcgi_params;
  47.  
  48. fastcgi_param SCRIPT_FILENAME /var/www/site.ru/www$fastcgi_script_name;
  49. fastcgi_param DOCUMENT_ROOT /var/www/site.ru/www;
  50.  
  51. fastcgi_param PHP_ADMIN_VALUE upload_tmp_dir=/var/www/site.ru/tmp/upload;
  52. fastcgi_param PHP_ADMIN_VALUE session.save_path=/var/www/site.ru/tmp/sessions;
  53. }
  54.  
  55. # Fighting with Styles? This little gem is amazing.
  56. location ~ ^/sites/.*/files/styles/ { # For Drpal >= 7
  57. try_files $uri @rewrite;
  58. }
  59.  
  60. location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
  61. expires max;
  62. log_not_found off;
  63. }
  64. }
Рубрика: