Интересное

Сообщение об ошибке

Warning: ini_set(): A session is active. You cannot change the session module's ini settings at this time in drupal_environment_initialize() (line 684 of /home/www/nixtalk.com/includes/bootstrap.inc).

Превращаем Asus WL500gp/Dir320 в вебсервер Ч.2

Опубликовано ср, 12/25/2013 - 15:07 пользователем Demontager

В предыдущей статье был рассмотрен процесс первоначальной подготовки роутера к установке приложений, теперь поговорим о том, как запустить вебсервер на Asus WL500gp/Dir320 в связке nginx+php5+mysql.
Конечно, можно поставить и другую связку, к примеру на базе только apache, или lghthttpd. Но nginx выбран из-за его легковесности и простоты настроки, так как ресурсы являются самым узким местом в роутере.
Хочу сказать пару слов о mysql, несмотря на то, что mysql сервер таки работает на роутере, но не ожидайте от него быстрой работы. Для теста я поставил стандартный Wordpress, залил немного тестового контента и начал браузить по вкладкам, в итоге примерно 5-10 сек приходится ждать между загрузками страниц. Так что использование различных CMS с базами на таких роутерах мягко говоря не целесообразно. Простые статичные HTML сайты самое то, или странички с небольшим php кодом.

Как обычно разберем поэтапно установку

1. Начнем с того, что сменим стандартный порт вебинтерфейса роутера на отличной от 80, так как он нам пригодится для nginx.

  1. nvram set http_lanport=81
  2. nvram commit
  3. reboot

Теперь для входа в админку роутера используем адрес http://192.168.1.1:81, а стандартный порт 80 ипользуем для nginx.
Если нужно вернуть установки по умолчанию

  1. nvram set http_lanport=""
  2. nvram commit
  3. reboot

2. Устанавливаем nginx

  1. opkg install nginx

Путь, по которому находится конфигурационный файл nginx

  1. /opt/etc/nginx

а здесь проверочная html страничка

  1. /opt/share/nginx

3. Редактируем конфиг nginx. Там очень много всего закомментировано, поэтому приведем все к нужному виду.

  1. user nobody;
  2. worker_processes 1;
  3.  
  4. #error_log /opt/var/log/nginx/error.log;
  5. #error_log /opt/var/log/nginx/error.log notice;
  6. #error_log /opt/var/log/nginx/error.log info;
  7.  
  8. #pid /opt/var/run/nginx.pid;
  9.  
  10.  
  11. events {
  12. worker_connections 64;
  13.  
  14. }
  15.  
  16. http {
  17.  
  18. include /opt/etc/nginx//mime.types;
  19. default_type application/octet-stream;
  20. access_log off;
  21. log_not_found off;
  22. server_tokens off;
  23. sendfile on;
  24. server_names_hash_bucket_size 128;
  25. client_max_body_size 200m;
  26. client_body_buffer_size 1m;
  27. keepalive_timeout 10;
  28. port_in_redirect off;
  29. gzip on;
  30. gzip_http_version 1.1;
  31. gzip_vary on;
  32. gzip_comp_level 9;
  33. gzip_min_length 0;
  34. gzip_proxied any;
  35. gzip_types text/plain text/css application/json application/x-javascript application/xml application/xml+rss text/javascript;
  36. gzip_buffers 16 8k;
  37. gzip_disable "MSIE [1-6].(?!.*SV1)";
  38.  
  39. server {
  40. listen 80;
  41. server_name www.domain.com;
  42. rewrite ^ http://domain.com$request_uri?;
  43. }
  44. server {
  45. listen 80;
  46. server_name domain.com;
  47. server_name_in_redirect off;
  48. root /opt/share/nginx/html/domain.com;
  49. index index.php index.html index.htm;
  50. location ~* ^.+\.(ico|js|gif|jpg|jpeg|png|bmp)$ {
  51. expires 30d;
  52. }
  53. location / {
  54. try_files $uri $uri/ /index.php;
  55. }
  56. location ~ \.php$ {
  57. fastcgi_pass 127.0.0.1:9000;
  58. fastcgi_index index.php;
  59. fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  60. include fastcgi_params;
  61. }
  62.  
  63.  
  64. }
  65.  
  66. server {
  67. listen 80;
  68. server_name www.domain.ru;
  69. rewrite ^ http://domain.com$request_uri?;
  70. }
  71. server {
  72. listen 80;
  73. server_name domain.ru;
  74. server_name_in_redirect off;
  75. root /opt/share/nginx/html/domain.ru;
  76. index index.php index.html index.htm;
  77. location ~* ^.+\.(ico|js|gif|jpg|jpeg|png|bmp)$ {
  78. expires 30d;
  79. }
  80. location / {
  81. try_files $uri $uri/ /index.php;
  82. }
  83. location ~ \.php$ {
  84. fastcgi_pass 127.0.0.1:9000;
  85. fastcgi_index index.php;
  86. fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
  87. include fastcgi_params;
  88. }
  89.  
  90.  
  91. }
  92. }

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


4. Создаем директорию для логов и настраиваем php5

  1. mkdir /opt/var/log/www/domain.com
  2. mkdir /opt/var/log/www/domain.ru

Устанавливливаем php5 с популярными расширениями.

  1. opkg install php5-fastcgi php5-cli php5-mod-curl php5-mod-session php5-mod-dom php5-mod-exif php5-mod-fileinfo php5-mod-ftp php5-mod-gd php5-mod-iconv php5-mod-json php5-mod-mbstring php5-mod-mcrypt php5-mod-mysql php5-mod-mysqli php5-mod-pdo php5-mod-pdo-mysql php5-mod-simplexml php5-mod-xml php5-mod-xmlreader php5-mod-xmlwriter php5-mod-zip

Один важный момент, нужно отредактировать fastcgi_params, чтобы правильно обрабатывался php иначе nginx будет выдавать предупреждение

  1. No input file specified.

Для этого открываем

  1. nano /opt/etc/nginx/fastcgi_params
  2.  
  3. комментируем
  4. #fastcgi_param SCRIPT_NAME $fastcgi_script_name;
  5.  
  6. а ниже добавляем
  7. fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

5. Желательно создать скрипт запуска php-fcgi, по умолчанию он отсутствует.

  1. nano /opt/etc/init.d/S45php
  2.  
  3.  
  4.  
  5. #!/bin/sh
  6. export PHP_FCGI_CHILDREN=1
  7. PORT=9000
  8. BIN=/opt/bin/php-fcgi
  9. PID=`pidof php-fcgi`
  10. start(){
  11. $BIN -b $PORT &
  12. exit 0
  13. }
  14. stop(){
  15. if [ -n "$PID" ]; then
  16. killall php-fcgi
  17. else
  18. echo "$BIN not running"
  19. fi
  20. }
  21.  
  22. case $1 in
  23. start)
  24. start
  25. ;;
  26. stop)
  27. stop
  28. ;;
  29. restart)
  30. stop
  31. sleep 2
  32. start
  33. ;;
  34. *)
  35. echo "usage: $0 (start|stop|restart)"
  36. exit 1
  37. ;;
  38. esac

6. Запускаем php-fcgi и проверяем что он слушает на 9000 порту

  1. /opt/etc/init.d/S45php start
  2. netstat -ant

7. Ставим и конфигурируем mysql сервер

  1. opkg install mysql-server

заполняем служебными таблицами

  1. mysql_install_db
  2. Installing MySQL system tables...
  3. OK
  4. Filling help tables...
  5. OK

Делаем старт mysql сервера

  1. /opt/etc/init.d/S70mysqld start

Задаем пароль рута

  1. mysqladmin -u root password NEWPASSWORD

8. Для подключения к mysql серверу будем использовать mysqli, но для его работы, необходимо в php.ini прописать сокет.

  1. nano /opt/etc/php.ini

и вставляем после секции [MySQL]

  1. [MySQLi]
  2. mysqli.max_persistent = -1
  3. mysqli.allow_persistent = On
  4. mysqli.max_links = -1
  5. mysqli.cache_size = 2000
  6. mysqli.default_port = 3306
  7. mysqli.default_socket = "/opt/var/run/mysqld.sock"

9. Запускаем nginx и проверяем работу сайта

  1. /opt/etc/init.d/S80nginx start

10. Для запуска всех скриптов находящихся в /opt/etc/init.d, которые начинаются c S и имеют атрибут исполнения, добавляем в post-mount строку

  1. nano /tmp/local/sbin/post-mount
  2.  
  3.  
  4. /opt/etc/init.d/rc.unslung start

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

  1. chmod -x /opt/etc/init.d/S40sshd
category_index: 
Поделится: 

3 комментария

Аватар пользователя Юрий

автор Юрий вкл пт, 04/22/2016 - 18:58

Роутер DIR-620, прошивка Vampik. Все сделал по Вашей инструкции, все работает, огромное спасибо!
Но есть один нюанс (с), как в анекдоте про Чапаева и Петьку... Из интернета сайт не виден. Перебросил вебморду роутера на порт 8080, нжинкс слушает 80-й порт. Из локалки сайт виден.
Фильтры ван2лан отключены.

Аватар пользователя Юрий

автор Юрий вкл пт, 04/22/2016 - 19:09

Решил вопрос:
/usr/sbin/iptables -I INPUT 1 -p tcp --dport 80 -j logaccept
(с)dd-wrt.com/wiki/index.php/WEB_server

Аватар пользователя Demontager

автор Demontager вкл сб, 04/23/2016 - 15:12

Только увидел сообщение ваше, да, IPtables решает такое.

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