imported>Vix |
imported>Vix |
Строка 1: |
Строка 1: |
| К концу 2015 года в распоряжении JavaScript разработчиков образовалось огромное количество инструментов. В этой экосистеме легко потеряться, поэтому успешные команды следуют выработанным правилам, которые позволяют не терять время и сохранять здоровье проектов. Под катом перевод статьи 2016 года от команды Heroku, в которой они рассказывают о десяти привычках веб разработчиков, у которых все работает и ничего не болит. Скорее всего 80% написанного вы уже знаете – тем интереснее вам будет прочитать об оставшихся двух приемах!
| | '''Установка и настройка''' |
|
| |
|
| | Прежде всего обновите локальный список пакетов с помощью вашего пакетного менеджера, например на Ubuntu и Debian это можно сделать с помощью apt: |
| | apt-get update |
|
| |
|
| 1. Начинайте новый проект командой npm init
| | Для установки выполните команду: |
| | apt-get install exim4 |
|
| |
|
| Эта команда сразу создаст правильный package.json, основываясь на имени директории проекта и ваших ответах на вопросы визарда:
| | Примечание: если вам необходимо использовать ACL и другие расширенные функции, то установите exim4-daemon-heavy: |
| | apt-get install exim4-daemon-heavy |
|
| |
|
| $ mkdir my-awesome-app
| | Чтобы перейти к настройке, выполните команду: |
| $ cd my-awesome-app
| | dpkg-reconfigure exim4-config |
| $ npm init --yes | |
|
| |
|
| | Нажмите Ok для начала настройки. |
| | '''РЕШЕНИЕ ПРОБЛЕМ''' |
| | <hr> |
| | * '''defer (-53): retry time not reached for any host''' |
| | Повреждены ваши exim db Это возможно связанно с недоступостью почтового сервера какой-то время. |
|
| |
|
| Использование флага --yes позволяет не отвечать на вопросы визарда, а в поле engines получившегося package.json можно сразу установить нужную версию ноды (node -v):
| | '''решение:''' |
| | |
| "engines": {
| |
| "node": "4.2.1"
| |
| }
| |
| | |
| | |
| 2. Используйте «умный» .npmrc
| |
| | |
| По умолчанию npm не записывает установленные зависимости в package.json (а за зависимостями надо следить всегда!).
| |
| | |
| Если вы воспользуетесь флагом --save для автоматического обновления package.json, то npm сохранит имя зависимости с префиксом ^. Семантическое версионирование ставит ваши зависимости под угрозу, так как при чистой инсталляции в проект могут установиться другие версии зависимостей, и кто знает, какие в них могут быть баги и проблемы. Такой способ хорош во время разработки, но не в продакшне. Одно из решений – сохранять точную версию зависимости:
| |
| | |
| $ npm install foobar --save --save-exact
| |
| | |
| | |
| А еще лучше – поменять глобальные настройки npm в ~/.npmrc, чтобы все происходило автоматически:
| |
| | |
| $ npm config set save=true
| |
| $ npm config set save-exact=true
| |
| $ cat ~/.npmrc
| |
| | |
| | |
| При такой конфигурации установка зависимостей сохранит точную версию и ваш проект никогда не настигнет жуткий “version drift”!
| |
| | |
| Если вы предпочитаете последние версии зависимостей во время разработки, плюс заморозку для прода, то вы можете воспользоваться функцией shrinkwrap. Такая конфигурация потребует несколько больше усилий, но позволит более гибко подойти к версионированию зависимостей.
| |
| | |
| 3. Не упустите уходящий поезд ES6
| |
| | |
| Начиная с 4-й версии Node.js вы можете использовать многие функции ES6. Начните использовать уже сейчас простые и удобные улучшения синтаксиса, которые сделают ваш код проще и понятнее:
| |
| | |
| let user = users.find(u => u.id === ID);
| |
| console.log(`Hello, ${ user.name }!`);
| |
| | |
| | |
| 4. Придерживайтесь нижнего регистра
| |
| | |
| Некоторые языки рекомендуют именовать файлы так же, как классы. Например, файл, имплементирующий MyClass, предлагается называть MyClass.js. Не делайте так в node. Используйте нижний регистр:
| |
| | |
| let MyClass = require('my-class');
| |
| | |
| | |
| Node.js это редкий пример линуксовой программы с великолепной поддержкой кроссплатформенности. Несмотря на то, что OSX и Windows будут считать файлы myclass.js и MyClass.js одним и тем же файлом, Linux так считать не будет. Если вы хотите писать кросс-платформенный код, вам необходимо именовать файлы в том же регистре, который вы используете для require.
| |
| | |
| Самый простой пусть сделать все правильно – это использовать нижний регистр, то есть my-class.js (примечание переводчика: или my_class.js, что все-таки популярнее среди программистов, нежели css нотация).
| |
| | |
| 5. Кластеризируйте ваше приложение
| |
| | |
| Так как процесс node ограничен одним ядром и полутора гигабайтами оперативной памяти, деплой некластеризованного приложения на мощный сервер является тратой полезных ресурсов впустую. Чтобы использовать несколько ядер и много памяти, добавьте в свое приложение поддержку кластеризации. Даже если сейчас вы запускаете приложение на одноядерной vps с гигом памяти, добавление кластеризации будет хорошим заделом на будущее.
| |
| | |
| Лучший способ найти оптимальное количество процессов это, конечно, тестирование. Но для начала подойдет значение по умолчанию, предлагаемое платформой. Ну и адекватный fallback, конечно же:
| |
| | |
| const CONCURRENCY = process.env.WEB_CONCURRENCY || 1;
| |
| | |
| | |
| Использование кластеризации позволяет не изобретать велосипед для управления потоками. Если вам нравится разделение по файлам на “master” и “worker”, то попробуйте forky. Если же вы предпочитаете единую точку входа, то throng.
| |
| | |
| 6. Следите за переменными окружения
| |
| | |
| Используйте переменные окружения вместо конфиг файлов. Для этого установите node-foreman:
| |
| | |
| $ npm install --save --save-exact foreman
| |
| | |
| | |
| Затем создайте Procfile, чтобы указать тип приложения:
| |
| | |
| web: bin/web
| |
| worker: bin/worker
| |
| | |
| | |
| И установите альяс для запуска:
| |
| | |
| "scripts": {
| |
| "start": "nf start"
| |
| }
| |
| | |
| | |
| Теперь, чтобы изменить настойки окружения, достаточно создать (и добавить в .gitignore) файл с именем .env, который будет автоматически загружен node-foreman:
| |
| | |
| DATABASE_URL='postgres://localhost/foobar'
| |
| HTTP_TIMEOUT=10000
| |
| | |
| | |
| С такими настройками достаточно одной команды npm start, чтобы запустить web и worker процессы, а затем прменить к ним настройки в соответствии с переменными окружения. Это намного проще, чем 'config/abby-dev.js', 'config/brian-dev.js', 'config/qa1.js', 'config/qa2.js', 'config/prod.js', итд.
| |
| | |
| 7. Избегайте мусора
| |
| | |
| Node.js (в лице движка V8) использует «ленивый» и «жадный» сборщик мусора. С лимитом по умолчанию в полтора гигабайта он часто ждет до последнего, прежде чем освободить не используемую память. Если у вас постепенно растет использованная память, это может быть не ее утечка, а вполне штатное поведение сборщика мусора node.
| |
| | |
| Для лучшего контроля за сборщиком мусора, в Procfile можно поместить команды для движка V8:
| |
| | |
| web: node --optimize_for_size --max_old_space_size=920 --gc_interval=100 server.js
| |
| | |
| | |
| Это особенно важно, если ваше приложение запущено на машине с менее чем полутора гигами доступной памяти. Например, для контейнера с 512 мегабайтами памяти строка аргументов может выглядеть вот так:
| |
| | |
| web: node --optimize_for_size --max_old_space_size=460 --gc_interval=100 server.js
| |
| | |
| | |
| 8. Используйте хуки
| |
| | |
| “Lifecycle scripts” в node.js предоставляют широкие возможности для автоматизации. К примеру, если вам нужно что-нибудь запустить перед сборкой приложения, вы можете воспользоваться скриптом preinstall. Нужно собрать ассеты с помощью grunt, gulp, browserify или webpack? Используйте скрипт postinstall. Все эти скрипты можно задать прямо в package.json:
| |
| | |
| "scripts": {
| |
| "postinstall": "bower install && grunt build",
| |
| "start": "nf start"
| |
| }
| |
| | |
| | |
| И конечно вы можете использовать переменные окружения для управления скриптами:
| |
| | |
| "postinstall": "if $BUILD_ASSETS; then npm run build-assets; fi",
| |
| "build-assets": "bower install && grunt build"
| |
| | |
| | |
| Если скрипты стали слишком сложные – перенесите их в файлы:
| |
| | |
| "postinstall": "scripts/postinstall.sh"
| |
| | |
| | |
| Важно: скрипты в package.json выполняются с ./node_modules/.bin автоматически добавленным в PATH, так что вы можете напрямую вызывать локально установленные npm пакеты, такие как webpack. Это позволяет вообще не устанавливать пакеты глобально.
| |
| | |
| 9. Only git the important bits
| |
| | |
| Мне настолько понравился этот заголовок, что я оставил его без перевода. Красивая игра слов – «гитуйте только важные биты» = «добавляйте в git только то, что важно». Большинство приложений состоят из файлов двух типов: которые можно или нельзя сгенерировать автоматически. Когда вы используете систему контроля версий, избегайте добавлять в нее файлы, которые можно сгенерировать автоматически.
| |
| | |
| Например, у вашего приложения есть директория node_modules с установленными зависимостями. Да, есть люди, которые добавляют ее в систему контроля версий! Не надо так делать. Указание нужных версий зависимостей в package.json намного надежнее, так как npm install не очищает node_modules, и если там уже будут файлы из системы контроля версий, может случиться беда.
| |
| | |
| Также добавление генерируемых файлов производит много лишнего шума в логах и нотификациях вашего репозитория. Более того, некоторые зависимости требуют компиляции при установки, так что добавление установленной версии в репозиторий делает ваше приложение непортабельным и может привести к странным ошибкам.
| |
| По тем же причинам не стоит добавлять bower_components или скомпилированные grunt ассеты. Если в проекте директория node_modules уже добавлена в систему контроля версий, то ее всегда можно убрать, например, вот так:
| |
| | |
| $ echo 'node_modules' >> .gitignore
| |
| $ git rm -r --cached node_modules
| |
| $ git commit -am 'ignore node_modules'
| |
| | |
| | |
| Также я обычно добавляю в игнор логи npm, чтобы не засорять код:
| |
| | |
| $ echo 'npm-debug.log' >> .gitignore
| |
| $ git commit -am 'ignore npm-debug'
| |
|
| |
|
| | cd /var/spool/exim/db |
| | rm -f retry retry.lockfile |
| | rm -f wait-remote_smtp wait-remote_smtp.lockfile |
| | service exim restart |
|
| |
|
| Игнорируя эти менее важные файлы, вы уменьшаете размер репозитория, упрощаете коммиты и не получаете конфликтов слияния.
| | В дальнейшим имеет смысл: внести изменения в /etc/exim/exim.conf |
| | в раздел |
|
| |
|
| 10. Упрощайте
| | begin retry |
| | * rcpt_451 F,1h,15m |
| | * refused F,1h,2m |
| | * timeout_connect F,2h,2m; F,6h,1h; F,4d,6h |
| | * * F,2h,2m; G,16h,1h,1.5; F,4d,6h |
|
| |
|
| Предсказания в айти – дело неблагодарное. Но я все-таки сделаю одно. Предсказываю, что для JavaScript 2016 год станет годом упрощения.
| | также обратите внимание на запуск с какой опцией он стартует: -q5m |
| Все больше программистов упрощают архитектуру своих решений. На смену монолитных MVC решений приходит статический фронтенд, который так удобно раздавать через CDN, и Node.js бэкенд для динамических данных.
| | * [https://www.linuxshop.ru/forum/f7/t31431--resheno-remote-smtp-defer-53-retry-time-not-reached-for-any-host-exchange-exim.html взято тут] |
|
| |
|
| Мы также начали замечать, насколько сложные системы сборки усложняют наши проекты. На острие прогресса разработчики упрощают эти решения, в частности, используя npm скрипты вместо bower, gulp и grunt.
| | * Для решения проблемы с ssl в exim4.conf.template изменить: |
| | ... |
| | REMOTE_SMTP_SMARTHOST_TLS_VERIFY_HOSTS = * |
|
| |
|
| И, наконец, в 2016 году мы будем упрощать написанный нами код. В ряде случаев это будет отказ от лишних фичей, как показал Douglas Crockford в своих The Better Parts. Или, наоборот, упрощение придет от добавления новой функциональности. Такой, как мои любимые async и await. В ноде их пока нет, но всегда можно воспользоваться транспайлером, например BabelJS.
| | на |
| | ... |
| | REMOTE_SMTP_SMARTHOST_TLS_VERIFY_HOSTS = !* |
|
| |
|
| Попробуйте не соревноваться друг с другом в том, сколько новых технологий можно запихнуть в один проект, а сфокусироваться на упрощении вашей работы.
| | * Если нужно жестко указать порт smtp, то: |
| | ... |
| | dc_smarthost='mail.myhost.ru::25' |
| | ... |
|
| |
|
| ИСТОЧНИК:
| | '''ИСТОЧНИКИ:''' |
| <hr> | | <hr> |
| * [https://habr.com/company/Voximplant/blog/277707/ 10 привычек довольного node.js разработчика] | | * [https://qna.habr.com/q/146009 Exim и внешний SMTP сервер, как заставить ходить почту?] |
| | * [https://1cloud.ru/help/linux/nastrojka-exim4 Настройка EXIM4 для отправки почтовых сообщений в Linux] |
| | * [https://serverspace.by/support/help/nastroika-exim-4-na-ubuntu/ Ubuntu. Настройка Exim4] |
Установка и настройка
Прежде всего обновите локальный список пакетов с помощью вашего пакетного менеджера, например на Ubuntu и Debian это можно сделать с помощью apt:
apt-get update
Для установки выполните команду:
apt-get install exim4
Примечание: если вам необходимо использовать ACL и другие расширенные функции, то установите exim4-daemon-heavy:
apt-get install exim4-daemon-heavy
Чтобы перейти к настройке, выполните команду:
dpkg-reconfigure exim4-config
Нажмите Ok для начала настройки.
РЕШЕНИЕ ПРОБЛЕМ
- defer (-53): retry time not reached for any host
Повреждены ваши exim db Это возможно связанно с недоступостью почтового сервера какой-то время.
решение:
cd /var/spool/exim/db
rm -f retry retry.lockfile
rm -f wait-remote_smtp wait-remote_smtp.lockfile
service exim restart
В дальнейшим имеет смысл: внести изменения в /etc/exim/exim.conf
в раздел
begin retry
* rcpt_451 F,1h,15m
* refused F,1h,2m
* timeout_connect F,2h,2m; F,6h,1h; F,4d,6h
* * F,2h,2m; G,16h,1h,1.5; F,4d,6h
также обратите внимание на запуск с какой опцией он стартует: -q5m
- Для решения проблемы с ssl в exim4.conf.template изменить:
...
REMOTE_SMTP_SMARTHOST_TLS_VERIFY_HOSTS = *
на
...
REMOTE_SMTP_SMARTHOST_TLS_VERIFY_HOSTS = !*
- Если нужно жестко указать порт smtp, то:
...
dc_smarthost='mail.myhost.ru::25'
...
ИСТОЧНИКИ: