Nginx установка · 9 min read · Jan 23, 2026
Сборка Nginx из исходников на Debian Squeeze
Сборка Nginx из исходников на Debian Squeeze
Версия 1.0
Автор: Michel Käser
Это руководство описывает, как вы можете собрать nginx из исходников на Debian Squeeze. Кроме того, мы включим несколько полезных сторонних модулей, таких как naxsi WAF (межсетевой экран веб-приложений), SPDY и т.д.
В конце у вас будет полностью функционирующая установка nginx.
Я не даю никаких гарантий, что это сработает для вас!
1 Требования
Чтобы следовать этому руководству, вам понадобятся следующие:
- выделенный сервер с установленным Debian Squeeze
- около 30 минут времени, чтобы внимательно прочитать
2 Предварительные заметки
В этом руководстве мы будем использовать версию разработки nginx в качестве нашей исходной базы. Пожалуйста, имейте в виду, что эти версии могут быть нестабильными и не рекомендуется запускать их на производственном сервере.
Некоторые модули, такие как SPDY, требуют версию nginx 1.3.1x или более позднюю - и, на мой взгляд, это более или менее безопасно использовать версию разработки nginx, так как нет известных уязвимостей.
3 Предварительные условия
Поскольку nginx написан на языке программирования C, нам нужно будет установить некоторые пакеты, которые помогут нам в сборке/компиляции исходного кода. Я большой поклонник менеджера пакетов apt, но вы также можете использовать aptitude и т.д.:
apt-get -y install build-essential zlib1g-dev libpcre3 libpcre3-dev libbz2-dev libssl-dev tar unzipЭто установит все необходимые пакеты, такие как gcc и make.
4 Скачивание исходников nginx
Последнюю версию nginx можно найти на следующем сайте: nginx.org/en/download.html. На момент написания это 1.3.12 - так что мы собираемся скачать:
cd /tmp
wget http://nginx.org/download/nginx-1.3.12.tar.gzи распаковать исходники:
tar -xzvf nginx-1.3.12.tar.gzМы пока не будем собирать нашу версию nginx, так как сначала мы собираемся скачать несколько сторонних модулей, которые мы включим позже.
5 Дополнительные сторонние модули
В отличие от Apache HTTPd, который поддерживает динамическую загрузку модулей (поэтому мы можем устанавливать их из репозиториев), nginx не включает такую функцию - и, судя по тому, что я читал, это не что-то, что будет в ближайшем плане.
Поэтому нам нужно заранее решить, какие модули мы хотим включить в нашу пользовательскую установку. На официальном сайте nginx есть хороший обзор/таблица, в которой перечислены самые популярные: wiki.nginx.org/3rdPartyModules.
Поскольку он не включает все доступные модули, я рекомендую вам выполнить запрос в Google, например: nginx redis module github, если вы ищете конкретный модуль - многие из них размещены на Github.
5.1 Скачивание модулей
Для этого руководства мы собираемся скачать несколько действительно отличных модулей, таких как naxsi, SPDY и несколько менее известных.
headers_more
Начнем с headers_more. Вы можете использовать его, чтобы полностью скрыть информацию о веб-сервере, например, для повышения безопасности сервера:
mkdir /tmp/nginx-modules
cd /tmp/nginx-modules
wget https://github.com/agentzh/headers-more-nginx-module/archive/v0.19.tar.gz
tar -xzvf v0.19.tar.gzЭто загрузит последнюю версию и распакует ее. Убедитесь, что вы время от времени проверяете официальный репозиторий, чтобы увидеть, есть ли новая версия (это касается всех других модулей тоже).
Cache Purge
Вам может не понадобиться этот модуль для вашей настройки. Если у вас есть nginx перед Apache, действующий как обратный прокси и кэширующий результаты proxy_pass, это может быть полезно! В противном случае пропустите его:
wget https://github.com/FRiCKLE/ngx_cache_purge/archive/2.0.tar.gz
tar -xzvf 2.0.tar.gznaxsi
Naxsi - это модуль межсетевого экрана веб-приложений с открытым исходным кодом, высокой производительностью и низким обслуживанием правил для nginx - очень похожий на mod_security по функциональности. Мы будем использовать его для защиты веб-приложений наших клиентов:
wget http://naxsi.googlecode.com/files/naxsi-core-0.49.tgz
tar -xzvf naxsi-core-0.49.tgzSPDY
SPDY - это модуль, который позволяет вашему веб-серверу использовать функции SPDY, такие как мультиплексирование потоков и сжатие заголовков, и многие люди говорят, что это новый стандарт (что, похоже, так и есть).
Обновление OpenSSL
Это требует OpenSSL 1.0.1+, чего у нас нет на нашей машине Squeeze по умолчанию. Мы будем использовать тестовый репозиторий Debian в этом руководстве, чтобы установить его. Вы также можете скомпилировать его из исходников или проверить другие репозитории.
nano /etc/apt/sources.listи вставить следующие строки:
deb http://ftp.debian.org/debian/ testing main contrib non-free
deb http://security.debian.org/ testing/updates main contrib non-freeТеперь мы должны предотвратить обновление других пакетов до тестовой версии. Мы можем сделать это, создав/редактируя файл /etc/apt/apt.conf.d/releases: ``` nano /etc/apt/apt.conf.d/releases ``` и вставить: ``` APT::Default-Release "squeeze"; ``` Внимание: Если вы ссылаетесь на стабильные репозитории с stable в вашем sources.list, вам следует заменить squeeze на stable в приведенном выше тексте. Теперь мы можем *безопасно* выполнить: ``` apt-get update apt-get -t testing install openssl ``` что обновит/установит существующую версию OpenSSL. #### Применение патча В настоящее время нет способа включить его, как другие модули, вместо этого он предоставляется в виде патча для исходного кода nginx. Официальный readme можно найти здесь: nginx.org/patches/spdy/README.txt ``` cd /tmp/nginx-1.3.12 wget http://nginx.org/patches/spdy/patch.spdy.txt patch -p1 < patch.spdy.txt ``` должно сделать всю магию для нас. ### 6 Сборка nginx До сих пор мы скачали исходники nginx, несколько дополнительных сторонних модулей для него и применили патч SPDY. Теперь пришло время собрать нашу установку nginx. Это как со всеми приложениями на C - трехступенчатый процесс. Мы пройдем через первый шаг более подробно: ``` ./configure --help ``` Это покажет вам список всех доступных параметров конфигурации для сборки, таких как какие модули могут быть отключены, включены и так далее. Мой выглядит так (сокращенный): ``` --help print this message --prefix=PATH set installation prefix --sbin-path=PATH set nginx binary pathname --conf-path=PATH set nginx.conf pathname --error-log-path=PATH set error log pathname --pid-path=PATH set nginx.pid pathname --lock-path=PATH set nginx.lock pathname --user=USER set non-privileged user for worker processes --group=GROUP set non-privileged group for worker processes --builddir=DIR set build directory --with-rtsig_module enable rtsig module --with-select_module enable select module --without-select_module disable select module --with-poll_module enable poll module --without-poll_module disable poll module --with-file-aio enable file AIO support --with-ipv6 enable IPv6 support --with-http_ssl_module enable ngx_http_ssl_module [...] --with-http_stub_status_module enable ngx_http_stub_status_module --without-http_charset_module disable ngx_http_charset_module [...] --without-http_browser_module disable ngx_http_browser_module --without-http_upstream_ip_hash_module disable ngx_http_upstream_ip_hash_module --without-http_upstream_least_conn_module disable ngx_http_upstream_least_conn_module --without-http_upstream_keepalive_module disable ngx_http_upstream_keepalive_module --with-http_perl_module enable ngx_http_perl_module --with-perl_modules_path=PATH set Perl modules path --with-perl=PATH set perl binary pathname --http-log-path=PATH set http access log pathname --http-client-body-temp-path=PATH set path to store http client request body temporary files --http-proxy-temp-path=PATH set path to store http proxy temporary files --http-fastcgi-temp-path=PATH set path to store http fastcgi temporary files --http-uwsgi-temp-path=PATH set path to store http uwsgi temporary files --http-scgi-temp-path=PATH set path to store http scgi temporary files --without-http disable HTTP server --without-http-cache disable HTTP cache --with-mail enable POP3/IMAP4/SMTP proxy module [...] --without-mail_smtp_module disable ngx_mail_smtp_module --with-google_perftools_module enable ngx_google_perftools_module --with-cpp_test_module enable ngx_cpp_test_module --add-module=PATH enable an external module --with-cc=PATH set C compiler pathname [...] --with-cpu-opt=CPU build for the specified CPU, valid values: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, sparc32, sparc64, ppc64 --without-pcre disable PCRE library usage [...] --with-pcre-jit build PCRE with JIT compilation support --with-md5=DIR set path to md5 library sources --with-md5-opt=OPTIONS set additional build options for md5 --with-md5-asm use md5 assembler sources --with-sha1=DIR set path to sha1 library sources --with-sha1-opt=OPTIONS set additional build options for sha1 --with-sha1-asm use sha1 assembler sources --with-zlib=DIR set path to zlib library sources --with-zlib-opt=OPTIONS set additional build options for zlib --with-zlib-asm=CPU use zlib assembler sources optimized for the specified CPU, valid values: pentium, pentiumpro --with-libatomic force libatomic_ops library usage --with-libatomic=DIR set path to libatomic_ops library sources --with-openssl=DIR set path to OpenSSL library sources --with-openssl-opt=OPTIONS set additional build options for OpenSSL --with-debug enable debug logging ``` Это поможет вам решить, какие модули вы хотите включить/исключить, а также что еще можно определить. Мы собираемся использовать следующую команду конфигурации: ``` ./configure \ --prefix=/usr/share/nginx \ --sbin-path=/usr/sbin/nginx \ --conf-path=/etc/nginx/nginx.conf \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/var/log/nginx/error.log \ --http-log-path=/var/log/access.log \ --user=www-data \ --group=www-data \ --without-mail_pop3_module \ --without-mail_imap_module \ --without-mail_smtp_module \ --without-http_fastcgi_module \ --without-http_uwsgi_module \ --without-http_scgi_module \ --without-http_memcached_module \ --with-ipv6 \ --with-http_ssl_module \ --with-http_spdy_module \ --with-http_stub_status_module \ --with-http_gzip_static_module \ --add-module=/tmp/nginx-modules/headers-more-nginx-module-0.19 \ --add-module=/tmp/nginx-modules/naxsi-core-0.49/naxsi_src \ --add-module=/tmp/nginx-modules/ngx_cache_purge-2.0 ``` которая исключит все, что связано с почтой и обработчиками, которые нам не нужны (вам могут понадобиться, если вы не работаете как обратный прокси!) и включит наши загруженные сторонние модули и патч SPDY. Я использовал стандартные пути Debian здесь, но не стесняйтесь изменять их. Далее мы можем скомпилировать исходники: ``` make ``` Внимание: Если это вызывает какие-либо ошибки, вам следует внимательно их прочитать, чтобы увидеть, в чем проблема и что это. Наконец, установите скомпилированные исходники: ``` make install ``` Это скопирует все файлы в правильные места. Готово! ### 7 Включение автозапуска Debian использует init-скрипты, через которые вы можете контролировать поведение службы. Я использую тот, что из официального пакета nginx - все кредиты принадлежат его поддерживающему: ``` #!/bin/sh ### BEGIN INIT INFO # Provides: nginx # Required-Start: $local_fs $remote_fs $network $syslog # Required-Stop: $local_fs $remote_fs $network $syslog # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: starts the nginx web server # Description: starts nginx using start-stop-daemon ### END INIT INFO PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin DAEMON=/usr/sbin/nginx NAME=nginx DESC=nginx # Include nginx default if available if [ -f /etc/default/nginx ]; then . /etc/default/nginx fi test -x $DAEMON || exit 0 set -e . /lib/lsb/init-functions test_nginx_config() { if $DAEMON -t $DAEMON_OPTS >/dev/null 2>&1; then return 0 else $DAEMON -t $DAEMON_OPTS return $? fi } case "$1" in start) echo -n "Starting $DESC: " test_nginx_config # Check if the ULIMIT is set in /etc/default/nginx if [ -n "$ULIMIT" ]; then # Set the ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; stop) echo -n "Stopping $DESC: " start-stop-daemon --stop --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; restart|force-reload) echo -n "Restarting $DESC: " start-stop-daemon --stop --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON || true sleep 1 test_nginx_config # Check if the ULIMIT is set in /etc/default/nginx if [ -n "$ULIMIT" ]; then # Set the ulimits ulimit $ULIMIT fi start-stop-daemon --start --quiet --pidfile \ /var/run/$NAME.pid --exec $DAEMON -- $DAEMON_OPTS || true echo "$NAME." ;; reload) echo -n "Reloading $DESC configuration: " test_nginx_config start-stop-daemon --stop --signal HUP --quiet --pidfile /var/run/$NAME.pid \ --exec $DAEMON || true echo "$NAME." ;; configtest|testconfig) echo -n "Testing $DESC configuration: " if test_nginx_config; then echo "$NAME." else exit $? fi ;; status) status_of_proc -p /var/run/$NAME.pid "$DAEMON" nginx && exit 0 || exit $? ;; *) echo "Usage: $NAME {start|stop|restart|reload|force-reload|status|configtest}" >&2 exit 1 ;; esac exit 0 ``` Не забудьтеchmod`: chmod 755 /etc/init.d/nginx Мы также можем создать файл по умолчанию в стиле Debian: nano /etc/default/nginx и вставить: # Note: You may want to look at the following page before setting the ULIMIT. # http://wiki.nginx.org/CoreModule#worker_rlimit_nofile # Set the ulimit variable if you need defaults to change. # Example: ULIMIT="-n 4096" #ULIMIT="-n 4096" Наконец, если вы хотите, чтобы nginx запускался автоматически при загрузке, вы можете выполнить: update-rc.d nginx defaults ### 8 Специальные директивы модулей Мы не будем проходить через конфигурацию nginx и файлы vhost здесь, но следующие директивы из наших модулей интересны: # SPDY module (vhost) listen 443 ssl spdy; # more_headers module (http) more_clear_headers 'Server'; # removes server information #### naxsi naxsi немного сложнее. Сначала глобальные правила конфигурации должны быть включены в http секцию конфигурационного файла nginx: nano /etc/nginx/nginx.conf и вставить: http { [...] include /etc/nginx/naxsi_core.rules; [...] } Внимание: Убедитесь, что этот файл существует. Вы можете скопировать файлы конфигурации naxsi из загруженного архива (см. Дополнительные сторонние модули). Далее вам нужно включить стандартные правила в шаблоне вашего vhost: [...] location / { include /etc/nginx/naxsi.rules; [...] } [...] и местоположение для заблокированных запросов: [...] location /blocked { return 403; #proxy_pass http://127.0.0.1:4242; # learning mode } [...] Внимание: Убедитесь, что местоположение для заблокированных запросов совпадает с тем, что в конфигурационном файле /etc/nginx/naxsi.rules: LearningMode; SecRulesEnabled; #SecRulesDisabled; DeniedUrl "/blocked"; [...] Как вы видите, naxsi имеет некоторые странные параметры, но они не странные. Вам следует обратиться к их документации, чтобы узнать, как сделать это лучше всего. Подсказка, которую я долго искал: вам нужно запустить скрипт на python и передать заблокированный запрос во время режима обучения, чтобы создать белый список для ложных срабатываний. ### 9 Ссылки / Кредиты - http://code.google.com/p/naxsi/ - http://nginx.org/ - https://www.rackster.ch/
Get new posts in your inbox
No spam. Unsubscribe anytime.