Установка nginx, ssl сертфиката и mongo на выделенном сервере под Ubuntu


В 80% наших проектов мы используем связку React|Angular + Node.js + MongoDB. Чтоб быстро копипастить, решили сделать заметку у себя в блоге

Статья написана на основе настройки VDS vscale.io.

Сразу ссылки на источники:

Установка Nginx

Устанавливаем nginx командой

apt-get install nginx

После установки веб-сервера Ubuntu автоматически запустит его на 80 порту. Проверить, запустился ли Nginx можно следующей командой:

systemctl status nginx

В случае, когда вам нужно будет что-либо перенастроить или исправить, Nginx придётся останавливать. А если вы совершаете правки в конфигурационном файле, то для применения изменений веб-сервер следует перезагрузить. Для этого предусмотрены следующие команды:

Остановка Nginx

service nginx stop

Запуск Nginx

service nginx start

Перезагрузка Nginx

service nginx restart

Nginx Reload

service nginx reload

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

После изменения конфигурационных файлов веб-сайта не забывайте проверять их валидность:

nginx -t

Запустите nginx. Откройте в браузере веб-страницу с сервером, если все сделано правильно, то вы увидите надпись "Welcome to nginx."

После установки все конфигурации и папки Nginx устанавливаются в папку:

/etc/nginx/

Общая конфигурация Nginx находится в файле:

/etc/nginx/nginx.conf

Конфигурация вашего веб-сайта будет храниться в папке:

/etc/nginx/sites-available/

Логи

Логи ошибок в работе веб-сервера хранятся в файле:

/var/log/nginx/error.log

Логи http-запросов к веб-серверу хранятся в файле:

/var/log/nginx/access.log

Директория с файлами веб-сайта

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

/var/www/html/

Изменение конфигурации

Откроем файл конфигурации вашего веб-сайта, находящегося в директории:

/etc/nginx/sites-available/default


Установка letsencrypt для выпуска сертификата

Запускаем команду

apt-get install letsencrypt -y

Для каждого домена сертификат выпускается по отдельности. Запускаем выпуск сертфиката.

Теперь выполняем следующую команду, предварительно заменив "example.site" на домен.

letsencrypt certonly -a webroot --webroot-path=/var/www/html -d example.site -d www.example.site

Теперь надо сгенерировать параметры Диффи-Хеллмана.

Для улучшения безопасности - cгенерируем параметры Диффи-Хеллмана и запишем в файл (процесс займёт некоторое время):

openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Устанавливать ключ надо с дефолтными настройками nginx

server {
        listen 80 default_server;
        listen [::]:80 default_server;

        root /var/www/html;

        index index.html index.htm index.nginx-debian.html;

        server_name _;

        location / {
                try_files $uri $uri/ =404;
        }
}

Настройка Nginx

Теперь надо настроить конфигурацию nginx.

##
# You should look at the following URL's in order to grasp a solid understanding
# of Nginx configuration files in order to fully unleash the power of Nginx.
# http://wiki.nginx.org/Pitfalls
# http://wiki.nginx.org/QuickStart
# http://wiki.nginx.org/Configuration
#
# Generally, you will want to move this file somewhere, and start with a clean
# file but keep this around for reference. Or just disable in sites-enabled.
#
# Please see /usr/share/doc/nginx-doc/examples/ for more detailed examples.
##

# Default server configuration
#
server {
        listen 80;
        listen [::]:80;

        server_name example.site;
        # редирект на HTTPS
        # return 301 https://$server_name$request_uri;
        location / {
                proxy_set_header   X-Forwarded-For $remote_addr;
                proxy_set_header   Host $http_host;
                proxy_pass         "http://127.0.0.1:1337";
        }

        server_tokens off;
}

server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        server_name example.site;

        # SSL configuration
        #
        # listen 443 ssl default_server;
        # listen [::]:443 ssl default_server;
        #
        # Note: You should disable gzip for SSL traffic.
        # See: https://bugs.debian.org/773332
        #
        # Read up on ssl_ciphers to ensure a secure configuration.
        # See: https://bugs.debian.org/765782
        #
        # Self signed certs generated by the ssl-cert package
        # Don't use them in a production server!
        #
        # include snippets/snakeoil.conf;
        ssl_certificate /etc/letsencrypt/live/example.site/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.site/privkey.pem;
        ssl_dhparam /etc/ssl/certs/dhparam.pem;
        ssl_session_timeout 1d;
        ssl_session_cache shared:SSL:50m;
        ssl_session_tickets off;
        # конфигурация Modern
        ssl_protocols TLSv1.2;
        ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
        ssl_prefer_server_ciphers on;
        # HSTS - форсированно устанавливать соединение по HTTPS
        add_header Strict-Transport-Security "max-age=15768000";
        # Разрешение прикрепления OCSP-ответов сервером
        ssl_stapling on;
        # Разрешение проверки сервером ответов OCSP
        ssl_stapling_verify on;

        root /var/www/html;

        # Add index.php to the list if you are using PHP
        index index.html index.htm index.nginx-debian.html;
        server_tokens off;

        location / {
                proxy_set_header   X-Forwarded-For $remote_addr;
                proxy_set_header   Host $http_host;
                proxy_pass         "http://127.0.0.1:1337";
        }

        location ~ /.well-known {
                allow all;
        }
}

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

Вам необходимо заменить локальный порт, на котором запущен сервер. В примере:

proxy_pass         "http://127.0.0.1:1337";

И везде, где используется server_name, надо поменять на ваш домен.

Корректность конфигурации и, соответственно, наличие установленного сертификаты по указанным адресам стоит проверить командой

nginx -t


Настройка mongo

Теперь устанавливаем mongod.

После этого запускаем

mongod --fork --logpath /var/log/mongodb.log --port 59000 

Теперь, чтобы настроить доступ к mongo извне, надо добавить пользователей.

Чаще всего каждому проекту нужны 2 базы:

  • для данных (пусть, для примера, база называется dbname)
  • для сессий (session)

Подключаемся к базе:

mongo --port 59000

Если все сделано правильно, то вы окажитесь в консоли mongo.

Для переключения между базами данных используется следующая команда

use dbname

Для добавления пользователя

db.createUser(
 {
  user: "USER_NAME",
  pwd: "USER_PASSWORD",
  roles: [ "readWrite", "dbAdmin" ]
 }
)

Соответственно то же самое надо сделать для базы session.

Теперь MONGO_URI для production connection будет выглядеть примерно так:

mongodb://USER_NAME:USER_PASSWORD@localhost:59000/dbname

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

Для этого сначала остановим работу, уже запущенной mongo. Для этого можно воспользоваться командой top, чтобы узнать pid процесса.

top 
kill 2043 (2043-pid процесса mongod)

Теперь запускаем mongo с ключом инициализации авторизации и маской для всех ip

mongod --fork --logpath /var/log/mongodb.log --auth --port 59000 --bind_ip 0.0.0.0