понедельник, 29 августа 2011 г.

Установка и первоначальная настройка Django/PHP/Apache/Nginx на Ubuntu Server 11.04

Решение о написании подобного поста пришло достаточно внезапно. Просто удобнее в виртуальной машине настроить подобный сервер, нежели перезагружаться в отдельно стоящую ubuntu.
Данный пост вообще задумывается больше как заметка для себя самого, но, уверен, пригодится и другим людям.
В качестве ПО виртуализации я использую бесплатный VirtualBox. При настройке виртуальной машины я выбрал тип сети - сетевой мост, поскольку мне удобнее пробросить порты на роутере. Вы же можете сделать как вам удобнее. Память я ограничу на уровне 256мб.
При установке Ubuntu Server (я буду использовать 64-битный вариант, так что листинг команд будет для этой платформы) на одном из этапов можно выбрать, какое ПО установить сразу. Я выбираю обычно лишь SSH Server, дабы потом всю настройку производить уже из основной ОС, да и плюс можно копировать команды из разных мануалов, разбросанных по куче сайтов. Также настоятельно рекомендую языком системы выбрать английский, поскольку PuTTY (ssh-клиент) жутко не любит кириллицу.

Что в итоге будет получено? Я опишу установку и базовую настройку apache 2 (mod_wsgi и mod_php), nginx (статика), postgresql (для django-проектов), mysql (фактически, форк - Percona Server - отличается повышенной производительностью; устанавливается для php CMS), python/django (версии 2.7 и 1.3 соответственно), php с пачкой нужных расширений, а также memcached. Ах да, чуть не забыл. Конечно же, я установлю ещё и proftpd-server.
По возможности, буду использовать ppa для получения свежих версий пакетов, поскольку официальные репозитории далеко не всегда актуальны.



В качестве ssh-клиента под Windows я буду пользоваться PuTTY.

После установки ubuntu server и первой перезагрузки логинимся под нашим пользователем и выполняем единственную команду,
ifconfig
которая покажет нам, какой ip присвоен серверу роутером. Далее по этому айпи можно подключаться через PuTTY.
Первым делом, надо обновить информацию о пакетах и сами пакеты. Одной строкой. Будет спрошен пароль - вводите тот же, который и для пользователя.
sudo apt-get update && sudo apt-get upgrade -y
По умолчанию установлен Python версии 2.7.1, что нас вполне устраивает. Так что приступим к установке apache.
sudo apt-get install apache2 libapache2-mod-wsgi libapache2-mod-php5 -y
 sudo a2enmod expires rewrite headers && sudo service apache2 restart
После этого, если вы зайдёте по ip виртуальной машины, вы увидите дефолтную страничку апача.
Теперь установим django.
sudo apt-get install python-dev python-setuptools -y && sudo easy_install django
 Устанавливаем MySQL (Percona Server).
gpg --keyserver  hkp://keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A && gpg -a --export CD2EFD2A | apt-key add -
Открываем файл /etc/apt/sources.list и добавляем в конец 2 строчки.
sudo nano /etc/apt/sources.list
deb http://repo.percona.com/apt maverick main
deb-src http://repo.percona.com/apt maverick main
Сохраняемся сочетанием Ctrl + O, Enter и затем выходим сочетанием Ctrl + X.
sudo apt-get update && sudo apt-get install -y --force-yes percona-server-common-5.5 percona-server-client-5.5 percona-server-server-5.5
 При установке система спросит у вас желаемый пароль для MySQL. Вводим дважды.
 Далее создаём каталоги для тестового сайта.
sudo mkdir -p /home/django-projects/testsite && sudo django-admin.py startproject apps && sudo perl -pi -e 's/apps.urls/urls/g' apps/settings.py && sudo mkdir -p /home/django-projects/testsite/deploy && sudo mkdir -p /home/django-projects/testsite/media && sudo mkdir -p /home/django-projects/testsite/logs
Теперь надо создать виртуальный хост для нашего сайта. Я зарегистрировал для этого бесплатный домен nya-kawaii.no-ip.org на сайте no-ip.com.Сохранять и закрывать тектовые файлы в nano мы уже умеем, так что повторяться не буду.
sudo nano /etc/apache2/sites-enabled/nya-kawaii
 <VirtualHost *:80>

    ServerAdmin itigokurosaki@gmail.com
    ServerName nya-kawaii.no-ip.org

    ErrorLog    /home/django-projects/testsite/logs/error_log
    CustomLog   /home/django-projects/testsite/logs/access_log common

    WSGIScriptAlias / /home/django-projects/testsite/deploy/django.wsgi

    WSGIDaemonProcess ad-site home=/home/django-projects/testsite/media/ \
                      processes=2 threads=4 maximum-requests=100 display-name=apache-dw-wsgi
   
    Alias "/media_admin/" "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/contrib/admin/media/"
    <Location "/media_admin/">
        SetHandler None
    </Location>

    Alias "/media/" "/home/django-projects/testsite/media/"
    <Location "/media/">
        SetHandler None
    </Location>
</VirtualHost>
sudo nano /home/django-projects/testsite/deploy/django.wsgi
 #/usr/bin/python
# -*- coding: utf-8 -*-
import os, sys

dn = os.path.dirname
PROJECT_ROOT = os.path.abspath( dn(dn(__file__)) )
DJANGO_PROJECT_ROOT = os.path.join(PROJECT_ROOT, 'apps')
sys.path.append( DJANGO_PROJECT_ROOT )

os.environ['DJANGO_SETTINGS_MODULE'] = 'settings'

import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()
sudo service apache2 restart
Теперь, когда я захожу по адресу http://nya-kawaii.no-ip.org (у вас - свой адрес), я вижу страничку "Welcome to Django".
Теперь установим PHP, добавим alias для PHP в конфиг виртуального хоста и проверим правильность установки.
sudo apt-get install -y --force-yes php5-mysql php5-curl php5-gd php5-idn php-pear php5-imagick php5-imap php5-mcrypt php5-memcache php5-ming php5-ps php5-pspell php5-recode php5-snmp php5-sqlite php5-tidy php5-xmlrpc php5-xsl php5-pgsql
sudo nano /etc/apache2/sites-enabled/nya-kawaii
<VirtualHost *:80>

    ServerAdmin itigokurosaki@gmail.com
    ServerName nya-kawaii.no-ip.org

    ErrorLog    /home/django-projects/testsite/logs/error_log
    CustomLog   /home/django-projects/testsite/logs/access_log common

    WSGIScriptAlias / /home/django-projects/testsite/deploy/django.wsgi

    WSGIDaemonProcess ad-site home=/home/django-projects/testsite/media/ \
                      processes=2 threads=4 maximum-requests=100 display-name=apache-dw-wsgi
    #WSGIProcessGroup www

    Alias "/media_admin/" "/usr/local/lib/python2.7/dist-packages/Django-1.3-py2.7.egg/django/contrib/admin/media/"
    <Location "/media_admin/">
        SetHandler None
    </Location>

    Alias "/media/" "/home/django-projects/testsite/media/"
    <Location "/media/">
        SetHandler None
    </Location>

    Alias "/php/" "/home/django-projects/testsite/php/"
    <Location "/php/">
        SetHandler None
    </Location>
</VirtualHost>
sudo mkdir /home/django-projects/testsite/php && cd /home/django-projects/testsite/php && sudo nano info.php
<?php
phpinfo();
?>
sudo service apache2 restart
Теперь заходим по адресу http://nya-kawaii.no-ip.org/media/info.php и видим информацию обо всех загруженных модулях php.
Теперь установим proftpd-server и поправим права на папку django-projects так, чтобы не требовался root-доступ для изменения содержимого данного каталога.
sudo chmod 777 -R /home/django-projects/
sudo apt-get install -y proftpd ucf
При установке будет спрошено, какой режим запуска выбрать - выбираем standalone.
Теперь устанавливаем каталог, в котором мы будем оказываться при заходе на ftp - /home/django-projects/
sudo nano /etc/proftpd/proftpd.conf
Находим строчку DefaultRoot и заменяем её на эту. Потом сохраняемся и выходим из nano.
DefaultRoot                     /home/django-projects/
sudo service proftpd restart
Пробуем зайти с логином и паролем от системы на наш ftp.
Теперь установим PostgreSQL.
sudo apt-get install python-software-properties -y && sudo add-apt-repository ppa:pitti/postgresql && sudo apt-get update && sudo apt-get install postgresql -y && sudo -u postgres pg_dropcluster --stop 9.0 main && sudo -u postgres pg_createcluster --start -e UTF-8 9.0 main
sudo -u postgres psql postgres
\password postgres
Вводим дважды пароль, который будет установлен для административного пользователя postgres сервера БД PostgreSQL. И потом выходим из этой консоли.
\q
Теперь установим базирующиеся на php утилиты web-администрирования MySQL и PostgreSQL. Для этого в папке /testsite/php (через ftp-доступ) требуется создать 2 каталога - phpmyadmin и phppgadmin. Затем скачиваем обе утилиты с их официальных сайтов - phpmyadmin (я скачивал в формате 7z) и phppgadmin (тут я zip-архив скачал).
Теперь проверяем корректность работы postgresql и mysql. Для этого заходим для начала по адресу http://nya-kawaii.no-ip.org/php/phpmyadmin/ и вводим в качестве логина - root, а в качестве пароля - тот, который вы устанавливали при установке percona server.
А для postgresql логином будет postgres, паролем - тот, который мы установили при настройке, а адресом - http://nya-kawaii.no-ip.org/php/phppgadmin/
Однако вначале нам понадобится чуть-чуть изменить конфиг phpmyadmin для того, чтобы было возможно входить с логином postgres. По-умолчанию данный логин недопустим для входа из соображений безопасности - ведь вначале у данного пользователя нет пароля. Однако, поскольку мы установили пароль, данная мера безопасности избыточна.
cd /home/django-projects/testsite/php/phppgadmin/conf/
nano config.inc.php
Находим строчку  $conf['extra_login_security'] = true; и заменяем её на $conf['extra_login_security'] = false;
А также строчку  $conf['servers'][0]['host'] = ''; заменяем на $conf['servers'][0]['host'] = 'localhost';

Ещё надо немного подправить конфиг postgresql.
sudo nano /etc/postgresql/9.1/main/pg_hba.conf
Находим внизу пачку строчек с настройкой авторизации. В итоге они должны выглядет так.
# Database administrative login by Unix domain socket
local   all             postgres                                ident

# TYPE  DATABASE        USER            ADDRESS                 METHOD

# "local" is for Unix domain socket connections only
local   all             all                                     md5
# IPv4 local connections:
host    all             all             127.0.0.1/32            md5
# IPv6 local connections:
host    all             all             ::1/128                 md5
# Allow replication connections from localhost, by a user with the
# replication privilege.
#local   replication     postgres                                peer
#host    replication     postgres        127.0.0.1/32            ident
#host    replication     postgres        ::1/128                 ident
Вот теперь можно логинится через web-интерфейс phppgadmin.

Теперь доустановим поддержку mysql и postgresql для django.
sudo apt-get install -y postgresql-server-dev-9.1 python-mysqldb && sudo easy_install psycopg2
Теперь установим nginx и подправим конфиги apache, поскольку теперь он не должен "слушать" 80 порт.
sudo add-apt-repository ppa:nginx/stable && sudo apt-get update && sudo apt-get install -y nginx
sudo nano /etc/apache2/ports.conf
И меняем в двух местах 80 на 8080. Далее создаём виртуальный хост для nginx.
sudo nano /etc/nginx/sites-enabled/nya-kawaii
upstream backend {
  server 127.0.0.1:8080;
}

server {
            listen   80;
            server_name nya-kawaii.no-ip.org;

            access_log /home/django-projects/testsite/logs/nginx_access.log;
            error_log /home/django-projects/testsite/logs/nginx_error.log;

            location / {
                        proxy_pass  http://backend;
                        include     /etc/nginx/proxy.conf;
            }

            location  /media/ {
                        root /home/django-projects/testsite/media;
            }
}
Создаём файл /etc/nginx/proxy.conf
sudo nano /etc/nginx/proxy.conf
 proxy_redirect              off;
proxy_set_header            Host $host;
proxy_set_header            X-Real-IP $remote_addr;
proxy_set_header            X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size        10m;
client_body_buffer_size     128k;
proxy_connect_timeout       90;
proxy_send_timeout          90;
proxy_read_timeout          90;
proxy_buffer_size           4k;
proxy_buffers               4 32k;
proxy_busy_buffers_size     64k;
proxy_temp_file_write_size  64k;
И правим порт в конфиге виртуального хоста, который мы создавали для апача - в первой строке заменяем 80 на 8080.
sudo nano /etc/apache2/sites-enabled/nya-kawaii
 Перезапускаем службы apache2 и nginx
sudo service apache2 restart && sudo service nginx restart
Проверяем работу - заходим на http://nya-kawaii.no-ip.org, http://nya-kawaii.no-ip.org/php/info.php

Осталось совсем мало - установить memcached.
sudo apt-get install -y memcached
На этом этапе я перезагружаю виртуальную машину, чтобы посмотреть на количество потребляемой памяти.
sudo reboot
И, вот количество потребляемой оперативки.
top - 18:00:40 up 0 min,  1 user,  load average: 1.37, 0.47, 0.16
Tasks:  89 total,   1 running,  88 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.0%sy,  0.0%ni, 99.0%id,  1.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:    246240k total,   241288k used,     4952k free,    13988k buffers
Swap:   520188k total,        0k used,   520188k free,   100120k cached
Видно, что едва-едва вписывается всё в оперативную память, однако, и установлено было весьма немало.

На этом данное руководство закончилось, надеюсь, и вам пригодится.

Комментариев нет :

Отправить комментарий