Как скачать сайт целиком на Linux или FreeBSD с помощью wget

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

Чтобы скачать сайт целиком с помощью wget нужно выполнить команду:

wget -r -k -l 7 -p -E -nc http://site.com/

После выполнения данной команды в директорию site.com будет загружена локальная копия сайта http://site.com. Чтобы открыть главную страницу сайта нужно открыть файл index.html.

Рассмотрим используемые параметры:

-r указывает на то, что нужно рекурсивно переходить по ссылкам на сайте, чтобы скачивать страницы.
-k используется для того, чтобы wget преобразовал все ссылки в скаченных файлах таким образом, чтобы по ним можно было переходить на локальном компьютере (в автономном режиме).
-p указывает на то, что нужно загрузить все файлы, которые требуются для отображения страниц (изображения, css и т.д.).
-l определяет максимальную глубину вложенности страниц, которые wget должен скачать (по умолчанию значение равно 5, в примере мы установили 7). В большинстве случаев сайты имеют страницы с большой степенью вложенности и wget может просто «закопаться», скачивая новые страницы. Чтобы этого не произошло можно использовать параметр -l.
-E добавлять к загруженным файлам расширение .html.
-nc при использовании данного параметра существующие файлы не будут перезаписаны. Это удобно, когда нужно продолжить загрузку сайта, прерванную в предыдущий раз.

 

Мы рассмотрели лишь одно из возможных применений утилиты wget. На самом деле область применения wget значительно шире и wget обладает большим числом дополнительных параметров. За более подробной информацией обращайтесь к руководству, выполнив в командной строке: man wget.

Настройка и запуск NodeJS приложения

Быстрая настройка и простая поддержка NodeJS приложения

Под катом я поделюсь опытом нескольких дней исследований, проб и ошибок в процессе настройки NodeJS проекта на Ubuntu Server. В рамках руководства, мы пройдем по следующим темам:

  • Вечный запуск процесса NodeJS аппликации и вывод на публику
  • Базовая настройка NoSQL базы данных MongoDB
  • Авто-запуск и менеджмент приложения

Введение

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

Что бы не раздувать руководство, мы начнем с момента, когда вы уже запустили Ubuntu Server и имеетеNodeJS на борту. Лично я предпочитаю DigitalOcean как VPS хостинг, где за 5$ можно быстро и удобно получить нужные мощности, а так же большой набор гайдов на английском.

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

Вечный процесс

Начнем с самого простого — авто-запуск процесса при падании и удобный менеджмент NodeJS приложения. Тут нам спешит на помощь один из инструментов ранее упомянутого проекта Nodejitsu —forever.

Ставится forever как и обычная глобальная NodeJS аппликация:

$ [sudo] npm install forever -g

После чего вы можете запустить любое NodeJS приложение простой командой:

forever start app.js

И легко управлять процессом (или процессами) с помощью перечисленных команд:

forever list
forever stop app.js
forever restart app.js

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

forever start  -l /var/log/app.js.log -a app.js

Где мы определяем путь к файлу с логами приложения, и указываем параметр append для склеивания логов.

На заметку

Процесс по умолчанию записывается на пользователя, который его запустил. Это значит, что если вы запустите forever через sudo, то и команды forever list/stop и подобные, нужно будет запускать тоже через sudo.

Если же вы хотите запустить приложение в определенном окружении:

NODE_ENV=production forever start  -l /var/log/app.js.log -a app.js

Доступ из сети

Если вы запускаете веб сервер на ноде и хотите что бы он был доступен из глобальной сети, нужно лишь открыть необходимые порты. В Ubuntu Server стандартные порты (80, 8080) по умолчанию открыты, но открыть другие не составит никаких проблем:

sudo iptables -A INPUT -p tcp dport 777 -j ACCEPT

Вместо 777 поставьте номер необходимого порта.

80 порт

80 порт является стандартным для веба, но что бы запустить NodeJS процесс на этому порту, нужно запускать аппликацию от sudo, что далеко не всегда удобно и теоретически не безопасно.

Что бы принимать трафик с 80 порта на порт вашего приложения (например 8080) можно сделать простое перенаправление:

sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080 

Эту команду необходимо запускать каждый раз при запуске системы, как автоматизировать этот процесс я опишу ниже в руководстве.

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

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

MongoDB

Чаще всего с NodeJS используют MongoDB как решение для NoSQL базы данных. Что бы установить ее на Ubuntu, следуем этим простым шагам.

Что бы включить MongoDВ как сервис, активизируя авто-запуск в том числе, вводим команду:

sudo service mongodb start 

Настройки базы можно найти по этому пути /etc/mongodb.conf, там же сразу рекомендую включить авторизацию, что по умолчанию отключена:

auth=true

Это включит авторизацию для удаленных пользователей, оставив локальный доступ открытым. Что бы получить удаленные доступ к базе, можете создать пользователей в базе с любыми правами.

В качестве интерфейса для работы с базой, можно использовать Robomongo для OSx.

Авто-запуск проекта

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

Я подготовил заготовку скрипта на примере проекта DevShelf для сервиса Ubuntu. Вам останется лишь заполнить настройки:

NAME=devshelf                            # Название сервиса
SOUREC_DIR=/home/user/devshelf           # Путь до приложения
COMMAND=node                             # Команда запуска
SOURCE_NAME=app.js                       # Файл запуска приложения
USER=user                                # Пользователь от которого запускать процесс
NODE_ENVIROMENT=production               # Node environment

Логи приложения, судя по скрипту, будут доступны в директории /var/log/$NAME.log.

Поместите скрипт в директорию /etc/init.d/ с удобным именем, например /etc/init.d/app, после чего даем нужные права и прописываем в авто-загрузку:

sudo chmod a+x /etc/init.d/app
sudo update-rc.d app defaults

Теперь нам будут доступны следующие команды:

sudo service app start
sudo service app status
sudo service app restart
sudo service app stop   

RSYNC server CentOS 6.5

Make sure xinetd and rsync is available, if not type
# yum -y install rsync xinetd

Add xinetd service to system
# chkconfig --add xinetd

Make sure xinetd running on init 3 and 5
# chkconfig --list xinetd

Enable rsync
# vi /etc/xinetd.d/rsync
Change disable = yes into disable = no

Create username and password for rsync client to use
# vi /etc/rsyncd.secrets
adminname:hispassword

Create configuration and shares for rsync daemon
# vi /etc/rsyncd.conf

———————-
max connections = 2
log file = /var/log/rsync.log
timeout = 300

[shares]
comment = shared data stored here
path = /home/adminname/shares
read only = false
list = yes
uid = adminname
gid = adminname
auth users = adminname
secrets file = /etc/rsyncd.secrets
hosts allow = 10.10.105.0/24
———————-

Secure /etc/rsyncd.*
# chown root.root /etc/rsyncd.*
# chmod 600 /etc/rsyncd.*

Restart xinetd
# service xinetd restart

Make sure rsync now running
# chkconfig --list

Perhaps you also want to enable port 873 tcp and udp on your firewall so other can connect to your server.

MySQL Шпаргалки

MySQL шпаргалки

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

Сегодня я решил опубликовать свои шпаргалки, на самые часто встречающиеся ошибки при работе с MySQL.

Делаем бекап
mysqldump -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql

Создаём структуру базы без данных
mysqldump --no-data - u USER -pPASSWORD DATABASE > /path/to/file/schema.sql

Если нужно сделать дамп только одной или нескольких таблиц
mysqldump -u USER -pPASSWORD DATABASE TABLE1 TABLE2 TABLE3 > /path/to/file/dump_table.sql

Создаём бекап и сразу его архивируем
mysqldump -u USER -pPASSWORD DATABASE | gzip > /path/to/outputfile.sql.gz

Создание бекапа с указанием его даты
mysqldump -u USER -pPASSWORD DATABASE | gzip > `date +/path/to/outputfile.sql.%Y%m%d.%H%M%S.gz`

Заливаем бекап в базу данных
mysql -u USER -pPASSWORD DATABASE < /path/to/dump.sql

Заливаем архив бекапа в базу
gunzip < /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE
или так
zcat /path/to/outputfile.sql.gz | mysql -u USER -pPASSWORD DATABASE

Создаём новую базу данных
mysqladmin -u USER -pPASSWORD create NEWDATABASE

Удобно использовать бекап с дополнительными опциями -Q -c -e, т.е.
mysqldump -Q -c -e -u USER -pPASSWORD DATABASE > /path/to/file/dump.sql, где:

  • -Q оборачивает имена обратными кавычками
  • -c делает полную вставку, включая имена колонок
  • -e делает расширенную вставку. Итоговый файл получается меньше и делается он чуть быстрее

Для просмотра списка баз данных можно использовать команду:
mysqlshow -u USER -pPASSWORD

А так же можно посмотреть список таблиц базы:
mysqlshow -u USER -pPASSWORD DATABASE

Для таблиц InnoDB надо добавлять —single-transaction, это гарантирует целостность данных бекапа.
Для таблиц MyISAN это не актуально, ибо они не поддерживают транзакционность.

Подробнее

Общие факты

  • Полезно под каждую базу на боевом сервере создавать своего пользователя
  • Кодировка базы может быть любой, если она UTF8
  • В большинстве случаев лучше использовать движок InnoDB
  • В php лучше забыть про сильно устаревшее расширение mysql и по-возможности использовать pdo или mysqli
  • Новую копию MySQL всегда можно настроить и оптимизировать
  • Без особой нужды не стоит открывать MySQL наружу. Вместо этого можно сделать проброс портов
    ssh -fNL LOCAL_PORT:localhost:3306 REMOTE_USER@REMOTE_HOST

Работа с данными

Числа
  • На 32-битных системах практически нет смысла ставить для типа INTEGER свойство UNSIGNED, так как такие большие числа в php не поддерживаются.
    На 64-битных системах, php поддерживает большие числа, вплоть до MySQL BIGINT со знаком.
  • Связанные таблицы («Foreign keys») должны иметь полное сходство по структуре ключей. Т.е. если у нас на одной таблице для поля указано «INTEGER UNSIGNED DEFAULT 0 NOT NULL» то и на другой должно быть указано аналогично
  • Для хранения булевых значений, нужно использовать TINYINT(1)
  • А деньги лучше хранить в DECIMAL(10, 2), где первое число обозначает количество всех знаков, включая запятую, а второе — количество знаков после запятой. Итого, у нас получится что DECIMAL(10,2) может сохранить 9999999,99
Строки
  • В старых версиях (до 5.0.3) VARCHAR была ограничена 255 символами, но сейчас можно указывать до 65535 символов
  • Помните, что тип TEXT ограничен только 64 килобитами, поэтому что бы сохранять «Войну и Мир» пользуйтесь «LONGTEXT»
  • Самая правильная кодировка для вашей БД UTF8
Даты

Не забывайте, что

  • DATE, TIME, DATETIME — выводятся в виде строк, поэтому поиск и сравнение дат происходит через преобразование
  • TIMESTAMP — хранится в виде UNIX_TIMESTAMP, и можно указать автоматически обновлять колонку
  • Сравнивая типы данных DATETIME и TIMESTAMP, не забывайте делать преобразование типов, например:
    SELECT * FROM table WHERE `datetime` = DATE(`timestamp`)
Перечисления
  • Для перечислений правильно использовать тип ENUM
  • Правильно пишется так: ENUM(‘мама’, ‘мыла’, ‘раму’)
  • Можно ставить значение по-умолчанию, как и для любой строки
  • В базе поле с перечислением хранится как число, поэтому скорость работы — потрясающе высокая
  • Количество перечислений ~ 65 тысяч

dev.mysql.com/doc/refman/4.1/en/storage-requirements.html
help.scibit.com/mascon/masconMySQL_Field_Types.html

Отладка

  • Если запросы тормозят, то можно включить лог для медленных запросов в /etc/mysql/my.cnf
  • А потом оптимизировать запросы через EXPLAIN
  • И наблюдать за запросами удобно через программу mytop

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