Уйду немного в сторону от Mac OS X. Не знаю, заметили ли вы, но в воскресенье я переключил блог на более мощный VPS. Я давно хотел провести оптимизацию, и наконец-то это сделал.

Изначально я использовал чистый Apache, потом перешёл на чистый nginx, потом – на связку nginx как frontend и apache как backend. Но не остановился на этом и улучшил производительность за счёт применения nginx cache. Спасибо за рекомендации Денису (Juev) и Диме (Snupt). Детали я опишу в отдельной статье, указав конкретные статьи, мысли и проблемы. Теперь осталось закончить, проведя минификацию css и js – этим займусь, как только появится время.

Мой сайт работает под Ubuntu Server. В процессе настройки возникали нюансы, которые было тяжело диагностировать, не понимая, что именно происходит. И если под Mac OS X я активно для этого использую dtrace, а под FreeBSD когда-то запускал ktrace, то под Linux мне не доводилось ничего подобного делать.

Время пришло и мне помог strace.

Суть вопроса была в том, что я ставил дополнительный модуль ngx_cache_purge по рецепту, описываемом в статье “WordPress nginx proxy cache“, но при обращению к нужному URL вместо информации о выполненном действии я получал код 404. Я понятия не имел – вызвано это проблемой в конфигурации или же модуль попросту не работал. Был вариант вставлять директивы отладки в код модуля и перекомпилировать nginx, но это было трудоёмко и неоперативно.

Процесс отладки с помощью strace прост. Сначала нужно определить pid’ы интересующих процессов:

$ pidof nginx
6029 6028 6027 6026

А потом подключиться к этим процессам:

$ sudo strace -Ff -tt -p 6029 -p 6028 -p 6027 -p 6026
[pid  6027] 18:16:17.711733 <... epoll_wait resumed> {{EPOLLIN, {u32=143765384, u64=290081331106393992}}}, 512, -1) = 1
[pid  6027] 18:16:17.711817 gettimeofday({1289146577, 711843}, NULL) = 0
[pid  6027] 18:16:17.711955 accept(9, {sa_family=AF_INET, sin_port=htons(36923), sin_addr=inet_addr("94.45.55.146")}, [16]) = 13
[pid  6027] 18:16:17.712135 ioctl(13, FIONBIO, [1]) = 0
[pid  6027] 18:16:17.712271 epoll_ctl(11, EPOLL_CTL_ADD, 13, {EPOLLIN|EPOLLET, {u32=143765568, u64=13827881989708034112}}) = 0
[pid  6027] 18:16:17.712409 epoll_wait(11, {{EPOLLIN, {u32=143765568, u64=13827881989708034112}}}, 512, 60000) = 1
[pid  6027] 18:16:17.712572 gettimeofday({1289146577, 712607}, NULL) = 0
[pid  6027] 18:16:17.712758 brk(0x898c000) = 0x898c000
[pid  6027] 18:16:17.712892 recv(13, "GET /purge/archives/4638 HTTP/1."..., 131072, 0) = 613
[pid  6027] 18:16:17.713240 open("/var/lib/nginx/cache/b/22/d2587efb52d796c83c14d80388e4322b", O_RDONLY|O_NONBLOCK|O_LARGEFILE) = -1 ENOENT (No such file or directory)
[pid  6027] 18:16:17.713696 writev(13, [{"HTTP/1.1 404 Not Found\r\nServer: "..., 202}, {"b4\r\n", 4}, {"\37\213\10\0\0\0\0\0\0\3", 10}, {"\355\216\261\16\3020\fDw$\376\301t\217\2R\307\220\5\201\304\0\v_\220\326&\211\224\306(\4"..., 170}, {"\r\n0\r\n\r\n", 7}], 5) = 393
[pid  6027] 18:16:17.713926 write(5, "94.45.55.146 high-sale.ru - ["..., 243) = 243

Виден процесс работы приложения и из него я увидел, что 404 возникает из-за отсутствия в кеше /var/lib/nginx/cache файла. Т.е. модуль работает, и после изучения конфигурации я нашёл опечатку в описании ключа кеширования. Польза налицо. Рекомендую.