Очень часто именно программистам приходится заниматься сервером. Что включает в себя понятие «заниматься сервером»:

  • Создание баз данных, бекапы, создание пользователей для доступа к базе
  • Работа с SVN
  • Создание приложений в IIS
  • Мониторинг производительности сервера.

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

Установка сервера

Обычно хостер делает эту работу за нас. Т.е. вы выбираете конфигурацию Windows Web Server с SQL Sever 2012, и хостер делает все необходимые базовые настройки. В случае, если вам поставили голый сервер. То вам надо будет сделать следующее:

  1. Добавить роль IIS через Server Manager.
  2. Установить SQL Server 2012 EE.
  3. Если необходимо, то устанавливаем .NET 4.5

Работа с базой

Сначала надо создать базу. Делается это при помощи SQL Management Studio.

После этого мы настраиваем пользователя для доступа к базе. Создаем имя входа, назначаем пароль и даем ему доступ к созданной базе.

  1. Создаем базу
  2. В общей вкладе Безопасность (т.е. не относится конкретно к созданной базе) создаем имя  входа и связываем  его с базой (вкладка Сопоставление, ставим роль dbo).
  3. Находим созданного пользователя здесь (Наша база / Безопасность / Пользователи) и устанавливаем в обоих списках роль db_owner
  4. Проверяем доступ из под нового пользователя к данной базе. При этом к другим базам сервера у этого пользователя доступа не будет.

Очень часто у вас будет возникать задача по воссозданию определенной базы (например, для Ruden CMS). Для этого мы сначала делаем бекап-образ базы. И затем восстанавливаем его в новую базу данных. Сделать это можно с помощью следующих скриптов:

Сделать бекап базы:

BACKUP DATABASE ArkAS

TO DISK = 'C:\temp1\arkAS.bak'

WITH INIT ;

———————————

Восстановить базу из бекапа.

RESTORE DATABASE BDName

FROM DISK = 'C:\temp1\arkAS.bak'

WITH REPLACE,

MOVE 'arkAS' TO 'C:\DBs\dbName.mdf',

MOVE 'arkAS_log' TO 'C:\DBs\dbName.ldf'

—————————–

Индексы

Индексы нужны для ускорения извлечения данных. По сути индекс – это отдельная упорядоченная таблица по определенному полю (или по нескольким полям). Общее правило: создавайте индексы на те поля, по которым идет фильтрация (участвует в разделе WHERE оператора SELECT). Очень часто это может быть внешним ключом. Внешние ключи – это первый кандидат на создание индекс. Важный момент – очень осторожно используйте индекс для строковых полей, поскольку это очень может сильно сказаться на размере базы.  Еще момент – индекс замедляет добавление записей (потому что при этом по сути добавляется не одна запись, а две – в таблицу и в индекс). Поэтому если ваши данные очень часто меняются – то возможно вам не нужен индекс по выбранным полям.

Очень хорошая практика – периодически запускать скрипт на базе, которые пересоздает или реорганизует индекты. Пересоздание блокирует на время базу и физически меняет порядок строк в индексе. Реорганизация – это более мягкий процесс, не требующий блокировки базы. Просто ставьте этот скрипт 1 раз в день в ночь.

Внешние ключи

Внешний ключ нужен для связи таблиц и для ускорения доступа к данным. Дополнительная функция ключа – обеспечение целостности данных в базе. Т.е. если у вас в таблице есть внешний ключ categoryID – то он может принимать только конкретные значения из другой таблицы либо быть пустым (null). Желательно, делать внешние ключи в одинаковом стиле. Мы делаем это поле всегда заканчивающимся на ID, например, typeID. Так сразу понятно, что это внешний ключ на таблицу типов. В нашем случае практически всегда внешний ключ ссылается на первичный ключ с именем id в другой таблице. Это происходит потому, что в наших таблицах всегда стоит такой первичный ключ без исключений. Обязательно проставляйте внешние ключи если они есть, т.к. это значительно упрощает создание LINQ запросов при создании BLL уровня. Давайте рассмотрим, как создавать такие внешние ключи в среде SQL Management Studio.

Чтобы создать внешний ключ, необходимо выполнить следующее:

  1. Design Table (Проект таблицы)
  2. Отношения (Relationships)
  3. Добавляем ключ, указываем главную таблицу и в ней первичный ключ (в нашем случае внешний ключ всегда ссылается на первичный ключ).
  4. Указываем в нашей таблице внешний ключ (например, categoryID).
  5. Указываем тип удаления:
  • Set Null – при удалении первичной записи в поле дочерней записи во внешнем ключе установится Null
  • No Action – если есть дочерние записи, то запись в родительской таблице не удалится.
  • Cascade – запись в дочерней таблице удалиться автоматически

Дочерние таблицы

Особый момент надо сказать об управлении записями дочерней таблицы при изменении или удалении записи из родительской таблицы. Изменение для нас неактуально, т.к. внешний ключ всегда ссылается на первичный ключ id. C удалением есть 4 момента:

  1. Не удалять, если есть дочерние записи.
  2. Установить внешний ключ в null. Используйте этот вариант, если только вы правильно обрабатываете в приложении такие битые ссылки.
  3. Установить в значение по умолчанию. На мой взгляд это не очень удобно и лучше программно обрабатывать такие моменты.
  4. Каскадное удаление. Используйте только в том случае, если дочерние записи не имеют смысла без родительской, например действия пользователя без самого пользователя.

Какой тип выбирать – смотрите по ситуации. В большинстве ситуаций это будет либо каскадное удаление, либо установка в null.

Типы данных

Для строк лучше всего использовать nvarchar (ни в коем случае не используйте nchar – это очень неудобно при дальнейшей работе с данными). Если поле очень большое, то лучше использовать nvarchar(MAX) или text. Деньги храните либо в типе money либо в decimal (18,2). Дата и время – тип datetime. Важный момент – изучите различные функции работы с датами (getdate, datediff, dateadd и др) – это будет часто встречаться. Очень важный тип – это uniqueidentifier. Это guid – уникальный 32 битный код. Для генерации нового значения используется функция newid().

Примечание

Говорил не раз – обязательно очень аккуратно подходите в именование таблиц и полей в базе: правильно выбирайте имена и соблюдайте нотацию. Неверно выбрав имя при создании базы – вы и другие программисты будете постоянно сталкиваться по ходу разработки проекта с этой проблемой. Халатность здесь просто недопустима. Очень-очень важный момент. Либо заблокируйте доступ к sa пользователю на базе, либо сделайте очень сложный пароль. Очень часто злоумышленники пытаются взломать пароль sa методом перебора. Получение этого доступа злоумышленником может означать очень большие для вас проблемы.

Назначенные задания

Назначенные задания нужны для того, чтобы периодически что-то запускать на сервере. Для чего мы обычно используем назначенные задания:

  • Создание бекапов
  • Периодический запуск каких-либо страниц на сайте (например, для обновления курса доллара по отношению к рублю с использования API Центрального банка РФ).
  • Запуск SVN на сервере
  • Пересоздание индексов.

Firewall

Далее займемся настройкой Firewall. Крайне не рекомендуется выключать файерволл по причине того, что кто-то постоянно будет сканировать порты вашего сервера. Открывайте только те порты, которые действительно вам нужны для работы (например, SQL порт). Как вариант можно открывать порты только по определенным IP адресам. По факту вам не так нужен удаленный доступ для базы, т.к. приложение работает с базой локально. Однако разработчикам это нужно для локальной работы с приложением (например, поиск ошибки). В этом случае добавьте правило только на определенные IP адреса.

SVN

Теперь давайте настроим SVN для работы. Вам нужно установить на сервер 2 программы – SVN сервер и Tortise SVN. Здесь я приведу краткую инструкцию которую мы используем для установки SVN, а также для автоматического update в рабочую папку сайта (т.е. вы заливаете изменения в SVN и автоматически идет update на сайт).

Для работы с SVN мы используем Tortoise SVN

Первичная загрузка проекта из репозитория

  1. В новой папке делаем SNV Checkout
  2. Указываем адрес (svn://…) и логин/пароль.
  3. Ставим в Unversion and add Ignore List папку Obj и файл SUO

Общий порядок работы с SNV

  1. Перед началом работы делаем Update.
  2. Если вам надо менять общие файлы или вы добавляете файлы в проект (а значит меняете файл .Proj) – то после добавления сразу делаете Commit
  3. После выполнения работы сделайте Commit
  4. Теперь вы можете проверить свои изменения на сервере (т.е. на сайте). Изменения автоматически записываются в папку сайта через SVN Hook.

Действия при возникновении коллизий

  1. Если проблема в папке Bin – то удаляем все файлы rXX, перекомпилируем проект и заливаем на сервер (commit).
  2. Если проблема в Proj файле – смотрим какие изменения были в этом файле и склеиваем их вручную.
  3. Если изменения где-то в коде – то склеиваем.
  4. Если в неделимых файлах как edbx – то удаляем свою версию, ставим версию с сайта и добавляем свои изменения сверху.

Настройка сайта под IIS

В итоге нам нужны сайты, работающие на IIS. Мы создаем под каждый свой пул, чтобы можно было отследить нагрузку на каждый сайт. Каждый пул имеет свой процесс, поэтому в Диспетчере задач можно увидеть сколько потребляет каждый процесс. Пулы всегда ставьте Integrated с версией 4.0 для .NET Framework.

{инструкция по настройке сайта в IIS}

Регистрация сайта в домене

Когда вам нужно сделать привязку сайта к домену, первое, что вы должны сделать, это прописать в DNS настройках A запись и указать для нее IP адрес сервера. Это обычно делается там, где был зарегистрирован домен. После того как вы прописали A запись, через некоторое время сайт будет указывать на IP вашего сервера. И вам по сути только нужно добавить для сайта привязку, соединяющую IP и домен.

Внимание. Не забывайте добавлять запись домена с www, т.к. иначе он работать не будет.

Далее рассмотрим составление ТЗ.