Эта статья представляет собой исследовательскую заметку, обобщенную после просмотра видеоролика «Приступая к работе с Nginx».
1. Базовая конфигурация сервера
сервер удаленных подключений
ssh 用户名@公网ip
Имя пользователя по умолчанию — root, если общедоступный IP-адрес — a.b.c.d, имя ссылки —
ssh root@a.b.c.d
Скачайте и установите базовую библиотеку
yum -y install gcc gcc-c++ autoconf pcre pcre-devel make automake
yum -y install wget httpd-tools vim
закрыть iptables
Посмотреть правила iptables
iptables -L
或
iptables -t nat -L
отключить правила iptables
iptables -F
或
iptables -t nat -F
Выключите SELinux
Проверьте, открыт ли он
getenforce
закрытие
setenforce 0
2. Введение и установка Nginx
Nginx — это высокопроизводительное и надежное ПО промежуточного слоя HTTP и прокси-сервис с открытым исходным кодом.
Установите Nginx
Откройте официальный сайтNginx.org/En/Linux_Afraid…
To set up the yum repository for RHEL/CentOS, create the file named /etc/yum.repos.d/nginx.repo
with the following contents:
[nginx] name=nginx repo baseurl=http://nginx.org/packages/OS/OSRELEASE/$basearch/ gpgcheck=0 enabled=1
Заменять "OS
"с участием"rhel
" или "centos
", в зависимости от используемого дистрибутива, и "OSRELEASE
"с участием"6
" или "7
», для версий 6.x или 7.x соответственно.
3. Каталог установки и описание конфигурации
3.1 Объяснение каталога установки
Посмотреть все каталоги установки nginx
rpm -ql nginx
Затем получите следующую конфигурацию
[root@ ~]# rpm -ql nginx
nginx日志轮转,用于logrotate服务的日志切割
/etc/logrotate.d/nginx
nginx主配置文件
/etc/nginx/nginx.conf
/etc/nginx
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
cgi配置相关,fastcgi配置
/etc/nginx/fastcgi_params
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
编码转换映射转化文件
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/win-utf
设置http协议的 Content-Type 与扩展名对应关系
/etc/nginx/mime.types
用于配置出系统守护进程管理器管理方式
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
nginx模块目录
/etc/nginx/modules
/usr/lib64/nginx/modules
/usr/lib64/nginx
/usr/libexec/initscripts/legacy-actions/nginx
/usr/libexec/initscripts/legacy-actions/nginx/check-reload
/usr/libexec/initscripts/legacy-actions/nginx/upgrade
nginx服务的启动管理的终端命令
/usr/sbin/nginx
/usr/sbin/nginx-debug
nginx的手册和帮助文件
/usr/share/doc/nginx-1.14.0
/usr/share/doc/nginx-1.14.0/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
/usr/share/nginx
/usr/share/nginx/html
/usr/share/nginx/html/50x.html
/usr/share/nginx/html/index.html
nginx 的缓存目录
/var/cache/nginx
nginx日志目录
/var/log/nginx
3.2 Параметры установки и компиляции
Заказnginx -V
Посмотреть все параметры компиляции
3.3 Синтаксис конфигурации Nginx по умолчанию
параметр | инструкция |
---|---|
user | Установите системного пользователя службы nginx |
worker_processes | Количество рабочих процессов (обычно такое же, как количество ядер сервера) |
rror_log | журнал ошибок nginx |
pid | pid при запуске службы nginx |
events -> worker_connections | Максимальное количество подключений, разрешенных для каждого процесса |
events -> use | количество рабочих процессов |
Конфигурационный файл по умолчанию для nginx
Путь файла/etc/nginx/conf.d/default.conf
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}
можешь идти/usr/share/nginx/html/index.html
Измените страницу отображения по умолчанию, вы также можете перейти к/usr/share/nginx/html/50x.html
Измените страницу ошибки.
Перезапустите nginx после модификации
systemctl reload nginx.service
或
systemctl restart nginx.service
Проверьте конфигурацию nginx, успешный результат указывает на успех
nginx -t -c /etc/nginx/nginx.conf
перезагрузить конфигурацию
nginx -s reload -c /etc/nginx/nginx.conf
В-четвертых, распространенная промежуточная архитектура Nginx.
- Статический ресурс WEB-сервис
- Прокси-сервис
- Планировщик балансировки нагрузки SLB
- динамический кеш
4.1 Статический ресурс WEB-сервис
Синтаксис конфигурации — чтение файла
Syntax: sendfile on|off;
Default: sendfile off;
Context: http,server,location,if in location
Цитата: --with-file-aio Асинхронное чтение файлов
Синтаксис конфигурации — tcp_nopush
Syntax: tcp_nopush on|off;
Default: tcp_nopush off;
Context: http,server,location
Синтаксис конфигурации — tcp_nodelay
Syntax: tcp_nodelay on|off;
Default: tcp_nodelay on;
Context: http,server,location
Синтаксис конфигурации — сжатие
Syntax: gzip_comp_level level;
Default: gzip_comp_level 1;
Context: http,server,location
Syntax: gzip_http_version 1.0|1.1;
Default: gzip_http_version 1.1;
Context: http,server,location
Расширение модуля сжатия Nginx
预读 gzip 功能
http_gzip_static_module
应用支持 gunzip 的压缩方式
http_gunzip_module
Настройки кеша браузера
Синтаксис конфигурации - истекает
Добавить заголовки Cache-Control, Expires
Syntax:expires [modified] time;
expires epoch | max | off
Default: expires off;
Context: http, server, location, if in location
перекрестный домен
*
Указывает, что всем веб-сайтам разрешен междоменный доступ. Из соображений безопасности можно задать только обязательные URL-адреса.
location ~ .*\.(htm|html)$ {
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Methods GET,POST,PUT,DELETE,OPTIONS;
root /opt/app/code
}
На основе модуля настройки защиты от пиявок http_refer
Syntax: valid_referers none | blocked | server_names | string...;
Default: -
Context: server, location,
4.2 Прокси-сервис
Разница между прямым прокси-сервером и обратным прокси-сервером заключается в том, что объекты прокси-сервера различны.
-
Объектом прямого прокси-прокси является клиент
-
Объектом обратного прокси-сервера является сервер
синтаксис конфигурации
Syntax: proxy_pass URL
Default: -
Context: location,if in location,limit_except
URL-адреса обычно представляют собой следующие три
http://localhost:8080/uri/
https://192.168.1.1:8000/uri/
http://unix:/tmp/backend.socket:/uri/;
4.3 Балансировка нагрузки
Модуль HttpIndex
Этот модуль обеспечивает простой способ балансировки нагрузки внутренних серверов между опросом и IP-адресом клиента.
Пример конфигурации:
resolver 10.0.0.1;
upstream dynamic {
zone upstream_dynamic 64k;
hash $request_uri; #按照url的hash值来分配,同一个url分配到同一个服务器
server backend1.example.com weight=5;
server backend2.example.com:8080 fail_timeout=5s slow_start=30s;
server 192.0.2.1 max_fails=3;
server backend3.example.com resolve;
server backend4.example.com service=http resolve;
server backup1.example.com:8080 backup;
server backup2.example.com:8080 backup;
}
server {
location / {
proxy_pass http://dynamic;
health_check;
}
}
объяснение состояния
настроить | инструкция |
---|---|
down | Текущий сервер временно не участвует в балансировке нагрузки |
backup | Зарезервированный резервный сервер |
max_fails | Допустимое количество неудачных запросов |
fail_timeout | Время, в течение которого служба приостанавливается после сбоев max_fails. |
max_conns | Ограничьте максимальное количество полученных подключений |
Алгоритм планирования
настроить | инструкция |
---|---|
голосование | Распространяется на непрерывно работающие внутренние серверы один за другим в хронологическом порядке. |
взвешенная круговая система | Чем больше значение веса, тем выше присваиваемая вероятность доступа. |
ip_hash | Каждый запрос распределяется в соответствии с результатом хэширования IP-адреса доступа, поэтому доступ к внутреннему серверу осуществляется с одного и того же IP-адреса. |
url_hash | Распределяйте запросы в соответствии с результатом хеширования URL-адреса, к которому осуществляется доступ, чтобы каждый URL-адрес был направлен на один и тот же внутренний сервер. |
least_conn | Минимальное количество подключений, в зависимости от того, какая машина имеет меньшее количество подключений, будет распределена |
значение ключа хеширования | пользовательский ключ хэша |
4.4 Кэш
Классификация типов кеша: клиентский кеш, прокси-кэш, серверный кеш
proxy_cache
Syntax: proxy_cache zone | off;
Default:
proxy_cache off;
Context: http, server, location
proxy_cache_path
Syntax: proxy_cache_path path [levels=levels] [use_temp_path=on|off] keys_zone=name:size [inactive=time] [max_size=size] [manager_files=number] [manager_sleep=time] [manager_threshold=time] [loader_files=number] [loader_sleep=time] [loader_threshold=time] [purger=on|off] [purger_files=number] [purger_sleep=time] [purger_threshold=time];
Default: —
Context: http
пример
proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_zone:10m max_size=10g inactive=60m use_temp_path=off;
map $request_method $purge_method {
PURGE 1;
default 0;
}
server {
...
location / {
proxy_pass http://backend;
proxy_cache cache_zone;
proxy_cache_key $uri;
proxy_cache_purge $purge_method;
# 当分配的服务器出现50X 错误时分配另一台服务器
proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504
}
}
Пять, глубокое обучение Nginx
5.1 Динамическое и статическое разделение
upstream java_api{
server 127.0.0.1:8080;
}
server {
...
#匹配到jsp结尾的请求去请求服务器
location ~ \.jsp$ {
proxy_pass http://java_api;
index index.html index.htm;
}
#匹配到图片资源返回本地的内容
location ~ \.(jpg|png|gif)$ {
expires 1h;
gzip on;
}
}
5.2 Правила перезаписи Nginx
Роль: реализация перезаписи и перенаправления URL
используемые сцены:
-
Переход к URL-адресу, поддержка разработки и дизайна
Переход на страницу, поддержка совместимости, эффект отображения и т. д.
-
SEO-оптимизация
-
поддерживать. Фоновое обслуживание, переадресация трафика и т. д.
-
Безопасность
грамматика
Syntax: rewrite regex replacement [flag];
Default: —
Context: server, location, if
If the specified regular expression matches a request URI, URI is changed as specified in the *replacement*
string. The rewrite
директивы выполняются последовательно в порядке их появления в конфигурационном файле.Возможно прекратить дальнейшую обработку директив с помощью флагов.Если строка замены начинается с «http://
", "https://
", или "$scheme
», обработка останавливается, и перенаправление возвращается клиенту.
An optional *flag*
parameter can be one of:
-
last
Остановить обнаружение перезаписи
stops processing the current set of
ngx_http_rewrite_module
directives and starts a search for a new location matching the changed URI; -
break
Остановить обнаружение перезаписи
stops processing the current set of
ngx_http_rewrite_module
directives as with the break directive; -
redirect
Вернитесь к временной переадресации 302, в адресной строке отобразится адрес перенаправления.
возвращает временное перенаправление с кодом 302; используется, если строка замены не начинается с «
http://
", "https://
", или "$scheme
"; -
permanent
Возврат 302 постоянного перенаправления, в адресной строке будет отображаться адрес перенаправления
returns a permanent redirect with the 301 code.
The full redirect URL is formed according to the request scheme ($scheme
) and theserver_name_in_redirect and port_in_redirect directives.
Example:
server { ... rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 last; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra last; return 403; ... }
Но если эти директивы помещены внутри «/download/
расположение,last
flag should be replaced bybreak
, or otherwise nginx will make 10 cycles and return the 500 error:
location /download/ { rewrite ^(/download/.*)/media/(.*)\..*$ $1/mp3/$2.mp3 break; rewrite ^(/download/.*)/audio/(.*)\..*$ $1/mp3/$2.ra break; return 403; }
If a *replacement*
string includes the new request arguments, the previous request arguments are appended after them. If this is undesired, putting a question mark at the end of a replacement string avoids having them appended, for example:
rewrite ^/users/(.*)$ /show?user=$1? last;
Если регулярное выражение включает в себя «}
" или ";
”, все выражения должны быть заключены в одинарные или двойные кавычки.
5.3 Проверка безопасности secure_link
Указывает и позволяет проверять подлинность запрошенных ссылок и защищать ресурсы от несанкционированного доступа.
Ограничить срок действия ссылки
Syntax: secure_link expression;
Default: —
Context: http, server, location
Syntax: secure_link_md5 expression;
Default: —
Context: http, server, location
Example:
location /s/ {
secure_link $arg_md5,$arg_expires;
secure_link_md5 "$secure_link_expires$uri$remote_addr secret";
if ($secure_link = "") {
return 403;
}
if ($secure_link = "0") {
return 410;
}
...
}
5.3 модуль geoip_module
Сопоставление двоичного файла MaxMind GeoIP на основе IP-адреса, чтение информации о местоположении IP
Установить:yum install nginx-module-geoip
сцены, которые будут использоваться
- Различие между внутренними и иностранными правилами доступа HTTP
- Различать местные города и регионы, чтобы создавать правила доступа HTTP
5.4 Настройка HTTPS
server {
listen 443 ssl;
server_name www.example.com;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers HIGH:!aNULL:!MD5;
...
}
Оптимизация HTTPS-сервиса
- Активировать постоянное соединение
- установить кеш сеанса ssl
server{
listen 443;
server_name 116.62.103.228 jeson.t.imooc.io;
keepalive_timeout 100;
ssl on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
ssl_certificate www.example.com.crt;
ssl_certificate_key www.example.com.key;
index index.html index.htm;
location / {
root /opt/app/code;
}
}
5.5 Разработка Nginx и Lua
Lua — это лаконичный, легкий, расширяемый язык сценариев.
Преимущества Nginx + Lua: полное сочетание преимуществ одновременной обработки epoll Nginx и легкости Lua для реализации простых функций и сценариев с высокой степенью параллелизма.
Установить
yum install lua
Есть два способа запустить lua: командная строка и скрипт.
-
режим командной строки
在命令行输入 lua 开启命令行交互模式
-
режим сценария
написать
test.lua
файл, выполнитьlua test.lua
бегать
Примечания
-- 行注释
--[[
块注释
--]]
Шесть, общие проблемы Nginx
Приоритет нескольких server_names
Если несколько файлов настроены с одним и тем же server_name , загрузите конфигурацию файла, который читается первым, в соответствии с именем файла.
приоритет сопоставления местоположения
= 进行普通字符精确匹配,也就是完全匹配
^~ 表示普通字符匹配,使用前缀匹配
~ \~* 表示执行一个正则匹配()
После совпадения первых двух совпадений оно больше не будет совпадать, а последнее будет продолжать совпадать.Если совпадения нет, будет использоваться его совпадение. То есть первые два имеют более высокий приоритет, чем третий.
Использование try_files
Проверить наличие файлов по порядку
location / {
try_files $uri $uri/ /index.php;
}
Семь, оптимизация производительности Nginx
7.1 Дескрипторы файлов
Дескриптор файла: linux\Unix все является файлом, а дескриптор файла является индексом
Метод настройки: глобальная модификация системы, локальная модификация пользователя, локальная модификация процесса
Способ модификации:
Глобальная модификация системы и модификация пользователя
vim /etc/security/limits.conf
добавьте следующий код
# 给root用户设置
root soft nofile 10000
root hard nofile 10000
# 给所有用户全局设置
* soft nofile 10000
* hard nofile 10000
soft не является обязательным, будет напоминаться больше установленного значения, но не принудительно; hard будет принудительно
Модификация для процесса
vim /etc/nginx/nginx.conf
Добавьте следующий код
worker_rlimit_nofile 20000
7.2 Привязка ЦП
Просмотр количества процессоров на текущем сервере
cat /proc/cpuinfo | grep "physical id"|sort|uniq|wc -l
Проверьте количество ядер процессора
cat /proc/cpuinfo | grep "cpu cores"|uniq
worker_processes = количество процессоров * количество ядер процессора
Если есть 2 процессора по 8 ядер каждый, тоworker_processes
должно быть 16
Откройте файл конфигурации nginx.vim /etc/nginx/nginx.conf
worker_processes 16;
worker_cpu_affinity auto;
Затем обновите конфигурацию nginx.nginx -s reload -c /etc/nginx/nginx.conf
7.3 Общая конфигурация Nginx
user nginx;
worker_processes 1;
worker_cpu_affinity auto;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
worker_rlimit_nofile 10000;
events {
use epoll;
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
charset utf-8;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
gzip on;
gzip_disable "MSIE [1-6]\.";
gzip_http_version 1.1;
include /etc/nginx/conf.d/*.conf;
}
8. Безопасность на основе архитектуры Nginx
8.1 Распространенное злонамеренное поведение и превентивные меры
Распространенное вредоносное поведение: поведение сканера и вредоносное сканирование, кража ресурсов.
Общие профилактические меры:
Базовая функция защиты от пиявок: цель состоит в том, чтобы предотвратить легкое сканирование данных веб-сайта злоумышленниками.
secure_link_module: улучшите безопасность данных, добавьте проверку шифрования и аннулирование данных, подходит для основных важных данных.
access_module: Обеспечить контроль IP для данных в фоновом режиме и некоторых пользовательских сервисов.
8.2 Распространенные методы атаки
Вброс паролей в фоновом режиме
Угадав поле пароля, попробуйте непрерывно войти в фоновую систему, чтобы получить фоновый пароль для входа.
Предупредительные меры:
- Сложность пароля для входа в фоновом режиме
- access_module обеспечивает контроль IP для фона
- Механизм раннего предупреждения
Уязвимость при загрузке файлов
location ^~ /upload{
root /opt/app/images;
if($requst_filename ~*(.*)\.php){
return 403;
}
}
SQL-инъекция
Используйте нефильтрованный/непроверенный пользовательский ввод, чтобы заставить приложения запускать код SQL, который они не должны запускать.
Реализация межсетевого экрана Nginx + Lua:GitHub.com/love shell/вы…
Выше приведено полное содержание заметок об исследовании Nginx.
Автор организует для написания интересный проект с открытым исходным кодомcoderiver
, стремится создать полноплатформенный бутик-проект с открытым исходным кодом.
coderiver
Китайское название Hema — это платформа, на которой программисты и дизайнеры могут совместно работать над проектами. Независимо от того, являетесь ли вы разработчиком интерфейса, бэкенда или мобильного приложения, дизайнером или менеджером по продукту, вы можете публиковать проекты на платформе и сотрудничать с партнерами-единомышленниками для завершения проектов.
coderiver
Hema похожа на гостиницу программиста, но ее основная цель состоит в том, чтобы облегчить технический обмен между талантами в различных подобластях, расти вместе и сотрудничать с несколькими людьми для выполнения проектов. Никаких денежных операций не происходит.
Планируется, что это будет полноплатформенный проект с полным стеком, включая ПК-сторону (Vue, React), мобильную H5 (Vue, React), гибридную разработку ReactNative, родной Android, апплет WeChat, Angular, Node, Flutter и бэкэнд Java. , Добро пожаловать, чтобы обратить внимание.
В настоящее время создана команда по исследованиям и разработкам, состоящая из десятков человек, которая будет стремиться предоставить вам самые качественные проекты с открытым исходным кодом.
адрес проекта:GitHub.com/cache Cats/ из…
Ваша поддержка - самая большая движущая сила для меня, чтобы двигаться вперед, добро пожаловать, чтобы поставить лайк, добро пожаловать, чтобы отправить маленькие звездочки ✨ ~