пятница, 14 апреля 2017 г.

ssmtp отправка почты с нескольких сайтов на одном хостинге

В примере используется почта для домена от Яндекса.
Для каждого пользователя (сайта) user1.tld и user2.tld настроена своя почта для домена.

Конфигураци SSMTP

Нужно создать несколько конфигов ssmtp для каждого VirtualHost

Конфигурация 1
nano /etc/ssmtp/ssmtp-user1.conf
root=mail@user1.tld
mailhub=smtp.yandex.ru:465
RewriteDomain=user1.tld
Hostname=mail@user1.tld
# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
FromLineOverride=YES
AuthUser=mail@user1.tld
AuthPass=passwd
AuthMethod=LOGIN
UseTLS=YES
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt
Debug=NO
Конфигурация 2
nano /etc/ssmtp/ssmtp-user2.conf
root=mail@user2.tld
mailhub=smtp.yandex.ru:465
RewriteDomain=user2.tld
Hostname=mail@user2.tld
# Set this to never rewrite the "From:" line (unless not given) and to
# use that address in the "from line" of the envelope.
FromLineOverride=YES
AuthUser=mail@user2.tld
AuthPass=passwd
AuthMethod=LOGIN
UseTLS=YES
TLS_CA_File=/etc/pki/tls/certs/ca-bundle.crt
Debug=NO

Вторая конфигурация SSMTP (Revaliases)
nano /etc/ssmtp/revaliases

root:mail@user1.tld:smtp.yandex.ru:465
root:mail@user2.tld:smtp.yandex.ru:465

Что бы письма были отправлены не от пользователя apache (www-data) изменим комментарий пользователю. 
Этот комментарий будет виден в имени отправителя.

chfn -f "Web Email" apache

Конфигурация APACHE 

Для каждой конфигурации сайта (VirtualHost) нужно указать конфигурацию ssmtp.

nano /etc/httpd/conf.d/user1.tld.conf

<VirtualHost *:8080>
ServerName user1.tld#****
</VirtualHost>
<Directory "/home/user1.tld/html">
php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-user1.conf"
php_admin_value sendmail_from "mail@user1.tld"
#****
</Directory>

nano /etc/httpd/conf.d/user2.tld.conf

<VirtualHost *:8080>
ServerName user2.tld#****
</VirtualHost>
<Directory "/home/user2.tld/html">
php_admin_value sendmail_path "/usr/sbin/ssmtp -t -C/etc/ssmtp/ssmtp-user2.conf"
php_admin_value sendmail_from "mail@user2.tld"
#****
</Directory>

Перезапустить apache и проверить отправку писем
<?
mail('your@email.com', 'Test From Your-Site', 'Test Message from Sendmail by PHP');
?>

Настройка nginx+apache и нескольких VirtualHost


Конфигурация nginx


user  nginx;
worker_processes  1;
error_log  /var/log/nginx/error.log warn;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

Конфиг httpd

***
Include conf.d/*.conf
User apache
Group apache
***

Пользователи

Имя пользователя = имя домена

adduser user.tldmkdir /home/user.tld/html
mkdir /home/user.tld/log
chown user.tld /home/user.tld/ -R
chgrp apache /home/user.tld/ -R
chmod 755 /home/user.tld/ -R
sudo usermod -a -G apache user.tldpasswd user.tld
Аналогично создаем пользователя для поддомена, в данном случае sub.user.tld.

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

VirtualHost в httpd


Домен
nano /etc/httpd/conf.d/user.tld
<VirtualHost *:8080>
ServerName user.tld
ServerAlias www.user.tld
ServerAdmin webmaster@user.tld
ErrorLog /home/user.tld/log/error.log
CustomLog /home/user.tld/log/access.log combined
DocumentRoot /home/user.tld/html/
</VirtualHost>
<Directory "/home/user.tld/html">
Order deny,allow
Allow from all
</Directory>
Поддомен (этот шаг тоже пропускаем, если нужны динамические поддомены
в папке основного пользователя)
nano /etc/httpd/conf.d/sub.user.tld
<VirtualHost *:8080>
ServerName sub.user.tld
ServerAlias www.sub.user.tld
ServerAdmin webmaster@user.tld
ErrorLog /home/user.tld/log/error.log
CustomLog /home/user.tld/log/access.log combined
DocumentRoot /home/user.tld/html/sub/
</VirtualHost>
<Directory "/home/user.tld/html/sub/">
Order allow,deny
Allow from all
</Directory>

Домен + поддомен в NGINX

#Домен
server {
    listen       *:80;
    server_name user.tld www.user.tld; ## localhost;
    charset utf8;
    access_log /home/user.tldlog/access.log main;
    location / {
        proxy_pass http://user.tld:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
        root /home/user.tld/html/;
        access_log off;
        expires 30d;
    }
error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
    location ~ /\.ht {
        deny  all;
    }
}

#Поддомен
server {
        listen *:80;
        server_name sub.user.tld www.sub.user.tld;
    location / {
       ## index  index.php index.html index.htm;
        proxy_pass http://sub.user.tld:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_connect_timeout 120;
        proxy_send_timeout 120;
        proxy_read_timeout 180;
    }
    location ~* \.(jpg|jpeg|gif|png|ico|css|bmp|swf|js|html|txt)$ {
        root /home/sub.user.tld/html/;
        access_log off;
        expires 30d;
    }
}


Для динамических поддоменов (в этом случае апач будет искать поддомен в user.tld/sites/)
т.е. в апаче не нужно создавать VirtualHost, но и владелец всех поддоменов будет user.tld
server {
    server_name   ~^(?<dynamic>[a-z0-9\-]+)\.user.tld$;
    location / {
        proxy_pass user.tld:80/sites/$dynamic$uri$is_args$args;
    }
}


В итоге получили два сайта, user.tld и sub.user.tld, управляемых разными пользователями user.tld и sub.user.tld в первом варианте, и одним пользователем - во втором.