Быстрый старт --- Nginx

Nginx

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;
          } 
      } 
    
  • Основной синтаксис условной конструкции:

    1. : без оператора: указанная строка или переменная не пуста, а также не является строкой, начинающейся с 0, принять true
    2. = , != , например: if($request_method = POST){…}
    3. ~,~,!~,!~, например: если(uri ~* “\.jsp") {…}
    4. -f,!-f : используется для проверки существования указанного файла, например: if(-f $request_filename){…}
    5. -d,!-d : используется для проверки существования указанного каталога.
    6. -e,!-e: используется для проверки существования указанного файла, каталога или символической ссылки.
    7. -x,!-x: используется для проверки существования указанного файла и возможности его выполнения.
    8. break: выйти из блока if
    9. return: Прервать обработку и вернуть указанный код состояния http
    10. 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 для разумного и эффективного использования

  • Направление и цели оптимизации не что иное, как:

    1. : попытаться повысить эффективность обработки одной машины.
    2. Минимизируйте нагрузку на одну машину
    3. Свести к минимуму дисковый ввод-вывод
    4. Свести к минимуму сетевой ввод-вывод
    5. Свести к минимуму использование памяти
    6. Используйте ЦП максимально эффективно
  • В производственной среде модули 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, включите аппаратное ускорение.