TCP/IP — сетевая модель передачи данных, представленных в цифровом виде. Модель описывает способ передачи данных от источника информации к получателю. В модели предполагается прохождение информации через четыре уровня, каждый из которых описывается правилом (протоколом передачи). Наборы правил, решающих задачу по передаче данных, составляют стек протоколов передачи данных, на которых базируется Интернет. Название TCP/IP происходит из двух важнейших протоколов семейства — Transmission Control Protocol (TCP) и Internet Protocol (IP), которые первыми были разработаны и описаны в данном стандарте. Также изредка упоминается как модель DOD в связи с историческим происхождением от сети ARPANET из 1970-х годов (под управлением DARPA, Министерства обороны США).
(c) wikipedia
Как уже было сказано, для работы в сети нужна адресация. В условиях сетей TCP/IP эта адресация задумывалась исходя из следующих соображений:
Серые (локальные) - адреса:
192.168.0.0/16
172.16.0.0/12
10.0.0.0/8
100.64.0.0/10
Серые адреса могут употрябляться только в локальных сетях, и к ним невозможно достучаться из сети интернет, так как в мире существует множество локальных сетей с локальными адресами.
Вы можете посмотреть список интерфейсов и их адресов с помощью утилит ip a
и ifconfig
В IPv4 используются адреса из 4 байт, который обычно записываются в десятичной форме:
192.168.1.1
8.8.8.8
159.224.15.224
и т. д.
Для маршрутизации адреса разбиваются на группы, которые называют адресом сети. Остальная часть адреса - адрес узла в подсети.
Для просмотра и конфигурации используются настройки интерфейса и утилиты route
и ip r
.
Для этого разделения служит битовая маска, называемой маской подсети. Двоичные единицы в ней означают адрес сети, двоичные нули - часть, отвечающая за адрес узла в подсети.
При роутинге маска накладывается на тот или иной адрес. и если адрес подсети другой, то данные отправляются на интерфейс с этим адресом подсети или на маршрутизатор.
Например:
Адрес: 192.168.1.2
Маска: 255.255.255.0
Роутер: 192.168.1.1
При отправке пакета на адрес 8.8.8.8 адрес маскируется маской 255.255.255.0 с помощью операции AND (&
), в результате
чего получается адрес сети 8.8.8.0. Адрес сети не совпадает с родной сетью 192.168.1.0, а значит пакет отправляется
на маршрутизатор 192.168.1.1, который должен направить его далее в интернет.
Если же вы будете обращаться по адресу 192.168.1.*, то после применения маски к адресу адресата у вас получится тот же адрес, что и адрес вашей сети (192.168.1.0), и пакет будет направлен непосредственно адресату в этой локальной сети.
Так же маска может обозначаться с помощью длины блока единиц в маске:
192.168.0.0/16 означает
192.168.0.0 и маску 255.255.0.0
Network Address Translation - система, благодаря которой компьютеры с локальными адресами за маршрутизатором могут получать данные из сети интернет, несмотря на то, что серые адреса недоступны из глобальной сети.
Для реализации этого механизма маршрутизатор подменяет обратный адрес на свой глобальный и заводит специальную таблицу соответствия внешних и внутренних соединений. Таким образом, ответ из глобальной сети приходит на внешний адрес маршрутизатора после чего маршрутизатор обратно подменяет адрес назначения на локальный адрес.
Для настройки используется стандартный firewall iptables
.
Резольвер и его конфигурация.
DNS - глобальная распределенная база данных для хранения информации о доменных именах. Непосредственно сетевые соединения не используют эти имена, для создания соединения вначале надо провести процедуру разрешения (resolving) - преобразование имя домена в IP адрес для дальнейшей работы.
Для работы с DNS используются утилиты whois
, dig
и host
Для того, что бы на локалхосте добавить свой личный домен можно отредактировать файл /etc/hosts
После этого с текущего компьютера вы сможете ходить по вашим фейковым доменам, даже если их нет
в глобальном DNS.
По умолчанию список DNS-серверов, которые обеспечивают вас IP адресами и прочими настройками
доменов находится в файле /etc/resolv.conf
.
Двунаправленный поток данных между двумя сетевыми адресами называют сокетом. Так как одновременно может существовать несколько потоков между адресами, то кроме адресов, сокеты идентифицируются номером порта.
16битное число (0..65535), которое идентифицирует сервис на сервере (22 - ssh, 80 - HTTP, и т.д. ), или же соединение с тем или иным сервисом. Когда вы открываете вкладку в браузере, соединение имеет не только порт и адрес назначения, но и исходящий адрес и порт, на который сервер шлет ответ. Операционная система выделяет исходящие порты автоматически.
Порты 0..1023 являются привелигированными.
В POSIX системах есть понятие слушающего сокета. Это не соединение как таковое, а декларация операционной системе, что данный порт на данном интерфейсы занят под тем или иным сервисом, и при возникновении входящего соединения именно этому сервису надо отдать новое соединение. Таким образом работает подавляющее большинство сервисов типа Apache, NGINX, ProFTPd и так далее. Слушающий сокет позволяет создавать множество соединений на один и тот же адрес и порт.
При соединении с удаленным адресом и портом ОС выдает рандомный исходящий порт и подходящий интерфейс, через который инициируется соединение. В дальнейшем ответы приходят на этот адрес и порт. Пара адреса и порта может использоваться промеждуточным NAT маршрутизатором для подмены адреса и порта при исходящих и входящих пакетах.
Исторически PHP работал, используя CGI, Common Gateway Interface.
При каждом запросе веб-сервер:
$_SERVER
попадают из переменных окружения) с характеристиками запросаИменно из CGI PHP унаследовал модель работы Designed To Die.
FastCGI - современная, улучшенная версия CGI, в которой:
Однако некоторые недостатки FastCGI привели к появлению...
Улучшенный FastCGI. Этот способ в основном используется в связке с nginx
mod_php
Классика, самый обычный способ конфигурации PHP с веб-сервером Apache. Кодовая база PHP подключается как модуль веб-сервера и работает "изнутри" веб-сервера. Достоинство этого подхода в простоте настройки и скорости работы. Недостатки же вытекают из достоинств: слабая масштабируемость, зависимость от веб-сервера, меньшая безопасность, отсутствие возможности гибко конфигурировать версии PHP.
Часто используемый для обычных проектов и разработки веб-сервер. PHP обычно неплохо работает с настройками по умолчанию.
Для подключения PHP в настройках где-то (обычно в /etc/apache2/) должна быть следующая строка, или строка, подобная этой:
LoadModule php5_module modules/mod_php.so
Эти же строки добавляют связь между расширением файла и модулем php для обрабоки этих файлов:
<FilesMatch "\.(php|php[57]|phtml)$">
SetHandler application/x-httpd-php
</FilesMatch>
DirectoryIndex
указывают веб-серверу, что кроме index.html
нужно обрабатывать и index.php
:
DirectoryIndex index.php index.phtml
Работает как модуль mod_vhost_alias. Перед настройкой убедитесь что этот модуль подключен.
Обычно в дистрибутивах linux с apache домены настраиваются путем копипасты конфига домена в папке на подобие /etc/apache2/sites.d/. Возможна так же папка /etc/apache2/sites.enabled.d/ в которой хранятся симлинки на включенные сайты. Сайты из sites.d без симлинка в этой папке выключены. Enabled сайты подключаются в основной конфиг apache через директиву Include (в конце файла).
Однако есть альтернатива: Virtual mass hosting.
Этот способ отличается упрощенным созданием и удалением доменов. Работает он благодаря следующим возможностям DNS и apache2:
# get the server name from the Host: header
UseCanonicalName Off
# this log format can be split per-virtual-host based on the first field
# using the split-logfile utility.
LogFormat "%V %h %l %u %t \"%r\" %s %b" vcommon
CustomLog "logs/access_log" vcommon
# include the server name in the filenames used to satisfy requests
VirtualDocumentRoot "/www/hosts/%0/docs"
VirtualScriptAlias "/www/hosts/%0/cgi-bin"
Вместо $0 подставляется имя сервера из HTTP-заголовка. Таким образом создание нового поддомена для проекта сводится к созданию директории с именем домена.
Есть так же другие переменные, %1, %2 и так далее:
Таким образом вы можете использовать более удобные имена директорий.
Подробнее: https://httpd.apache.org/docs/2.4/vhosts/mass.html
.htaccess
Эти файлы являются способом установки локальных настроек для директории и её поддиректорий. Синтаксис в них такой же как и в других конфигах apache. Для изменения настроек PHP вы можете использовать директиву php_value
согласно синтаксису php.ini
.
mod_rewrite
Еще один модуль apache для отвязывания адреса URL от реальной файловой системы. Часто вызывает боль при попытках отладить сложные конфигурации. Для отладки можно включить логгирование, но только при конфигурировании mod_rewrite
в конфиге apache, а не в
.htaccess
.
Данную опцию надо занести в конфиг виртуального хоста, поэтому он несовместим с Mass Virtual Hosting:
LogLevel alert rewrite:trace3
Умолчательный .htaccess для перенаправления всех запросов к index.php для дальнейшего роутинга средствами MVC-фреймворка:
RewriteEngine on
# If a directory or a file exists, use the request directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
# Otherwise forward the request to index.php
RewriteRule . index.php [L]
Учтите, что для работы .htaccess вы должны разрешить изменения конфигурации для конкретной директории. Делается это с помощью следующих настроек веб-сервера в секции Directory:
AllowOverride all
Require all granted
Однако в целом Apache изначально задуман для отображения папок реальных файлов, и данные костыли выглядят чужеродно. Более органичен для таких целей NGINX и PHP-FPM.
Легковесный быстродействующий веб-сервер, популярный для высоконагруженных решений. Конфигурация скорее настраивает доменные имена и их обработчики, чем файлы и директории. В этом контексте NGINX является reverse-proxy, т. е. фасадом перед реальным веб-сервером, обрабатывающим запросы. Тем не менее NGINX без проблем раздает файлы и может сильно оптимизировать раздачу статики и загрузку файлов. На данный момент в NGINX даже есть внутренний скриптовый язык, базированный на JS.
php-fpm
Типичная конфигурация nginx+php реализуется через php-fpm. В отличие от Apache, в котором mod_php является частью процесса веб-сервера, при работе с php-fpm нужно два процесса (демона), которые обрабатывают запросы. Первый - веб-сервер, который обрабатывает входящие запросы, привязывает веб-приложение к домену, зачастую отдает статические файлы и так далее. Второй процесс - сервер приложения, к которому веб-сервер обращается для обработки запросов.
php-fpm
Файл php-fpm.conf хранит основные настройки:
user = nobody
group = nobody
listen = 127.0.0.1:9000
pm = dynamic
pm.max_children = 5
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 3
user,group
- пользователь и группа, из под которых будет запускаться сервер приложенийlisten
- адрес и порт. Обычно используется 127.0.0.1 для безопасности. Запомните эти параметры.server {
listen 164.138.30.21; //внешний IP
server_name yieldmap.helium.asmer.org.ua; //домен
root /var/www/gorobets/yieldmap.helium.asmer.org.ua; //DocumentRoot
location / { //корень сайта
try_files $uri $uri/ /index.php;
autoindex on;
}
location ~ \.php$ { //все PHP на fpm
include /etc/nginx/fastcgi.conf;
fastcgi_pass unix:/run/php-fpm.socket;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_index index.php;
}
}
параметром fastcgi_pass
указывается сокет в файловой системе (или сетевой, 127.0.0.1:9000, например)
php.ini
Это файл конфигурации собственно php. Большинство настроек можно узнать используя phpinfo()
в коде.
Учтите, что для каждого варианта запуска php скорее всего будет свой php.ini. Т. е. настройки, которые работают в консоли, вовсе не обязательно что совпадают с mod_php или php-fpm.
Важные конфигурационные параметры:
short_open_tag = Off
Опция включает или выключает короткие php-тэги <?
и ?>
max_execution_time = 30
время работы скрипта. Имеет смысл для разгрузки веб-серерва и никакого смысла для работы скриптов в консоли.
memory_limit = 128M
Лимит памяти. Может грохнуть скрипт, который ворочает большим объемом данных, например генерирует прайс в xls, или ORM по большому набору данных в БД.
error_reporting = E_ALL
Какие ошибки логгировать.
display_errors = On
Показывать ошибки в выводе или нет. Удобно видеть ошибки в перемешку с HTML при отладке, но недопустимо в продакшене.
log_errors = On
Опция полезна для записи ошибок в лог-файл на продакшене
Forbidden
и права доступаУчтите, что для работы вашего проекта, нужно что бы файлы были доступны для соответственного процесса. Например, если вы отдаете статику с помощью NGINX, а php обрабатываете через php-fpm, вы должны удостовериться, что у этих процессов доступ к статическим и PHP-файлам соответственно.
Логи - это важно и интересно. Обычно находятся в /var/log/apache*/*
, /var/log/nginx/*
, /var/log/php*/*
Для настройки отладки в PHP, нужно следующее:
Плагин под хром/ваш браузер для включения отладки
При включении отладки браузер отправляет специальную куку, и сервер переходит в режим отладки
В режиме отладки сервер пытается соединится с вашим IDE для отправки отладочной информации. Это значит что ваш компьютер с IDE должен быть в сетевой доступности
IDE получает отладочную информацию и реализует отладку по шагах, watch и всё что нужно.
Главное нигде не ошибится с номерами портов и сетевая доступность.