Правильная конфигурация Nginx

Thank you for reading this post, don't forget to subscribe!

Наткнуть­ся на под­вод­ные кам­ни в кон­фи­гу­ра­ции и рабо­те веб-сер­ве­ра очень лег­ко. Но труд­но понять при­чи­ну некор­рект­ной или не все­гда корректной/ошибочной рабо­ты, если все пра­ви­ла соблюдаются.

Root внутри секции location

Нет ниче­го пло­хо­го в раз­ме­ще­нии root-дирек­то­рии внут­ри location. Но если location не соот­вет­ству­ет, то у нее не будет досту­па к кор­не­во­му ката­ло­гу. Пра­виль­нее делать так:

[codesyntax lang="php"]

[/codesyntax]

 Ука­за­ние root внут­ри сек­ции server

Несколько директив index

Не нуж­но пло­дить боль­шое коли­че­ство дирек­тив index. Про­пи­ши­те ее один раз в бло­ке http:

[codesyntax lang="php"]

[/codesyntax]

# Index будет авто­ма­ти­че­ски насле­до­вать­ся в всех секциях

Использование if

Вы же в кур­се, что if = зло? При исполь­зо­ва­нии дирек­ти­вы нуж­но быть осто­рож­ным, оши­бить­ся неслож­но. Так что по воз­мож­но­сти избе­гай­те исполь­зо­ва­ния if.

Имя сервера

Пред­по­ло­жим, ваш сайт лежит на домене somesite.com и вы пере­на­прав­ля­е­те на него поль­зо­ва­те­лей, кото­рые идут на www.somesite.com:

[codesyntax lang="php"]

[/codesyntax]

# Про­ве­ря­ет и пере­на­прав­ля­ет хост

Здесь несколь­ко про­блем. Глав­ная — if. Вне зави­си­мо­сти от запро­са хоста (с www или без), Nginx все рав­но про­ве­ря­ет if. Для каж­до­го запро­са. Вза­мен мож­но сде­лать так:

[codesyntax lang="php"]

[/codesyntax]

# Исполь­зу­ет­ся $scheme, кото­рая под­хо­дит для http и https

Проверка наличия файла

Не исполь­зуй­те if для про­вер­ки нали­чия файла:

[codesyntax lang="php"]

[/codesyntax]

# Под­ход как мини­мум не эффективен

Вза­мен у Nginx есть дирек­ти­ва try_files:

[codesyntax lang="php"]

[/codesyntax]

# Про­вер­ка после­до­ва­тель­но­сти на нали­чие фай­ла, если не суще­ству­ет, то отправ­ля­ет на index.html

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

Передача запросов на PHP

Если Nginx пере­на­прав­ля­ет все запро­сы, закан­чи­ва­ю­щи­е­ся на .php, напря­мую на интер­пре­та­тор PHP, то для зло­умыш­лен­ни­ков откры­ва­ют­ся воз­мож­но­сти для выпол­не­ния сто­рон­не­го кода. PHP по умол­ча­нию пыта­ет­ся дога­дать­ся, куда дол­жен вести непра­виль­ный запрос. Так что в первую оче­редь необ­хо­ди­мо под­пра­вить php.ini, ука­зав:

# Интер­пре­та­тор будет обра­ба­ты­вать толь­ко кор­рект­ные запросы

Обра­ти­те вни­ма­ние на пра­виль­ную кон­фи­гу­ра­цию Nginx:

[codesyntax lang="php"]

[/codesyntax]

# Пара­мет­ры мож­но комбинировать

Путь FastCGI

Непра­виль­ное ука­за­ние путей раз­ме­ще­ния скрип­тов FastCGI часть при­во­дит к ошиб­ке "Primary script unknown", кото­рая лег­ко решается.

Перезапись (rewrite)

Исполь­зуй­те пере­мен­ную $request_uri для изме­не­ния URI запроса:

# Пере­на­прав­ля­ет на стра­ни­цу 301

Отсутствующий http://

Доба­вить отсут­ству­ю­щий http:// очень просто:

# Авто­ма­ти­че­ски допол­ня­ет запрос

Проксирование

Не пере­на­прав­ляй­те все запро­сы на PHP в таком виде:

[codesyntax lang="php"]

[/codesyntax]

# Пере­да­ет все на phpcgi.socket

Исполь­зуй­те все те же дирек­ти­ву try_files:

[codesyntax lang="php"]

[/codesyntax]

# Пере­да­ет толь­ко нуж­ные запро­сы на proxy

Или так:

[codesyntax lang="php"]

[/codesyntax]

# Если Nginx не может обра­бо­тать запра­ши­ва­е­мый URI само­сто­я­тель­но, то про­ве­ря­ет дирек­то­рии на нали­чие, затем пере­да­ет на proxy