Все новости с меткой: linux


В этом посту я расскажу, как быстро настроить секьюрный доступ к вашему сайту по https с помощью самоподписанного сертификата. Минус такого подхода заключается в том, что пользователю придется постоянно добавлять в браузере в исключения ошибку "Ваше подключение не защищено". Но потом вы можете приобрести за деньги нормальный SSL-сертификат.

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

sudo mkdir /etc/apache2/ssl
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt

После этого Вам будет задана порция вопросов, на которые надо бы ответить:


Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Saint-Petersburg
Locality Name (eg, city) []:Saint-Petersburg
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Your Company
Organizational Unit Name (eg, section) []:RnD
Common Name (e.g. server FQDN or YOUR name) []:example.com
Email Address []:email@example.com

Затем надо подредактировать виртуальный хост апача, отдельный для SSL

sudo vim /etc/apache2/sites-available/default-ssl.conf

Туда накидать что-то вроде

<IfModule mod_ssl.c>
    <VirtualHost *:443>
        ServerAdmin admin@example.com
        ServerName example.com
        ServerAlias www.example.com

        DocumentRoot /var/www/example.com/

        ErrorLog ${APACHE_LOG_DIR}/error.log

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        <Directory />
            Options FollowSymLinks
            AllowOverride All
        </Directory>
        <Directory /var/www/example.com/>
            Options Indexes FollowSymLinks MultiViews
            AllowOverride All
            Order allow,deny
            allow from all
        </Directory>

        SSLEngine on
        SSLCertificateFile    /etc/apache2/ssl/apache.crt
        SSLCertificateKeyFile /etc/apache2/ssl/apache.key

        <FilesMatch "\.(cgi|shtml|phtml|php)$">
                SSLOptions +StdEnvVars
        </FilesMatch>
        <Directory /usr/lib/cgi-bin>
                SSLOptions +StdEnvVars
        </Directory>

        BrowserMatch "MSIE [2-6]" \
                nokeepalive ssl-unclean-shutdown \
                downgrade-1.0 force-response-1.0
        # MSIE 7 and newer should be able to use keepalive
        BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    </VirtualHost>
</IfModule>

Ну и в конце концов добавить новый виртуальный хост, активировать модуль ssl и перезапустить апаче

sudo a2ensite default-ssl.conf
sudo a2enmod ssl
sudo service apache2 restart

Ну и все, набираем https://ваш_домен.ру, подтверждаем исключение безопасности в браузере и наслаждаемся секурным транспортом. Лично мне это понадобилось для взаимодействия апи мерчанта, который передает в callback "особо важные данные" об оплате только по https.

Доне.

Подробнее




Нашел тут завалявшийся скрипт на bash, позволяющий автоматически загружать файлы в свой аккаунт на DepositFiles.com. Зачем это нужно? Ну к примеру этот сервис дает 5 баксов за 1000 скачиваний, а там можно прикрутить что угодно под этим соусом, ибо ручками грузить крайне неудобно.

Обидно, что сам сервис не придумал никакого внятного api для загрузки файлов. Работоспособность проверялась в июле 2015 года, если верстка сайта поменяется - допиливайте сами :) На выходе скрипт отдает ссылку на залитый файл, чуть позже он появляется в списке в вашем аккаунте.


В скрипте используется какой-то рандомный прокси из России, дабы не кидало с домена dfiles.ru на depositfiles.eu, если вдруг вы планируете запускать скрипт где-то не в России.

#!/bin/bash

cookieFile="depositcookies.txt"
login="login";
pass="passwd";
proxy="109.197.92.60:8080";

if [ $# -eq 0 ]; then
	echo "File for upload parameter missed!" 1>&2;
	exit 1;
else
	file="$1";
fi

data=`curl -sb $cookieFile http://dfiles.ru/`;

if ! echo "$data" | grep "$login" > /dev/null ; then
	curl -sc $cookieFile "http://dfiles.ru/login.php?return=%2F" > /dev/null
	curl -sc $cookieFile "http://dfiles.ru/api/user/login" -S \
	-F "login=$login" \
	-F "password=$pass" \
	 > /dev/null

	data=`curl -x "$proxy" -sb "$cookieFile" "http://dfiles.ru/"`;
	if ! echo "$data" | grep "$login" > /dev/null; then
		echo "$data";
		echo "ne ok";
		exit 2;
	fi
fi

action=`expr match "$data" ".*action=\"\([^\"]*\)\""`;
uploadIdentifier=`expr match "$data" ".*UPLOAD_IDENTIFIER\" value=\"\([^\"]*\)\""`;

data=`curl -sb "$cookieFile" "$action" -S \
-F "MAX_FILE_SIZE=2097152000" \
-F "UPLOAD_IDENTIFIER=$uploadIdentifier" \
-F "go=1" \
-F "agree=1" \
-F "files=@$file"`

echo "`expr match "$data" ".*parent.ud_download_url = '\([^']*\)'"`";
Подробнее




Как-то недавно заметил (спустя полгода), что отвалился модуль обратной связи, в котором использовалась php-функция mail, которая в свою очередь работала через ssmtp, прокинутого через Яндекс.Почту. А глядя в логи выяснилось вот что:

Server didn't like our AUTH LOGIN (530 5.7.7 Email sending without SSL/TLS encryption is not allowed. Please see: http://help.yandex.ru/mail/mail-clients/ssl.xml)

А потом почитал, что с 16 сентября 2014 года Яндекс.Почта ввела принудительное шифрование, поэтому стандартные порты для smtp стали рефьюзиться. Поэтому, если вы читали мою статью про настройку своего VDS-сервера самостоятельно, то соответствующий конфиг придется изменить:

/etc/ssmtp/ssmtp.conf
Подробнее




Обычно я собираю Qt4 из исходов, чтобы гарантировать работу с OpenSSL (т.е. Qt по умолчанию не слинкован с OpenSSL), а также поддержку Ubuntu 10.04+ путем сборки либ под gcc-4.4.3

Последняя версия Qt4 - 4.8.7, забрать ее можно отсюда

Установка зависимостей

sudo apt install libfontconfig1-dev libfreetype6-dev libx11-dev libxcursor-dev libxext-dev libxfixes-dev libxft-dev libxi-dev libxrandr-dev libxrender-dev libssl-dev libdbus-1-dev

Сборка и установка

Необходимо распаковать архив, например, в домашнюю папку, перейти туда и сконфигурировать. Лично я использую следующие параметры, в которых модуль QtNetwork будет уже слинкован с OpenSSL, который из-за BSD лицензии не может сразу поставляться вместе с либами Qt под LGPL. Поэтому из коробки у вас не заработает https, пока вы с ней не слинкуетесь.

./configure -fast -nomake demos -nomake examples -no-libtiff -no-libmng -qt-libjpeg -qt-libpng -qt-zlib -openssl-linked -no-qt3support -opensource -no-accessibility -no-stl -no-declarative-debug -no-opengl -no-svg -confirm-license

После этого запустить саму сборку (примерно на часик) и затем установить в систему

make -j
sudo make install

Кстати, можно собирать Qt и статически с ключом -static, чтобы на выходе получался цельный бинарь, без динамически подгружаемых библиотек, однако если в вашем приложение используется Webkit, то сделать это не удастся, тк он не умеет собираться статически =(

Подробнее




Представим, что мы хотим получать смску в определенное время каждый день, причем, где бы мы не находились) Конечно же, можно тупо поставить обычный будильник на телефон, но вся прелесть в том, что можно передавать какие-нибудь данные, которые периодически изменяются, например, курсы валют, погоду или какие-то свои технические данные с сервера. Для этого нам поможет сервис LittleSMS с открытым API, вся прелесть которого сводится к копеечным ценам за отправку смс (например, на номера российских операторов 0,5-0,9 рублей). Вам остается зарегистрироваться и получить ключ апи, для теста будет предложено несколько бесплатных смс.

Ну и сам код скрипта на bash


#!/bin/bash
   
user='user@yandex.ru' # Ваш логин (обычно, совпадает с емейлом)
sender='7953*******' # имя отправителя
api_key='*****' # API-ключ, есть в личном кабинете
test=0 # тестовый режим, в рабочем режиме параметр можно пропустить

recipients="37529*******";
days=$(expr 365 - `date +"%j"`);

message="До нового года осталось $days дней";

function sendSms() {
	echo `curl -k -s https://littlesms.ru/api/message/send \
		--data-urlencode "user=$user" \
		--data-urlencode "recipients=$recipients" \
		--data-urlencode "message=$1" \
		--data-urlencode "sender=$sender" \
		--data-urlencode "test=$test" \
		--data-urlencode "apikey=$api_key"`;
}

sendSms "$message"

Теперь осталось настроить crontab, чтобы скприпт срабатывал периодически

$ sudo crontab -e

В открывшемся файле запишем, например, каждый день в 0 часов 0 минут будет отправляться смс. Не забывайте, что время нужно указывать в локали GMT+0.

 # m h  dom mon dow   command

0 0 * * * /home/bingo/sms.sh

Доне

Подробнее




Бывает, что настает такой момент, когда мы начинаем понимать, что нам не хватает ограничений, наложенных виртуальным хостингом, и, наконец, собравшись духом, мы приобретаем выделенных виртуальный сервер на Linux, на котором, хм, кроме ssh-доступа на данный момент нет ничего. В этой статье я ничего не расскажу нового или сверхестественного, я ее просто помечу для себя, чтобы быстро настраивать очередной сервер, на случай переезда (предыдущий кстати очень дико тормозил, отвечал 2-3 секунды после запроса, частенько заканчивалась память сама по себе, либо он лежал). Кстати один раз они (2servers.ru) потеряли все данные на диске просто так и дико извинялись, благо я делал недавно бекап, так что обошлось.

Что ж, смелее, приступим. Речь пойдет про выделенный сервер на основе Ubuntu 12.04 LTS.


 

Чем будем редактировать

Многие инвалиды пользуются нано, но я таки советую использовать vim, тк не буду скрывать, что в нем настолько удобно работать, в том числе и создавать сайты прямо там, на удаленном сервере, не держа никаких локальных копий. Он может поначалу показаться сложным, но потом вы просто жить без него не сможете. Ставим:

# apt-get install vim

Чтобы выйти из вима, напишите :q. Ура! У вас получилось) Чтобы начать пользоваться - загуглите что нибудь на тему "vim basics" и я думаю уже через 10 минут вы запросто сможете начать править конфиги на лету. Чуть правее мне припомнилась довольно забавная шутка про emacs.

 

Меняем ssh-порт сервера по умолчанию

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

# vim /etc/ssh/sshd_config

Меняем параметр Port вместо 22 на любой свой перезапускаем

# service ssh restart

Также, чтобы потом не вводить постоянно порт при подключении, нужно поправить конфиг ssh на локальной машине

$ vim ~/.ssh/config

Этого файла может и не быть у вас, даже папки .ssh, но тем не менее туда нужно написать

Host yourServerIp
Port yourPort

 

Делаем авторизацию на сервер без ввода пароля по RSA ключу

Постоянно вводить пароль надоедает. Можно сгенерировать ключ на своей машине и заходить туда без ввода пароля. Для этого на своей машине делаем

$ ssh-keygen

Соглашаемся со всем, если машиной пользуетесь не только вы, то рекомендуется ввести какой-нибудь пароль, который будет запрашиваться при попытке использования ключа, на вашей машине. Затем копируем ваш паблик кей на сервер

$ ssh-copy-id root@yourserver

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

ssh root@yourserver

 

Устанавливаем Apache2 и PHP5

Ставим веб сервер вместе с PHP.

# apt-get install apache2 libapache2-mod-php5 php5 php5-curl php5-gd php5-mcrypt

После установки убедимся, что все работает

# cd /var/www
# rm index.html
# vim index.php

В открывшемся новом файле напишем

<?php phpinfo(); ?>

Сохраняем файл в виме, нажав :wq. Теперь можно открыть браузер и написать айпишник вашего сервера. На нем вы увидите информацию о php :)

 

Устанавливаем MySQL

# apt-get install mysql-server mysql-client php5-mysql

В процессе установки вас попросят ввести новый пароль для доступа рута к серверу БД

 

Перенос баз данных со старого сервера

Если необходимо импортировать базы данных с предыдущего хостинга, необходимо сделать на нем дамп:

# mysqldump -uroot -p --all-databases | gzip > databases.sql.gz

Затем можно напрямую скачать файл со старого хотсинга на новый через wget или scp. После этого для импорта необходимо написать уже на новом сервере

# gunzip < databases.sql.gz | mysql -uroot -p

Кстати, если на предыдущем хостинге mysql сервер доступен извне, то mysqldump можно выполнять сразу на новом сервере, всего лишь указав удаленный адрес сервера, используя параметр --host="remoteIp"

 

Отправка почты с сервера для сайтов

Обычно большинство php скриптов отправляют почту, испозуя простую функцию mail. В свою очередь php использует утилиту sendmail. Но мы не собираемся устанавливать свой почтовый сервер, это не выгодно по ресурсам, будем использовать яндекс-почту к примеру для отправки писем. Для этого установим:

# apt-get install sendmail ssmtp

Подредактируем конфиг /etc/ssmtp/ssmtp.conf

root=postmaster

# The place where the mail goes. The actual machine name is required no 
# MX records are consulted. Commonly mailhosts are named mail.domain.com
mailhub=smtp.yandex.ru:465

# Where will the mail seem to come from?
#rewriteDomain=

# The full hostname
hostname=example.com

# Are users allowed to set their own From: address?
# YES - Allow the user to specify their own From: address
# NO - Use the system generated From: address
FromLineOverride=YES
UseTLS=YES
AuthUser=email
AuthPass=password

Если желаете, чтобы почта отправлялась от имени вашего домена, то для этого вам необходимо зарегистрировать свой домен и прикрутить к нему почтовый ящик на pdd.yandex.ru, тк яндекс не разрешает отправлять почту с несуществующих адресов.

 

Настраиваем виртуальные хосты в apache

Все сайты, как правило, хранятся по папочкам с точным названием домена в директории /var/www/. Положим, у нас есть сайт test.ru, создадим для него виртуальный хост в настройках apache:

# vim /etc/apache2/sites-available/test.ru

В новом файле напишем конфиг:

<VirtualHost *:8080>
	ServerAdmin bingo@bingosoft.info
	ServerName test.ru www.test.ru
	DocumentRoot /var/www/test.ru/
	<Directory />
		Options FollowSymLinks
		AllowOverride All
	</Directory>
	<Directory /var/www/test.ru/>
		Options Indexes FollowSymLinks MultiViews
		AllowOverride All
		Order allow,deny
		allow from all
	</Directory>
</VirtualHost>

Сохраним файл и расскажем apache про новый сайт

# a2ensite test.ru

# service apache2 restart

Все, после того, как вы пропишите у DNS-серверов, на который указывает ваш домен, IP адрес вашего сервера, то можно смело набирать адрес вашего домена - и вуаля, сайт работает! По такой же аналогии настраиваются и остальные домены. Кстати, в качестве бесплатного днс-хостинга рекоммендую namecheap.com, там есть раздел Free DNS. И ни в коем случае не используйте днс-хостинг freedns.afraid.org, тк все внешние ссылки из ВКонтакте, ведущие на ваш домен в этом случае будут считаться якобы ПОТЕНЦИАЛЬНО ОПАСТНЫМИ!!111

 

Разруливаем статику и динамику с помощью nginx

При большой посещаемости на ваши домены имеет смысл распределить нагрузку для разного отдаваемого контента. Поговаривают, что статические файлы (картинки, скрипты, архивчики и тд) nginx отдает очень резво, по сравнению с apache, и при этом не отжирает так много памяти. А если запрашивается динамический контент, например скрипт, то он перенаправляет свой запрос к apache и работает как прокси-сервер.

Что ж, ставим nginx

# apt-get install nginx

В итоге nginx будет слушать 80ый порт, тогда апач стоит повесить на какой-нибудь другой, например 8080. Поправим это в конфиге:

# vim /etc/apache2/ports.conf

Заменяем параметры портов на свои:

NameVirtualHost *:8080
Listen 8080

Теперь настраиваем конфиг nginx

server {
    listen 80 default; # этот конфиг - умолчательный для 80 порта
    server_name _;  # хитрый ключик, обозначающий, что этот конфиг применим для любого сайта

    set $sathost $host;  # В sathost будет лежать имя сайта. Так же должна называться директрия с сайтом

    # убираем www
    if ( $host ~ ^(www\.)?(.+)$ ) {
        set $sathost $2;
    }

    if (!-d /var/www/sites/$sathost) { # если не нашли директорию с именем запрошенного сайта
        set $sathost default-site-foler;
    }
    
    root   /var/www/sites/$sathost; # конень сайта определяем автоматически
    index index.php index.html index.htm; # в каком порядке искать индексные файлы

    location / {   # правила ниже применяются для любых запросов

        proxy_pass http://serverIp:88;
        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 ~ \.(png|jpg|exe|deb|js|css)$ { # static
        expires  1d;
        break;
    }  

    location ~ /\.ht { # в файлах, начинающихся на «.ht» могут лежать пароли или оставшиеся настройки от Апача - отдавать это ни к чему.
        deny  all;
    }
}

После правки этого конфига не забудьте поменять в настройках каждого сайта в /etc/apache2/sites-available порт на 8080 в ноде VirtualHost

Все, теперь можно перезапустить nginx и apache и проверить работу ваших сайтов.

# service apache2 restart

# service nginx restart

Вроде бы это все из базовой настройки сервера. Казалось бы, ничего сложного и нет, даже не нужно покупать никаких дибильных ISP-манагер панелей за 10баксов в месяц, которая делает те же комманды))

Подробнее




Бывает такое очень страшное желание выкачать весь сайт целиком (с картинками, скриптами, шаблонами и так далее). Не буду признаваться зачем, просто оставлю это здесь:

site="http://cleancanvas.herokuapp.com/";
domain="cleancanvas.herokuapp.com";
wget --recursive --no-clobber --page-requisites --html-extension --convert-links --restrict-file-names=windows --domains $domain  --no-parent $site
Подробнее




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

Так вот, проблема заключается в следующем: как без установки фотошопа и без запуска gimp легко и просто массово изменить размеры всех изображений, находящихся в папке в линукс, используя лишь консоль?

Для начала поставим пакет imagemagick

$ sudo apt-get install imagemagick

Ну и собственно сам скриптец:

for file in *.png; do
	convert $file -resize 65x59 $file;
done

Так же мы можем распараллелить сам процесс конвертации, если у нас несколько процессоров:

procs=`cat /proc/cpuinfo | grep processor -c`;

for file in *.jpg; do
	echo "converting $file...";
	while [ `ps -e | grep convert -c` -ge $procs ] ; do
		sleep 1s;
	done;
	convert $file -resize 33% $file &
done;

Доне.

Подробнее