NGINX: установка на Ubuntu на EC2 с EBS

Автор: | 01/08/2017
 

Задача – запустить EC2 в China AWS, с NGINX. Данные будут храниться на внешнем EBS-диске.

Подготовка сервера

Обновляем систему:

# apt update && apt upgrade

Машина – EC2, с подключенным EBS диском:

[simterm]

# lsblk 
NAME    MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda    202:0    0   8G  0 disk 
└─xvda1 202:1    0   8G  0 part /
xvdb    202:16   0   8G  0 disk

[/simterm]

/dev/xvdb необходимо смонтировать в каталог, из которого NGINX будет подгружать файлы настроек и данные сайта.

Создаём каталоги:

[simterm]

# mkdir -p /data/{nginx-conf.d,nginx-data}
# ls -l /data
total 8
drwxr-xr-x 2 root root 4096 Jul 31 13:08 nginx-conf.d
drwxr-xr-x 2 root root 4096 Jul 31 13:08 nginx-data

[/simterm]

Создаём два раздела на xvdb – 50 mb для конфигов NGINX, и остальное пространство – для данных:

[simterm]

# sfdisk /dev/xvdb << EOF
> ,50M
> ;
> EOF
Checking that no-one is using this disk right now ... OK

Disk /dev/xvdb: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x4d864140

Old situation:

Device     Boot  Start      End  Sectors Size Id Type
/dev/xvdb1        2048   104447   102400  50M 83 Linux
/dev/xvdb2      104448 16777215 16672768   8G 83 Linux

>>> Created a new DOS disklabel with disk identifier 0x824cafe2.
Created a new partition 1 of type 'Linux' and of size 50 MiB.
/dev/xvdb2: Created a new partition 2 of type 'Linux' and of size 8 GiB.
/dev/xvdb3: 
New situation:

Device     Boot  Start      End  Sectors Size Id Type
/dev/xvdb1        2048   104447   102400  50M 83 Linux
/dev/xvdb2      104448 16777215 16672768   8G 83 Linux

The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.

[/simterm]

Проверяем:

[simterm]

# fdisk -l /dev/xvdb
Disk /dev/xvdb: 8 GiB, 8589934592 bytes, 16777216 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x824cafe2

Device     Boot  Start      End  Sectors Size Id Type
/dev/xvdb1        2048   104447   102400  50M 83 Linux
/dev/xvdb2      104448 16777215 16672768   8G 83 Linux

[/simterm]

Создаём файловую систему ext4:

[simterm]

# mkfs.ext4 /dev/xvdb1 && mkfs.ext4 /dev/xvdb2

[/simterm]

Монтируем новые разделы в каталоги, которые создали ранее:

[simterm]

# mount /dev/xvdb1 /data/nginx-conf.d/
# mount /dev/xvdb2 /data/nginx-data/

[/simterm]

Обновляем /etc/fstab.

Находим UUID разделов:

[simterm]

# blkid /dev/xvdb*
/dev/xvdb: PTUUID="824cafe2" PTTYPE="dos"
/dev/xvdb1: UUID="c2f9709e-9118-49b5-8b99-b1c884f5dc0c" TYPE="ext4" PARTUUID="824cafe2-01"
/dev/xvdb2: UUID="d70c746f-4a86-430c-8428-4a6d278640be" TYPE="ext4" PARTUUID="824cafe2-02"

[/simterm]

В /etc/fstab добавляем монтирование:

[simterm]

# cat /etc/fstab 
LABEL=cloudimg-rootfs   /        ext4   defaults,discard        0 0
UUID=c2f9709e-9118-49b5-8b99-b1c884f5dc0c /data/nginx-conf.d/ ext4 defaults,nofail 0 2
UUID=d70c746f-4a86-430c-8428-4a6d278640be /data/nginx-data/ ext4 defaults,nofail 0 2

[/simterm]

Отмонтируем разделы, и монтируем их через fstab для проверки:

[simterm]

# umount /dev/xvdb1 
# umount /dev/xvdb2
# mount -a
# ls -l /data
total 5
drwxr-xr-x 3 root root 1024 Jul 31 14:32 nginx-conf.d
drwxr-xr-x 4 root root 4096 Jul 31 13:21 nginx-data

[/simterm]

Настройка NGINX

Устанавливаем NGINX:

[simterm]

# apt -y install nginx

[/simterm]

В файле /etc/nginx/nginx.conf указываем NGINX подгружать файлы с расширением .conf из каталога /data/nginx-conf.d/.

Редактируем файл и в блок http {} добавляем:

...
include /data/nginx-conf.d/*.conf;
...

Создаём каталог для файлов сайта:

[simterm]

# mkdir /data/nginx-data/domain.cn

[/simterm]

Создаём тестовый файл /data/nginx-conf.d/domain.cn.conf:

server {
        server_name domain.cn;
        
        listen 80;
        
        access_log /var/log/nginx/domain.cn-access.log;
        error_log /var/log/nginx/domain.cn-error.log;

        root /data/nginx-data/domain.cn;
}

И тестовый индексный файл:

[simterm]

# echo "Dev Profile" > /data/nginx-data/domain.cn/index.html

[/simterm]

Проверяем, перезагружаем:

[simterm]

# nginx -t && service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[/simterm]

Проверяем доступность виртуалхоста:

[simterm]

$ curl domain.cn
Dev Profile

[/simterm]

SSL

Добавляем SSL.

Создаём каталог:

[simterm]

# mkdir /etc/nginx/ssl

[/simterm]

Ключи нам переданы в виде архива, который включает в себя:

[simterm]

$ ls -l
total 32
-rw-r--r-- 1 setevoy setevoy 8274 Jul 31 16:54 star_domain_cn_2016_2017_ssl_certificate.zip
-rw-r--r-- 1 setevoy setevoy 3960 Sep 26  2016 star_domain_cn_2016_ssl_certificate.p7b
-rw-r--r-- 1 setevoy setevoy 1679 Sep 14  2016 star_domain_cn-private-key.key

[/simterm]

Convert P7B to PEM

Конвертируем P7B в PEM:

[simterm]

# openssl pkcs7 -print_certs < star_domain_cn_2016_ssl_certificate.p7b > domain_cn_fullchain.crt

[/simterm]

Краткий обзор форматов – тут>>>.

Обновляем настройки виртуалхоста – в файле /data/nginx-conf.d/domain.cn.conf добавляем поддержку SSL:

server {

        server_name domain.cn;

        listen 80;
        listen 443 ssl;

        access_log /var/log/nginx/domain.cn-access.log;
        error_log /var/log/nginx/domain.cn-error.log;

        root /data/nginx-data/domain.cn;

        ssl on;
        ssl_certificate /etc/nginx/ssl/domain_cn_fullchain.crt;
        ssl_certificate_key /etc/nginx/ssl/star_domain_cn-private-key.key;
}

Проверяем синтаксис, перегружаем NGINX:

[simterm]

# nginx -t && service nginx reload
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

[/simterm]

Проверяем:

[simterm]

$ openssl s_client -connect domain.cn:443                                                                                                           
CONNECTED(00000003)                                                   
...
    Verify return code: 0 (ok)
...

[/simterm]

Готово.