воскресенье, 30 ноября 2014 г.

Image resize

Задача: переложить изменение размеров картинок на nginx с кешированием. Для доступа к картинке необходимо в URL передавать подпись. Это защищает сервер от ddos атак.

http {
        ...
        # Задаёт путь и другие параметры кэша
        proxy_cache_path /opt/www/images/cache levels=1:2 keys_zone=image-preview:10m;

        server {
                ...
                location /images {
                        proxy_pass http://unix:/run/image.sock:$uri;
                        proxy_intercept_errors on;

                        proxy_cache image-preview;
                        proxy_cache_key "$host$document_uri";
                        proxy_cache_valid 200 1d;
                        proxy_cache_valid any 1m;

                        expires max;
                }
        }
        server {
                listen unix:/run/image.sock;
                secure_link_secret secret;
                location ~ ^/images/[^/]+/crop/(\d+|-)/(\d+|-)/(.+) {
                        set $width $1;
                        set $height $2;
                        alias /opt/www/images/storage/$3;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                        image_filter crop $width $height;
                }
   
                location ~ ^/images/[^/]+/resize/(\d+|-)/(\d+|-)/(.+) {
                        set $width $1;
                        set $height $2;
                        alias /opt/www/images/storage/$3;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                        image_filter resize $width $height;
                }

                location ~ ^/images/[^/]+/(.+) {
                        alias /opt/www/images/storage/$1;
                        try_files "" =404;
                        if ($secure_link = "") { return 404; }
                }
        }
}
Простая функция для формирования URL для доступа к картинке.
function image_url($params)
{
    if (isset($params['filter'])) {
        $path = $params['filter'] . '/' . (isset($params['width']) ? $params['width'] : '-') . '/' . (isset($params['height']) ? $params['height'] : '-') . '/' . $params['source'];
    } else {
        $path = $params['source'];
    }
    $md5 = md5($path . 'secret');
    return "http://127.0.0.1/images/{$md5}/{$path}";
}

echo image_url(['source' => '1.png', 'filter' => 'resize', 'width' => 100, 'height' => 200]) . PHP_EOL;

пятница, 28 ноября 2014 г.

NGinx

Для каждого виртуального сервера я держу следующий конфиг
server {
        server_name server.com;

        root /opt/www/server_com/current/web;
        index index.html index.php;

        location / {
                try_files $uri $uri/ /index.php?$args;
        }

        location ~ \.php$ {
                fastcgi_pass unix:/run/php-fpm/socket;
                include fastcgi_params;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

        }
}
В этом конфиге есть несколько проблем с безопасностью и кеширование статического контента, но для первоначальной настройки подойдет.

SELinux

В Centos используется новая система контроля доступа. Обычной установки прав 0777 на каталоги runtime и web/assets будет не достаточно. Для этих каталогов нужно применить политику httpd_sys_script_rw_t командами
chcon -v --type=httpd_sys_script_rw_t ./runtime
chcon -v --type=httpd_sys_script_rw_t ./web/assets
Ознакомиться с разметкой файлов в вашей системе поможет простая команда:
semanage fcontext -l | grep httpd
Если удалить файлы и создать заново разрешения сбросятся. Лучше использовать регулярные выражения, которые позволят распространить политики на все вложенные каталоги и файлы.
semanage fcontext -a -t httpd_sys_content_t "/your/project(/.*)?"
restorecon -R /your/project

четверг, 27 ноября 2014 г.

php-fpm

По умолчанию php-fpm настроен на работу по tcp, но unix socket быстрее, поэтому исправляем файл /etc/php-fpm.d/www.conf
listen = /run/php-fpm/socket
user = nginx
group = nginx
Остальные параметры пока оставим как есть, нужно смотреть на реальную работу сервера для оптимизации.

SSH

Первым делом нужно завести нового пользователя в системе и добавим ему пароль
sudo adduser user
sudo passwd user
Со своего компьютера, в новом терминале выполним команду для добавления своего публичного ключа для авторизации ssh по ключу
ssh-copy-id user@server.name
Теперь можно легко авторизоваться без ввода пароля командой
ssh user@server.name
Теперь нужно запретить авторизацию для root и вход по паролю. Меняем порт на другой, отличный от 22. Исправляем файл /etc/ssh/sshd_config
Port 2220
PermitRootLogin no
PasswordAuthentication no
Из конфига узнаем, что если меняем номер порта нужно сообщить SELinux об этом, выполнив команду
semanage port -a -t ssh_port -p tcp 2220
Перегружаем sshd
sudo systemctl restart ssh.service 
Добавляем правило в фаервол и удаляем старое
sudo firewall-cmd --permanent --zone=public --add-port=2220/tcp
sudo firewall-cmd --permanent --zone=public --remove-service=ssh/tcp

Centos 7

Долгое время для своих проектов использовал fastvps, но пришло время для облачных хостингов и получив реферальную ссылку от своих знакомых зарегистрировался на DigitalOcean. Создал droplet с Centos 7 x64 и начал настройку. Добавил репозиторий EPEL и обновил все текущие пакеты.
sudo yum install https://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-2.noarch.rpm
sudo yum update -y 
Я использую сервер для веб поэтому начнем с установки nginx php mysql. Centos перешел на mariadb, это хорошо.
sudo yum install nginx php-fpm php-cli php-pdo php-mysqlnd php-curl php-mcrypt php-intl php-mbstring mariadb mariadb-server curl mc -y
Теперь эти службы нужно активировать и сделать так чтобы они запускались автоматически.
sudo systemctl enable mariadb.service
sudo systemctl enable nginx.service
sudo systemctl enable php-fpm.service
sudo systemctl start mariadb.service
sudo systemctl start nginx.service
sudo systemctl start php-fpm.service
Теперь устанавливаем пароль для mariadb
sudo mysql_secure_installation



FirewallD

В Centos 7 появился новый инструмент для настройки файервал - firewallD.
Первым делом его нужно активировать и запустить
sudo systemctl enable firewalld.service
sudo systemctl start firewalld.service
Затем нам необходимо включить доступ к серверу по http и ssh постоянно
sudo firewall-cmd  --permanent --zone=public --add-service=ssh
sudo firewall-cmd  --permanent --zone=public --add-service=http
 Я обычно ssh переношу на 2220 порт поэтому команду первую нужно заменить на
sudo firewall-cmd  --permanent --zone=public --add-port=2220/tcp