1: Введение в Nginx
-
Что такое Nginx
Nginx是一款轻量级的Web服务器,也是一款轻量级的反向代理服务器
-
что я могу сделать
Nginx能干的事情很多,这里简要罗列一些: 1:直接支持Rails和PHP的程序 2:作为HTTP反向代理服务器 3:作为负载均衡服务器 4:作为邮件代理服务器 5:帮助实现前端动静分离
-
Функции
高稳定、高性能、资源占用少、功能丰富、模块结构化、支持热部署
Второе: установка Nginx и базовое использование
1、添加源
默认情况Centos7中无Nginx的源,最近发现Nginx官网提供了Centos的源地址。因此可以如下执行命令添加源:
sudo rpm -Uvh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm
2、安装Nginx
通过yum search nginx看看是否已经添加源成功。如果成功则执行下列命令安装Nginx。
sudo yum install -y nginx
-
Исходная установка
演示环境:CentOS release 6.8 (Final) 1:需要gcc,系统自带了,没有的话,需要先安装 2:需要pcre,安装的命令示例如下: yum install pcre* 3:需要zlib,安装的命令示例如下:yum install zlib zlib-devel 4:如果需要支持ssl的话,安装OpenSSL,安装的命令示例如下: yum install openssl openssl-devel 5:上http://nginx.org/去下载源码包,然后进行解压安装,示例如下: (1)先解压源码包,然后进入到这个包里面 (2)安装命令示例如下: 第一步:./configure --prefix=/usr/common/nginx --withhttp_stub_status_module --with-http_ssl_module 如果提示确少啥,就加上相应的选项,比如缺少pcre的话,就加上 --with-pcre=/usr/common/temp/pcre-8.34 (当然我们这里是不缺东西的) 第二步:配置后就依次 make , make install
-
Параметры конфигурации установки (если этот параметр используется в начале, можно оставить значение по умолчанию только для справки)
编译参数可能会根据版本的不同进行变化,./configure--help查看编译参数列表,常见的选项如下: --prefix=<path> - 安装路径,如果没有指定,默认为/usr/local/nginx。 --sbin-path=<path>nginx可执行命令的文件,如果没有指定,默认为<prefix>/sbin/nginx --conf-path=<path> - 在没有使用-c参数指定的情况下nginx.conf的默认位置,如果没有指定,默认 为<prefix>/conf/nginx.conf。 --pid-path=<path> - nginx.pid的路径,如果没有在nginx.conf中通过“pid”指令指定,默认为 <prefix>/logs/nginx.pid。 --lock-path=<path> - nginx.lock文件路径,如果没有指定,默认为<prefix>/logs/nginx.lock。 --error-log-path=<path> - 当没有在nginx.conf中使用“error_log”指令指定时的错误日志位置, 如果没有指定,默认为<prefix>/logs/error.log。 --http-log-path=<path> - 当没有在nginx.conf中使用“access_log”指令指定时的访问日志位置, 如果没有指定,默认为<prefix>/logs/access.log. --user=<user> - 当没有在nginx.conf中使用“user”指令指定时nginx运行的用户,如果没有指定, 默认为“nobody”。 --group=<group> - 当没有在nginx.conf中使用“user”指令指定时nginx运行的组,如果没有指定, 默认为“nobody”。 --builddir=DIR - 设置构建目录。 --with-rtsig_module - 启用rtsig模块。 --with-select_module –without-select_module - 如果在configure的时候没有发现kqueue, epoll, rtsig或/dev/poll其中之一,select模块始终为启用状态。 --with-poll_module –without-poll_module - 如果在configure的时候没有发现kqueue, epoll, rtsig或/dev/poll其中之一,poll模块始终为启用状态。 --with-http_ssl_module - 启用ngx_http_ssl_module,启用SSL支持并且能够处理HTTPS请求。需要 OpenSSL,在Debian系统中,对应的包为libssl-dev。 --with-http_realip_module - 启用ngx_http_realip_module --with-http_addition_module - 启用ngx_http_addition_module --with-http_sub_module - 启用ngx_http_sub_module --with-http_dav_module - 启用ngx_http_dav_module --with-http_flv_module - 启用ngx_http_flv_module --with-http_stub_status_module - 启用”server status”(服务状态)页 --without-http_charset_module - 禁用ngx_http_charset_module --without-http_gzip_module - 禁用ngx_http_gzip_module,如果启用,需要zlib包 --without-http_ssi_module - 禁用ngx_http_ssi_module --without-http_userid_module - 禁用ngx_http_userid_module --without-http_access_module - 禁用ngx_http_access_module --without-http_auth_basic_module - 禁用ngx_http_auth_basic_module --without-http_autoindex_module - 禁用ngx_http_autoindex_module --without-http_geo_module - 禁用ngx_http_geo_module --without-http_map_module - 禁用ngx_http_map_module --without-http_referer_module - 禁用ngx_http_referer_module --without-http_rewrite_module - 禁用ngx_http_rewrite_module。如果启用,需要PCRE包。 --without-http_proxy_module - 禁用ngx_http_proxy_module --without-http_fastcgi_module - 禁用ngx_http_fastcgi_module --without-http_memcached_module - 禁用ngx_http_memcached_module --without-http_limit_zone_module - 禁用ngx_http_limit_zone_module --without-http_empty_gif_module - 禁用ngx_http_empty_gif_module --without-http_browser_module - 禁用ngx_http_browser_module --without-http_upstream_ip_hash_module - 禁用ngx_http_upstream_ip_hash_module --with-http_perl_module - 启用ngx_http_perl_module --with-perl_modules_path=PATH - 为perl模块设置路径 --with-perl=PATH - 为perl库设置路径 --http-client-body-temp-path=PATH - 为http连接的请求实体临时文件设置路径,如果没有指定,默 认为<prefix>/client_body_temp --http-proxy-temp-path=PATH - 为http代理临时文件设置路径,如果没有指定,默认为 <prefix>/proxy_temp --http-fastcgi-temp-path=PATH - 为http fastcgi临时文件设置路径,如果没有指定,默认为 <prefix>/fastcgi_temp --without-http - 禁用HTTP服务 --with-mail - 启用IMAP4/POP3/SMTP代理模块 --with-mail_ssl_module - 启用ngx_mail_ssl_module --with-cc=PATH - 设置C编译器路径 --with-cpp=PATH - 设置C预处理器路径 --with-cc-opt=OPTIONS - 变量CFLAGS中附加的参数,用于FreeBSD中的PCRE库,同样需要指定–withcc-opt=”-I /usr/local/include”,如果我们使用select()函数则需要同时增加文件描述符数量,可 以通过–with-cc-opt=”-D FD_SETSIZE=2048”指定。 --with-ld-opt=OPTIONS - 通过连接器的附加参数,用于FreeBSD中的PCRE库,同样需要指定–withld-opt=”-L /usr/local/lib”。 --with-cpu-opt=CPU - 指定编译的CPU,可用的值为: pentium, pentiumpro, pentium3, pentium4, athlon, opteron, amd64, sparc32, sparc64, ppc64 --without-pcre - 禁用PCRE库文件,同时将禁用HTTP rewrite 模块,如果要在”location”指令中使 用正则表达式,同样需要PCRE库。 --with-pcre=DIR - 设置PCRE库源文件路径。 --with-pcre-opt=OPTIONS - 在编译时为PCRE设置附加参数。 --with-md5=DIR - 设置md5库源文件路径。 --with-md5-opt=OPTIONS - 在编译时为md5设置附加参数。 --with-md5-asm - 使用md5汇编源。 --with-sha1=DIR - 设置sha1库源文件路径。 --with-sha1-opt=OPTIONS - 在编译时为sha1设置附加参数。 --with-sha1-asm - 使用sha1汇编源。 --with-zlib=DIR - 设置zlib库源文件路径。 --with-zlib-opt=OPTIONS - 在编译时为zlib设置附加参数。 --with-zlib-asm=CPU - 为指定的CPU使用zlib汇编源进行优化,可用值为: pentium, pentiumpro。 --with-openssl=DIR - 设置openssl库源文件路径。 --with-openssl-opt=OPTIONS - 在编译时为openssl设置附加参数。 --with-debug - 启用debug记录。 --add-module=PATH - 增加一个在PATH中的第三方模块。
-
основное использование
测试配置文件: 安装路径下的/nginx/sbin/nginx -t 启动: 安装路径下的/nginx/sbin/nginx 停止 安装路径下的/nginx/sbin/nginx -s stop 或者是: nginx -s quit 重启 安装路径下的/nginx/sbin/nginx -s reload 查看进程 ps -ef |grep nginx 安装过后,如果从外面访问不了,多半是被防火墙挡住了,可以关闭掉防火墙: /sbin/service iptables stop
Третий: базовая конфигурация Nginx
В том числе: В сочетании с конфигурационным файлом примера, знакомым с базовой конфигурацией Nginx
- 默认启动Nginx时,使用的配置文件是: 安装路径/conf/nginx.conf 文件
可以在启动nginx的时候,通过-c来指定要读取的配置文件
- 常见的配置文件有如下几个:
nginx.conf:应用程序的基本配置文件
mime.types:MIME类型关联的扩展文件
fastcgi.conf:与fastcgi相关的配置
proxy.conf:与proxy相关的配置
sites.conf:配置Nginx提供的网站,包括虚拟主机
请求,主要用来产生worker进程,一个worker进程用来处理一个request。
- Nginx模块分为:核心模块、事件模块、标准Http模块、可选Http模块、邮件模
块、第三方模块和补丁等
- Nginx基本模块:所谓基本模块,指的是Nginx默认的功能模块,它们提供的指
令,允许你使用定义Nginx基本功能的变量,在编译的时候不能被禁用,包括:
核心模块:基本功能和指令,如进程管理和安全
事件模块:在Nginx内配置网络使用的能力
配置模块:提供包含机制
- 常见的核心模块指令,大部分都是放置在配置文件的顶部 具体的指令,请参看nginx的官方文档,非常详细,参见:
http://nginx.org/en/docs/ngx_core_module.html
还有下面这个网站,也是非常不错的:
http://www.howtocn.org/nginx:directiveindex
- 常见的events模块指令,大部分都是放置在配置文件的顶部 具体的指令,在上面那个文档里面,命令的context为events的就是events
模块指令,只能在events里面使用n Nginx的进程结构 启动Nginx的时候,会启动一个Master进程,这个进程不处理任何客户端的
Четыре: общие инструкции для основных модулей, модулей журналов и модулей событий.
Инструкции по основному модулю, обратите внимание на:
error_log、include、pid、user、worker_cpu_affinity、worker_processes
error_log
日志有6个级别:debug|info|notice|warn|error|crit
Nginx支持将不同的虚拟主机的日志记录在不同的地方,如下示例:
http{
error_log logs/http_error.log error;
server{
server_name one;
access_log logs/one_access.log;
error_log logs/one_error.log error;
}
server{
server_name two;
access_log logs/two_access.log;
error_log logs/two_error.log error;
} }
注意:error_log off不是禁用日志,而是创建一个名为off的日志,要禁用日志,可以这么写:error_log/dev/null crit;
модуль событий
重点看看:use和worker_connections
Пятое: базовая конфигурация HTTP обратного прокси-сервера Nginx, динамическое и статическое разделение, балансировка нагрузки, модули Geo и GeoIP.
1. Базовая конфигурация
#user nobody;
#开启进程数 <=CPU数
worker_processes 1;
#错误日志保存位置
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#进程号保存文件
#pid logs/nginx.pid;
#每个进程最大连接数(最大连接=连接数x进程数)每个worker允许同时产生多少个链接,默认1024
events {
worker_connections 1024;
}
http {
#文件扩展名与文件类型映射表
include mime.types;
#默认文件类型
default_type application/octet-stream;
#日志文件输出格式 这个位置相于全局设置
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 logs/access.log main;
#打开发送文件
sendfile on;
#tcp_nopush on;
#keepalive_timeout 0;
#连接超时时间
keepalive_timeout 65;
#打开gzip压缩
#gzip on;
#设定请求缓冲
#client_header_buffer_size 1k;
#large_client_header_buffers 4 4k;
#设定负载均衡的服务器列表
#upstream myproject {
#weigth参数表示权值,权值越高被分配到的几率越大
#max_fails 当有#max_fails个请求失败,就表示后端的服务器不可用,默认为1,将其设置为0可以关闭检查
#fail_timeout 在以后的#fail_timeout时间内nginx不会再把请求发往已检查出标记为不可用的服务器
#}
#webapp
#upstream myapp {
# server 192.168.1.171:8080 weight=1 max_fails=2 fail_timeout=30s;
# server 192.168.1.172:8080 weight=1 max_fails=2 fail_timeout=30s;
#}
#配置虚拟主机,基于域名、ip和端口
server {
#监听端口
listen 80;
#监听域名
server_name localhost;
#charset koi8-r;
#nginx访问日志放在logs/host.access.log下,并且使用main格式(还可以自定义格式)
#access_log logs/host.access.log main;
#返回的相应文件地址
location / {
#设置客户端真实ip地址
#proxy_set_header X-real-ip $remote_addr;
#负载均衡反向代理
#proxy_pass http://myapp;
#返回根路径地址(相对路径:相对于/usr/local/nginx/)
root html;
#默认访问文件
index index.html index.htm;
}
#配置反向代理tomcat服务器:拦截.jsp结尾的请求转向到tomcat
#location ~ \.jsp$ {
# proxy_pass http://192.168.1.171:8080;
#}
#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 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;
#}
}
#虚拟主机配置:
server {
listen 1234;
server_name bhz.com;
location / {
#正则表达式匹配uri方式:在/usr/local/nginx/bhz.com下 建立一个test123.html 然后使用正则匹配
#location ~ test {
## 重写语法:if return (条件 = ~ ~*)
#if ($remote_addr = 192.168.1.200) {
# return 401;
#}
#if ($http_user_agent ~* firefox) {
# rewrite ^.*$ /firefox.html;
# break;
#}
root bhz.com;
index index.html;
}
#location /goods {
# rewrite "goods-(\d{1,5})\.html" /goods-ctrl.html;
# root bhz.com;
# index index.html;
#}
#配置访问日志
access_log logs/bhz.com.access.log main;
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;
# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
2. Обратный прокси
-
Nginx обычно используется в качестве обратного прокси-сервера для внутреннего сервера, поэтому он может легко достигать динамического и статического разделения и балансировки нагрузки, тем самым значительно улучшая вычислительную мощность сервера.
-
Модуль Http Proxy имеет множество функций, наиболее часто используется proxy_pass, лучше всего просмотреть их все.
-
Если вы хотите использовать proxy_cache, вам необходимо интегрировать сторонний модуль ngx_cache_purge, чтобы очистить указанный кеш URL. Эту интеграцию необходимо выполнить при установке nginx следующим образом: ./configure --add-module=../ngx_cache_purge-1.0 …
3. Динамическое и статическое разделение
- Nginx реализует разделение динамического и статического, по сути, при обратном проксировании, если это статический ресурс, то его можно прочитать прямо из пути, опубликованного Nginx, без необходимости получать его с фонового сервера.
- Но будьте осторожны: в этом случае вам нужно убедиться, что back-end и front-end программы согласованы, вы можете использовать Rsync Выполните автоматическую синхронизацию на стороне сервера или используйте распределенное общее хранилище NFS, MFS.
4. Балансировка нагрузки
- Nginx реализует простую балансировку нагрузки через восходящий модуль.
- В блоке восходящего потока определите список серверов, метод по умолчанию — опрос, если вы хотите определить то же самое
Запрос, отправленный посетителем, всегда обрабатывается одним и тем же внутренним сервером, и можно установить ip_hash, например:
upstream cctest1.com {
ip_hash
server 127.0.0.1:9080 weight=5;
server 127.0.0.1:8080 weight=5;
server 127.0.0.1:1111;
}
Обратите внимание: этот метод по-прежнему носит опросный характер, и поскольку IP-адрес клиента может постоянно меняться, например, динамически состояние ip, прокси, через стену и т.д., поэтому ip_hash не дает полной гарантии, что один и тот же клиент всегда обслуживается одним и тем же сервер для обработки.
- Дополнительные инструкции и настройки см. в модуле балансировки нагрузки http Nginx.
5. Geo напиток GeoIP модуль
Эти два модуля в основном используются для глобальной балансировки нагрузки, к которой можно получить доступ в соответствии с разными клиентскими IP-адресами. сервер, например:
http{
geo $geo{
default default;
202.103.10.1/24 A;
179.9.0.3/24 B;
}
upstream default.server{
server 192.168.0.100;
}
upstream A.server{
server 192.168.0.101;
}
upstream B.server{
server 192.168.0.102;
}
server{
listen 80;
location / {
proxy_pass http://$geo.server$request_uri;
}
}
}
Шестое: изучите функции модуля Rewrite и других модулей.
-
Модуль перезаписи: используется для перенаправления URL. Этот механизм способствует удалению злонамеренных URL-адресов, а также Выгодно для поисковой оптимизации (SEO).
-
Синтаксис, используемый Nginx, основан на библиотеке Perl Compatible Regular Expression (PCRE).Основной синтаксис выглядит следующим образом:
^ :必须以^后的实体开头 $ :必须以$前的实体结尾 . :匹配任意字符 [ ] :匹配指定字符集内的任意字符 [^ ] :匹配任何不包括在指定字符集内的任意字符串 | :匹配 | 之前或之后的实体 () :分组,组成一组用于匹配的实体,通常会有|来协助
-
Захват подвыражений, вы можете захватить любой текст, помещенный между ( ), например:
^(.*)(hello|sir)$ 字符串为“hi sir” 捕获的结果: $1=hi $2=sir 这些被捕获的数据,在后面就可以当变量一样使用了
-
внутренний запрос Внешний запрос — это URL-адрес клиента, а внутренний запрос запускается Nginx с помощью специальных инструкций. Например: error_page, index, rewrite, try_files, include и т. д.
-
Внутренние запросы делятся на два типа
1:内部重定向:URI被改变,可能会匹配到其他的Location 2:子请求:比如使用Addition模块,指令add_after_body允许你在原始的URI之 后指定一个URI,会把该URI被处理后的结果,插入到原始的URI的body中。
-
Пример внутреннего перенаправления:
server { server_name sishuok.com; location /abc/ { rewrite ^/abc/(.*)$ /bcd/$1 } location /bcd/{ internal; root pages; } }
-
Основной синтаксис условной конструкции:
- : без оператора: указанная строка или переменная не пуста, а также не является строкой, начинающейся с 0, принять true
- = , != , например: if($request_method = POST){…}
- ~,~,!~,!~, например: если(") {…}
- -f,!-f : используется для проверки существования указанного файла, например: if(-f $request_filename){…}
- -d,!-d : используется для проверки существования указанного каталога.
- -e,!-e: используется для проверки существования указанного файла, каталога или символической ссылки.
- -x,!-x: используется для проверки существования указанного файла и возможности его выполнения.
- break: выйти из блока if
- return: Прервать обработку и вернуть указанный код состояния http
- set: инициализировать или переопределить переменную
Семь: узнайте больше о конфигурации фрагментов общих функций
- Модуль Http Index, файл, доступ к которому осуществляется по умолчанию, точно так же, как проект переходит непосредственно к index.html.
- Модуль Http Referer, используемый для цепочки защиты от кражи, он используется в большинстве браузеров для кражи цепочки.
- Модуль Http Limit Zone, который можно использовать для управления количеством подключений для сеансов, например, для ограничения количества подключений на IP-адрес. количество подключений и т.д.
- Модуль Http Access для простого управления доступом
- Модуль Http Charset, (важно) charset используется для установки набора символов
- Модуль Gzip, который может читать предварительно сжатые файлы gz.
- Модуль Http Browser используется для создания некоторых переменных в соответствии с «User-agent» в заголовке запроса, чтобы Разные браузеры создают разный контент,
- Модуль Memcached, это модуль, который использует Nginx в качестве клиента Memcached и используется для подключения к Memcached. кусок.
- Модуль Http Addition, вы можете добавлять контент до или после текущего контента местоположения, пока не смотрите на него.
- Модуль Http Empty Gif, этот модуль сохраняет в памяти прозрачное изображение 1×1, которое можно быстро передать гиф,
- Модуль Http Auth Basic, основанный на базовой аутентификации Http для временной защиты виртуальных хостов или каталогов. не смотри на
- Модуль Http AutoIndex, используемый для предоставления автоматического списка каталогов, этот модуль включается только в том случае, если файл индекса по умолчанию не найден,
- модуль Http Fcgi для взаимодействия с процессами FastCGI,
- Модуль FLV Stream, поддерживает перетаскивание индикатора выполнения при воспроизведении Flv в режиме загрузки Http.
- Модуль SSL, этот модуль обеспечивает поддержку HTTPS
- почтовый модуль,
- Модулей гораздо больше. . .
Конфигурация фрагмента
-
Сервер настроен на прослушивание ip и порта
server{ listen 127.0.0.1:9080; server_name 127.0.0.1; }
-
Сервер настроен на прослушивание доменного имени и порта
server{ listen 80; server_name www.sishuok.com sishuok.com *.sishuok.com; }
-
Передать реальный IP-адрес клиента на внутренний сервер
location ~ \.(jsp|action|mvc)$ { proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://sishuok.com; }
-
В балансировке нагрузки конфигурация для реализации аварийного переключения внутреннего сервера.
location ~ \.(jsp|action|mvc)$ { proxy_next_upstream http_502 http_504 timeout; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_pass http://server_pool; }
-
Простая противоугонная цепочка
место расположения / { ... valid_referers заблокировал sishuok.com *.sishuok.com; если($invalid_referer){ переписать ^/sishuok.com; } }
-
Просто ограничьте скорость загрузки
location / { limit_rate 256K; }
-
Конфигурация с использованием proxy_cache
http{ #下面这两个path指定的路径必须在同一个分区 proxy_temp_path /cachetemp/proxy_temp_path; #设置名称为mycache,内存缓存100m,自动清除1天未使用的内容,硬盘缓存空间1g proxy_cache_path /cachetemp/proxy_cache_path levels=1:2 keys_zone=mycache:100m inactive=1d max_size=1g; server{ location ~ .*\.(gif|jpg|html|js|css)$ { proxy_cache mycache; #使用名称为mycache的缓存 #对不同的Http状态码设置不同的缓存时间 proxy_cache_valid 200 304 24h; proxy_cache_valid 301 302 10m; proxy_cache_valid any 1m; #设置缓存的key值 proxy_cache_key $host$uri$is_args$args; } } }
Восемь: предложения по оптимизации конфигурации Nginx
-
Если сил не хватает и надо переписывать Nginx под себя, то оптимизация Nginx в основном это: оптимизация Конфигурация Nginx для разумного и эффективного использования
-
Направление и цели оптимизации не что иное, как:
- : попытаться повысить эффективность обработки одной машины.
- Минимизируйте нагрузку на одну машину
- Свести к минимуму дисковый ввод-вывод
- Свести к минимуму сетевой ввод-вывод
- Свести к минимуму использование памяти
- Используйте ЦП максимально эффективно
-
В производственной среде модули Nginx должны быть свернуты, то есть открывать, какие из них используются. Сделайте это при компиляции и установке Nginx.
-
Пользователи и группы, в производственной среде лучше всего создавать пользователей и группы для Nginx и устанавливать разрешения отдельно. Это будет безопаснее. Например: пользователь nginx nginx
-
worker_processes : обычно настраивается как общее количество ядер процессора или в 2 раза, производительность будет лучше. Это может снизить стоимость переключения между процессами.
-
Вы также можете использовать worker_cpu_affinity для одновременной привязки процессора, чтобы каждый рабочий процесс имел эксклюзивный cpu для достижения полного параллелизма и повышения производительности, но это справедливо только для Linux-систем.
-
Модель событий в событиях, Linux рекомендует использовать модель epoll, FreeBSD рекомендует использовать kqueue
-
worker_rlimit_nofile: описывает максимальное количество файлов, открытых процессом nginx. Его можно настроить так, чтобы он совпадал с количеством открытых файлов в ядре Linux.
Вы можете просмотреть его с помощью ulimit -n, Значение по умолчанию для только что установленной системы — 1024, которое можно изменить в CentOS следующим образом: Добавьте в конец /etc/security/limits.conf:
* soft nofile 65535 * hard nofile 65535 * soft nproc 65535 * hard nproc 65535
-
worker_connections: максимальное количество подключений, разрешенных для каждого процесса, по умолчанию 1024, которое можно увеличить. Теоретически общее количество параллелизма является произведением worker_processes и worker_connections. Настройка worker_connections связана с размером физической памяти, поскольку максимальное количество файлов, которые может открыть система, пропорционально размеру памяти. количество файлов, которые можно открыть на машине с 1 ГБ памяти, составляет около 100 000. Таким образом, Значение worker_connections зависит от количества процессов worker_processes и максимального файла, который может открыть система. Сумма установлена правильно.
-
keepalive_timeout: установите около 65
-
client_header_buffer_size: Установите запрошенный кеш, установите значение 4 КБ, что обычно является целым числом, кратным размеру системной страницы.Вы можете проверить размер системной страницы через getconf PAGESIZE.
-
Установить кеш для открытых файлов
open_file_cache max=建议设置成和每个进程打开的最大文件数一致 inactive=60s; open_file_cache_valid 90s; open_file_cache_min_uses 2; open_file_cache_errors on;
-
Включите сжатие Gzip, насколько это возможно, gzip_comp_level обычно имеет значение 3-5, что является пустой тратой ресурсов процессора.
-
Оптимизация журнала ошибок: установите критическое значение во время работы, что может уменьшить количество операций ввода-вывода.
-
Оптимизация журнала доступа. Если вы используете другое статистическое программное обеспечение, вы можете закрыть журнал, чтобы уменьшить количество операций записи на диск, или записать в файлы памяти, чтобы повысить эффективность ввода-вывода.
-
Инструкция sendfile указывает, вызывает ли nginx функцию sendfile (режим нулевого копирования) для вывода файлов. Обычно она должна быть включена. Если это приложение с большой нагрузкой на диск, например загрузка, ее можно отключить.
-
Оптимизация размера буферов: если размер буфера слишком мал, это заставит nginx использовать временные файлы для хранения ответа, что вызовет операции чтения и записи на диск, и чем больше трафик, тем более очевидной будет проблема. client_body_buffer_size обрабатывает размер буфера тела запроса клиента. Используется для обработки количества отправлений POST данные, загрузка файлов и т. д. client_body_buffer_size должен быть достаточно большим для хранения данных POST, которые необходимо загрузить. Точно так же есть буфер данных бэкенда.
-
Настройка приоритета процесса Worker_priority: в системах Linux процессы с высоким приоритетом будут занимать больше системных ресурсов. Источник, здесь настраивается статический приоритет процесса, значение находится в диапазоне от -20 до +19, причем -20 является наивысшим уровнем. Так что это может быть Установите значение немного меньше, но не рекомендуется, чтобы оно было ниже значения для процесса ядра (обычно -5)
-
Разумно установите время кеширования браузера для статических ресурсов и старайтесь максимально использовать кеширование браузера.
-
Блокировка балансировки нагрузки accept_mutex, рекомендуется открывать, по умолчанию открыто
-
Если используется SSL и на сервере есть устройство аппаратного ускорения SSL, включите аппаратное ускорение.