来自 Web前端 2020-04-15 19:01 的文章
当前位置: 澳门三合彩票 > Web前端 > 正文

事实上nginx的并发能力确实在同类型的网页服务器

时间: 2019-12-22阅读: 60标签: 代理起步

  1. 概述

nginx 编辑
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。Nginx是由Igor Sysoev为俄罗斯访问量第二的Rambler.ru站点开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。由俄罗斯的程序设计师Igor Sysoev所开发,供俄国大型的入口网站及搜索引擎Rambler(俄文:Рамблер)使用。其特点是占有内存少,并发能力强,事实上nginx的并发能力确实在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
外文名 Nginx 软件许可 BSD许可 软件类型 开源软件,网页服务器软件 兼容性 Linux系统,Windows NT系统 别 名 engine x
目录
1 优点
▪ 服务器
▪ 代码
▪ 代理服务器
2 功能
▪ 支持操作系统
▪ 结构与扩展
▪ 实验特性
▪ HTTP基础功能
▪ 其他HTTP功能
3 安装
▪ 模块依赖性
▪ 编译安装包
▪ 源代码下载
4 使用技巧
5 反向代理实践
6 Nginx Rewrite
7 配置
8 版本发布
优点编辑
Nginx 可以在大多数 UnixLinux OS 上编译运行,并有 Windows 移植版。 Nginx 的1.4.0稳定版已经于2013年4月24日发布,一般情况下,对于新建站点,建议使用最新稳定版作为生产版本,已有站点的升级急迫性不高。Nginx 的源代码使用 2-clause BSD-like license。
Nginx 是一个很强大的高性能Web和反向代理服务器,它具有很多非常优越的特性:
在连接高并发的情况下,Nginx是Apache服务器不错的替代品:Nginx在美国是做虚拟主机生意的老板们经常选择的软件平台之一。能够支持高达 50,000 个并发连接数的响应,感谢Nginx为我们选择了 epoll and kqueue作为开发模型。
服务器
Nginx作为负载均衡服务器:Nginx 既可以在内部直接支持 Rails 和 PHP 程序对外进行服务,也可以支持作为 HTTP代理服务器对外进行服务。Nginx采用C进行编写,不论是系统资源开销还是CPU使用效率都比 Perlbal 要好很多。
代码
Nginx代码完全用C语言从头写成,已经移植到许多体系结构和操作系统,包括:Linux、FreeBSD、Solaris、Mac OS X、AIX以及Microsoft Windows。Nginx有自己的函数库,并且除了zlib、PCRE和OpenSSL之外,标准模块只使用系统C库函数。而且,如果不需要或者考虑到潜在的授权冲突,可以不使用这些第三方库。
代理服务器
作为邮件代理服务器:Nginx 同时也是一个非常优秀的邮件代理服务器(最早开发这个产品的目的之一也是作为邮件代理服务器),Last.fm 描述了成功并且美妙的使用经验。
Nginx 是一个安装非常的简单、配置文件非常简洁(还能够支持perl语法)、Bug非常少的服务器。Nginx 启动特别容易,并且几乎可以做到7*24不间断运行,即使运行数个月也不需要重新启动。你还能够不间断服务的情况下进行软件版本的升级。
功能编辑
支持操作系统
FreeBSD 3— 10 / i386; FreeBSD 5— 10 / amd64;
Linux 2.2— 4 / i386; Linux 2.6— 4 / amd64; Linux 3— 4 / armv6l, armv7l, aarch64;
Solaris 9 / i386, sun4u; Solaris 10 / i386, amd64, sun4v;
AIX 7.1 / powerpc;
HP-UX 11.31 / ia64;
Mac OS X / ppc, i386;
Windows XP, Windows Server 2003.
结构与扩展
一个主进程和多个工作进程。工作进程是单线程的,且不需要特殊授权即可运行;
kqueue (FreeBSD 4.1+),epoll (Linux 2.6+),rt signals (Linux 2.2.19+),/dev/poll (Solaris 7 11/99+),select,以及 poll 支持;
kqueue支持的不同功能包括 EV_CLEAR,EV_DISABLE (临时禁止事件), NOTE_LOWAT,EV_EOF,有效数据的数目,错误代码;
sendfile (FreeBSD 3.1+),sendfile (Linux 2.2+),sendfile64 (Linux 2.4.21+),和 sendfilev (Solaris 8 7/01+) 支持;
输入过滤 (FreeBSD 4.1+) 以及 TCP_DEFER_ACCEPT (Linux 2.4+) 支持;
10,000 非活动的 HTTP keep-alive 连接仅需要 2.5M内存。
最小化的数据拷贝操作;
其他HTTP功能;
基于IP 和名称的虚拟主机服务;
Memcached 的 GET 接口;
支持 keep-alive 和管道连接;
灵活简单的配置;
重新配置和在线升级而无须中断客户的工作进程;
可定制的访问日志,日志写入缓存,以及快捷的日志回卷;
4xx-5xx错误代码重定向;
基于 PCRE 的 rewrite 重写模块;
基于客户端IP 地址和 HTTP 基本认证的访问控制;
PUT,DELETE,和 MKCOL 方法;
支持 FLV (Flash 视频);
带宽限制。
实验特性
内嵌的 perl;
通过 aio_read()/aio_write() 的套接字工作的实验模块,仅在 FreeBSD 下;
对线程的实验化支持,FreeBSD 4.x 的实现基于 rfork();
Nginx 主要的英语站点是 http://sysoev. ru/en/;
英语文档草稿由 Aleksandar Lazic 完成 点击。
HTTP基础功能
处理静态文件,索引文件以及自动索引;
反向代理加速(无缓存),简单的负载均衡和容错;
FastCGI,简单的负载均衡和容错;
模块化的结构。过滤器包括gzipping,byte ranges,chunked responses,以及 SSI-filter。在SSI过滤器中,到同一个 proxy 或者 FastCGI 的多个子请求并发处理;
SSL 和 TLS SNI 支持;
IMAP/POP3代理服务功能:
使用外部 HTTP 认证服务器重定向用户到 IMAP/POP3 后端;
使用外部 HTTP 认证服务器认证用户后连接重定向到内部的 SMTP 后端;
其他HTTP功能
基于名称和基于IP的虚拟服务器;
Keep-alive and pipelined connections support;保持活动和支持管线连接;
Flexible configuration;灵活的配置;
Reconfiguration and online upgrade without interruption of the client processing;重载配置,无间断程序升级;
Access log formats,bufferred log writing,and quick log rotation;访问日志格式,bufferred日志写,快速登录旋转;
3xx-5xx error codes redirection; 3xx的- 5xx错误代码重定向;
The rewrite module;重写模块;
Access control based on client IP address and HTTP Basic authentication;基于客户端IP地址访问控制和HTTP基本认证;
The PUT,DELETE,MKCOL,COPY and MOVE methods; 提交,删除,MKCOL,复制和移动方法;
FLV streaming;FLV视频流;
Speed limitation;速度限制;
Limitation of simultaneous connections or requests from one address.限制同个IP地址请求数量。
Embedded perl.嵌入式的Perl。
邮件代理服务器功能
用户重定向到IMAP/POP3后端使用外部HTTP认证服务器;
User authentication using an external HTTP authentication server and connection redirection to internal SMTP backend;用户身份验证使用外部HTTP认证服务器和连接重定向到内部的SMTP后端;
Authentication methods:验证方法:
POP3: USER/PASS,APOP,AUTH LOGIN/PLAIN/CRAM-MD5;的POP3:用户名/密码,的APOP,AUTH的LOGIN/PLAIN/CRAM-MD5;
IMAP: LOGIN,AUTH LOGIN/PLAIN/CRAM-MD5; IMAP的:登录,AUTH的LOGIN/PLAIN/CRAM-MD5;
SMTP: AUTH LOGIN/PLAIN/CRAM-MD5;的SMTP:AUTH的LOGIN/PLAIN/CRAM-MD5;
SSL support; SSL支持;
STARTTLS and STLS support. STARTTLS的和补充的支持。
认证方法
POP3: POP3 USER/PASS,APOP,AUTH LOGIN PLAIN CRAM-MD5;
IMAP: IMAP LOGIN;
SMTP: AUTH LOGIN PLAIN CRAM-MD5;
SSL 支持;
在 IMAP 和 POP3 模式下的 STARTTLS 和 STLS 支持。
安装编辑
模块依赖性
gzip模块需要 zlib 库
rewrite模块需要 pcre 库
ssl 功能需要openssl库
编译安装包
Nginx在一些Linux发行版和BSD的各个变种版本的安装包仓库中都会有,通过各个系统自带的软件包管理方法即可安装。需要注意的是,很多预先编译好的安装包都比较陈旧,大多数情况下还是推荐直接从源码编译。
源代码下载
特定平台的安装和记录
Nginx 在 Slackware 上的编译安装脚本
Nginx 在ubuntu和debian上的安装及脚本,debian针对nginx包的官方下载站点
使用源代码进行构建
Nginx 使用 Unix 下常用的 './configure && make && make install' 过程来编译安装。
configure脚本确定系统所具有一些特性,特别是 nginx 用来处理连接的方法。然后,它创建 Makefile 文件。
configure 支持下面的选项:
--prefix=<path> - Nginx安装路径。如果没有指定,默认为 /usr/local/nginx。
--sbin-path=<path> - Nginx可执行文件安装路径。只能安装时指定,如果没有指定,默认为<prefix>/sbin/nginx。
--conf-path=<path> - 在没有给定-c选项下默认的nginx.conf的路径。如果没有指定,默认为<prefix>/conf/nginx.conf。
--pid-path=<path> - 在nginx.conf中没有指定pid指令的情况下,默认的nginx.pid的路径。如果没有指定,默认为 <prefix>/logs/nginx.pid。
--lock-path=<path> - 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中没有指定group指令的情况下,默认的nginx使用的组。如果没有指定,默认为 nobody。
--builddir=DIR - 指定编译的目录
--with-rtsig_module - 启用 rtsig模块
--with-select_module --without-select_module - Whether or not to enable the select module. This module is enabled by default if a more suitable method such as kqueue,epoll,rtsig or /dev/poll is not discovered by configure.
//允许或不允许开启SELECT模式,如果 configure 没有找到更合适的模式,比如:kqueue(sun os),epoll (linux kenel 2.6+),rtsig(实时信号)或者/dev/poll(一种类似select的模式,底层实现与SELECT基本相 同,都是采用轮训方法) SELECT模式将是默认安装模式
--with-poll_module --without-poll_module - Whether or not to enable the poll module. This module is enabled by default if a more suitable method such as kqueue,epoll,rtsig or /dev/poll is not discovered by configure.
--with-http_ssl_module - Enable ngx_http_ssl_module. Enables SSL support and the ability to handle HTTPS requests. Requires OpenSSL. On Debian,this is libssl-dev.
//开启HTTP SSL模块,使NGINX可以支持HTTPS请求。这个模块需要已经安装了OPENSSL,在DEBIAN上是libssl
--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-log-path=PATH - Set path to the http access log
--http-client-body-temp-path=PATH - Set path to the http client request body temporary files
--http-proxy-temp-path=PATH - Set path to the http proxy temporary files
--http-fastcgi-temp-path=PATH - Set path to the http fastcgi temporary files
--without-http - 禁用 HTTP server
--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 - Additional parameters which will be added to the variable CFLAGS. With the use of the system library PCRE in FreeBSD,it is necessary to indicate --with-cc-opt="-I /usr/local/include". If we are using select() and it is necessary to increase the number of file descriptors,then this also can be assigned here: --with-cc-opt="-D FD_SETSIZE=2048".
--with-ld-opt=OPTIONS - Additional parameters passed to the linker. With the use of the system library PCRE in FreeBSD,it is necessary to indicate --with-ld-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 - Set additional options for PCRE building.
--with-md5=DIR - Set path to md5 library sources.
--with-md5-opt=OPTIONS - Set additional options for md5 building.
--with-md5-asm - Use md5 assembler sources.
--with-sha1=DIR - Set path to sha1 library sources.
--with-sha1-opt=OPTIONS - Set additional options for sha1 building.
--with-sha1-asm - Use sha1 assembler sources.
--with-zlib=DIR - Set path to zlib library sources.
--with-zlib-opt=OPTIONS - Set additional options for zlib building.
--with-zlib-asm=CPU - Use zlib assembler sources optimized for specified CPU,valid values are: pentium,pentiumpro
--with-openssl=DIR - Set path to OpenSSL library sources
--with-openssl-opt=OPTIONS - Set additional options for OpenSSL building
--with-debug - 启用调试日志
--add-module=PATH - Add in a third-party module found in directory PATH
在不同版本间,选项可能会有些许变化,请总是使用 ./configure --help 命令来检查一下当前的选项列表。
使用技巧编辑
对于chroot的支持是否在计划之中
在什么情况下使用Nginx比使用squid要好? 反之亦然。
大体上来说nginx主要用于反向加速代理而不是像squid那样作为常规代理服务器。Nginx的最大优势在于高负载情况下内存和CPU的低消耗。我不认为squid能给你带来比nginx更好的性能。
依照 [NginxImapProxyExample] 开始你的配置. 关于不同配置参数的具体信息,请查看 [NginxMailCoreModule] 页。
示例1: 用运行于apache上的php脚本做后端验证
示例2: 使用运行于同一个服务器的 nginx-embedded-perl模块作为 imap/pop代理和认证后端
某些功能不工作
(URL重写,代理,路径,...)
例如:如URL重写(rewrite)不工作了或者是unix的路径(/$PATH)的问题云云...
请仔细阅读 [NginxDebugging] 并且 逐行 查看错误日志。
如果你没找到错误 打起精神 试着到IRC或邮件列表里说明一下你碰到的问题。
有没有其它类似的Web服务器
Cherokee
Lighttpd (Lighty)
thttpd
关于各自的优缺点请使用自己喜欢的搜索引擎查找
让Nginx成为以postfix做为后端的SMTP代理
Nginx使用什么算法来实现负载均衡它能实现基于连接数的负载均衡吗?
Nginx使用简单的轮巡算法,所以无法做基本链接计数的负载均衡。这个可能会在将来的版本中有所改变。
我能关闭从代理服务器到后端服务器的缓存吗或者使用上传进度特性?
反向代理实践编辑
. nginx + substitutions 安装
  nginx 自带一个Substitution模块,但该模块只能写一行,所以我们改用 substitutions
  下面是安装一些预备软件
yum -y --noplugins install wget zip
yum -y --noplugins install unzip
yum -y --noplugins install gcc
yum -y --noplugins install make
yum -y --noplugins install pcre-devel
yum -y --noplugins install openssl-devel
编译软件
tar zxf nginx-1.0.8.tar.gz
cd nginx-1.0.8
./configure ./configure --add-module=path/substitutions4nginx-read-only //注意这里的path是相对应的真实路径
make
make install
配置 nginx.conf
  此时,nginx应该安装在于 /usr/local/nginx 下面
server_name servername;
location / {
subs_filter ca-pub-********** ca-pub-**********; //把google ad 的用户号 ca-pub-9805743306566114 改成你自己的,比如 ca-pub-**********
subs_filter ********** **********; //把google ad 的广告号 **********改成你自己的,比如 **********,你懂的!:D
proxy_pass 这里是填写需要代理的网址; //反向代理站。
index index.html index.htm;
}
记住subs_filter 命令的格式即可随意发挥想象力替换你想替换的广告、超链接,等等。

梯子有点慢。如果用VPS直接转发给谷歌,应该会快一些。实验结果也确实是如此,尽管我用的是同一个服务器。

大家都知道Nginx有很多功能模块,比如反向代理、缓存等,这篇文章总结下我们这些年实际环境中那些有用的Nginx规则和模块,大部分是用法的概括及介绍,具体细节在实际配置时再自行google。

基于太多人询问下面的问题:
我能为了得到上传进度而关闭代理的缓存吗
使用nginx我怎么才能给用户显示上传进度
到目前为止 (2007-Apr-26) 还没有办法关闭到后端服务器的缓存.
Nginx Rewrite编辑
1.Nginx Rewrite 基本标记(flags)复制内容到剪贴板代码:last – 基本上都用这个Flag[1] 。
break – 中止Rewrite,不在继续匹配
redirect – 返回临时重定向的HTTP状态302
permanent – 返回永久重定向的HTTP状态301

代理设置

  1. 内置语法
  1. 正则表达式匹配,其中:代码:
    CODE:
    ~ 为区分大小写匹配
    ~* 为不区分大小写匹配
    !和!*分别为区分大小写不匹配及不区分大小写不匹配
  2. 文件及目录匹配,其中:代码:
    CODE:
    -f和!-f用来判断是否存在文件
    -d和!-d用来判断是否存在目录
    -e和!-e用来判断是否存在文件或目录
    -x和!-x用来判断文件是否可执行
    4.Nginx 的一些可用的全局变量,可用做条件判断:
    代码:
    CODE:
    $args
    $content_length
    $content_type
    $document_root
    $document_uri
    $host
    $http_user_agent
    $http_cookie
    $limit_rate
    $request_body_file
    $request_method
    $remote_addr
    $remote_port
    $remote_user
    $request_filename
    $request_uri
    $query_string
    $scheme
    $server_protocol
    $server_addr
    $server_name
    $server_port
    $uri
    配置编辑
    cls
    @ECHO OFF
    SET NGINX_PATH=D:
    SET NGINX_DIR=D:nginx-1.3.6
    color 0a
    TITLE Nginx 管理程序 Power By ChenJianxiang
    GOTO MENU
    :MENU
    CLS
    ECHO.
    ECHO. * * * * Nginx 管理程序 Power By ChenJianxiang * * *
    ECHO. * *
    ECHO. * 1 启动Nginx *
    ECHO. * *
    ECHO. * 2 关闭Nginx *
    ECHO. * *
    ECHO. * 3 重启Nginx *
    ECHO. * *
    ECHO. * 4 退 出 *
    ECHO. * *
    ECHO. * * * * * * * * * * * * * * * * * * * * * * * *
    ECHO.
    ECHO.请输入选择项目的序号:
    set /p ID=
    IF "%id%"=="1" GOTO cmd1
    IF "%id%"=="2" GOTO cmd2
    IF "%id%"=="3" GOTO cmd3
    IF "%id%"=="4" EXIT
    PAUSE
    :cmd1
    ECHO.
    ECHO.启动Nginx......
    IF NOT EXIST %NGINX_DIR%nginx.exe ECHO %NGINX_DIR%nginx.exe不存在
    %NGINX_PATH%
    cd %NGINX_DIR%
    IF EXIST %NGINX_DIR%nginx.exe start %NGINX_DIR%nginx.exe
    ECHO.OK
    PAUSE
    GOTO MENU
    :cmd2
    ECHO.
    ECHO.关闭Nginx......
    taskkill /F /IM nginx.exe > nul
    ECHO.OK
    PAUSE
    GOTO MENU
    :cmd3
    ECHO.
    ECHO.关闭Nginx......
    taskkill /F /IM nginx.exe > nul
    ECHO.OK
    GOTO cmd1
    GOTO MENU
    版本发布编辑
    2012年08月22日,Nginx 1.3.5 开发版发布。
    2012年09月12日,Nginx 1.3.6 开发版发布。
    2012年12月11日,Nginx 1.2.6 稳定版发布
    2013年02月12日,Nginx 1.2.7 稳定版发布
    2013年02月19日,Nginx 1.3.13 开发版发布
    2013年04月03日,Nginx 1.2.8 稳定版发布。
    2013年04月16日,Nginx 1.3.16 开发者版本发布。
    2013年04月24日,Nginx 1.4.0 稳定版发布。
    2013年05月07日,Nginx 1.4.1 稳定版发布。
    2013年05月07日,Nginx 1.5.0 开发版本发布。
    2013年06月04日,Nginx 1.5.1 主版本发布。
    2013年07月02日,Nginx 1.5.2 开发版发布。
    2013年07月17日,Nginx 1.4.2 稳定版发布。
    2013年07月30日,Nginx 1.5.3 开发版本发布。
    2013年08月27日,Nginx 1.5.4 开发版本发布。
    2013年09月17日,Nginx 1.5.5 开发版本发布。[1-2]
    2015年10月27日,Nginx 1.9.6 主线版本发布。
    2016年02月09日,Nginx 1.9.11 开发版本发布。[3]
    2016年07月26日,Nginx1.11.3 主线版本。
    2016年10月11日,Nginx1.11.5 主线版本发布。
    2016年10月18日,Nginx1.10.2 稳定版本发布。
    2016年11月15日,Nginx1.11.6 主线版本发布。
    2016年12月13日,Nginx1.11.7主线版本发布。
    2016年12月27日,Nginx1.11.8主线版本发布。
    2017年01月24日,Nginx1.11.9主线版本已经发布。
    参考资料
  3. Nginx 常见应用技术指南(Nginx Tips) .冯馨怡的博客[引用日期2013-07-3]
  4. kangle web服务器稳定版3.2.8 .kangle[引用日期2014-08-6]
  5. nginx最新消息 .nginx官网[引用日期2016-02-24]

Nginx 需要支持 sub_module ,也就是编译时有--with-http_sub_module。我是系统安装的ng 1.12.2 ,默认就有使用该模块了,我也就不用重新编译了。

先介绍Nginx默认已支持的内置功能,靠这些基本就满足大部分的web服务需求。

http://www.raye.wang/2017/02/24/quan-mian-liao-jie-nginxdao-di-neng-zuo-shi-yao/
http://blog.jobbole.com/110400/

proxy_cache_path /tmp levels=1:2 keys_zone=cache:10m max_size=10g inactive=60m use_temp_path=off;server { listen 80; server_name yourdomain; location / { proxy_redirect off; proxy_cache cache; proxy_cache_valid 200 304 12h; proxy_cache_valid any 10m; proxy_cookie_domain google.com yourdomain; proxy_pass ; proxy_connect_timeout 20s; proxy_read_timeout 600s; proxy_send_timeout 600s; proxy_set_header Host "www.google.com"; proxy_set_header User-Agent $http_user_agent; proxy_set_header Referer ; proxy_set_header Accept-Encoding ""; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto ; proxy_set_header Accept-Language "zh-CN"; proxy_set_header Cookie "PREF=ID=047808f19f6de346:U=0f62f33dd8549d11:FF=2:LD=zh-CN:NW=1:TM=1325338577:LM=1332142444:GM=1:SG=2:S=rE0SyJh2W1IQ-Maw"; sub_filter  ; sub_filter  ; sub_filter_once off; addition_types *; }}

2.1 proxy代理

全面了解Nginx主要应用场景
24 February 2017 1:42:35 am
前言

配置项的说明:

proxy常用于两类应用场景,一类是中转,如异地科学的上网方式,另外一类是到后端服务的负载均衡方案。

本文只针对Nginx在不加载第三方模块的情况能处理哪些事情,由于第三方模块太多所以也介绍不完,当然本文本身也可能介绍的不完整,毕竟只是我个人使用过和了解到过得。所以还请见谅,同时欢迎留言交流

proxy_redirect:默认会302重定向到谷歌地址,所以要设置 off;proxy_cache:设置代理缓存,加快访问速度;proxy_pass:设置起到反向代理作用的配置;proxy_set_header:设置请求体头部,特别是 Cookie 那段,防止谷歌即时搜索,NW=1表示搜索结果新窗口打开,也比较符合国人习惯;Accept-Encoding防止谷歌返回压缩的内容,因为压缩的内容无法做域名替换;sub_filter:字符串替换。启用 Nginx 认证(可选)

用反向代理时候,需要特别注意里面的域名默认是在nginx启动时候就解析了,除非reload否则一直用的是当初解析的域名,也就是说不能动态解析。

Nginx能做什么

如果您不希望任何人都可以访问您的网站,也是为了防止域名被封啊。

但这个问题是可以通过别的模块或者用内置字典变量方式来解决。

1.反向代理

那么需要启用 Nginx 认证,仅登录成功后才可访问该网站。

resolver 114.114.114.114;server { location / { set $servers github.com; proxy_pass $servers; }}

2.负载均衡

生成密码文件:

2.1.1 中转

3.HTTP服务器(包含动静分离)

# mkdir /etc/nginx/conf/auth# htpasswd -b -c -m /etc/nginx/conf/auth/htpasswd weapon xxxxxx

针对某个域名进行中转:

4.正向代理

在ng配置中:

server {listen 172.16.10.1:80; server_name pypi.python.org; location ~ /simple { proxy_set_header Host $http_host; proxy_redirect off; proxy_pass ; }}

以上就是我了解到的Nginx在不依赖第三方模块能处理的事情,下面详细说明每种功能怎么做

auth_basic "login";auth_basic_user_file /usr/local/nginx/conf/auth/htpasswd;location / { ...}

注意如果是前后端域名不一样的话需要处理proxy_redirect的301跳转之类的显示,否则在跳转时候会跳转到proxy_pass的域名。

反向代理

这样就是登录后才能访问站点了。

另外可以直接代理所有80端口的http流量:

反向代理应该是Nginx做的最多的一件事了,什么是反向代理呢,以下是百度百科的说法:反向代理(Reverse Proxy)方式是指以代理服务器来接受internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。简单来说就是真实的服务器不能直接被外部网络访问,所以需要一台代理服务器,而代理服务器能被外部网络访问的同时又跟真实服务器在同一个网络环境,当然也可能是同一台服务器,端口不同而已。 下面贴上一段简单的实现反向代理的代码

原文

server { listen 80; server_name _; resolver 114.114.114.114; set $URL $host; location / { proxy_pass $URL; }}

server {
listen 80;
server_name localhost;
client_max_body_size 1024M;

如果是想代理的站点也不是不可能,只是需要自行处理CA证书导入即可,而且经过中转的流量对nginx是透明的,也就是有证书的时候做窃听和劫持的情况。

    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host:$server_port;
    }
}

2.1.2 负载均衡

保存配置文件后启动Nginx,这样当我们访问localhost的时候,就相当于访问localhost:8080了

这是代理的另外一个常见用法,通过upstream到多个后端,可以通过weight来调节权重或者backup关键词来指定备份用的后端,通常默认就可以 了,或者可以指定类似ip_hash这样的方式来均衡,配置很简单,先在http区域添加upstream定义:

负载均衡

upstream backend { ip_hash; server backend1.example.com weight=5; server backend2.example.com weight=5;;}

负载均衡也是Nginx常用的一个功能,负载均衡其意思就是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。简单而言就是当有2台或以上服务器时,根据规则随机的将请求分发到指定的服务器上处理,负载均衡配置一般都需要同时配置反向代理,通过反向代理跳转到负载均衡。而Nginx目前支持自带3种负载均衡策略,还有2种常用的第三方策略。

然后在server里面添加proxy_pass:

1、RR(默认)

location / { proxy_pass ; proxy_http_version 1.1; proxy_set_header Connection "";}

澳门三合彩票,每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。

做负载均衡的时候可以智能识别后端服务器状态,虽然可以智能地proxy_next_upstream到另外的后端,但还是会定期损失一些正常的“尝试性”的连接,比如过了max_fails 次尝试之后,休息fail_timeout时间,过了这个时间之后又会去尝试,这个时候可以使用第三方的upstream_check模块来在后台定期地自动探索,类似这样:

简单配置

check interval=3000 rise=2 fall=5 timeout=2000 type=http;
upstream test {
    server localhost:8080;
    server localhost:8081;
}
server {
    listen       81;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;

    location / {
        proxy_pass http://test;
        proxy_set_header Host $host:$server_port;
    }
}

这样替代用户正常的连接来进行尝试的方式进一步保障了高可用的特性。

负载均衡的核心代码为

还有就是在做前端代理的时候也是这样的方式,直接proxy_pass到后端即可,比如CDN的场景。

upstream test {
    server localhost:8080;
    server localhost:8081;
}

2.2 防盗链

这里我配置了2台服务器,当然实际上是一台,只是端口不一样而已,而8081的服务器是不存在的,也就是说访问不到,但是我们访问http://localhost 的时候,也不会有问题,会默认跳转到http://localhost:8080 具体是因为Nginx会自动判断服务器的状态,如果服务器处于不能访问(服务器挂了),就不会跳转到这台服务器,所以也避免了一台服务器挂了影响使用的情况,由于Nginx默认是RR策略,所以我们不需要其他更多的设置。

普通的防盗链是通过referer来做,比如:

2、权重

location ~* .(gif|jpg|png|bmp)$ { valid_referers none blocked *.example.com server_names ~.google. ~.baidu.; if ($invalid_referer) { return 403; }}

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如

再精细一点的就是URL加密,针对一些用户IP之类的变量生成一个加密URL通常是针对文件下载时候用到,可以通过openresty来写lua脚本或者是accesskey之类的模块来实现。

upstream test {
    server localhost:8080 weight=9;
    server localhost:8081 weight=1;
}

2.3 变量

那么10次一般只会有1次会访问到8081,而有9次会访问到8080

nginx里面支持正则匹配和变量配置,默认的变量比如remote_addr、request_filename、query_string、server_name之类的,这些组合在一起可以做很多规则,或者还有日志里面status、http_cookie等。

3、ip_hash

还有在进行多域名配置时候可以用通配符,比如:

上面的2种方式都有一个问题,那就是下一个请求来的时候请求可能分发到另外一个服务器,当我们的程序不是无状态的时候(采用了session保存数据),这时候就有一个很大的很问题了,比如把登录信息保存到了session中,那么跳转到另外一台服务器的时候就需要重新登录了,所以很多时候我们需要一个客户只访问一个服务器,那么就需要用iphash了,iphash的每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。

server_name ~^(www.)?(.+)$;root /data/web/$2;
upstream test {
    ip_hash;
    server localhost:8080;
    server localhost:8081;
}

这样就实现了自动进行域名的目录指派。

4、fair(第三方)

变量方面,比如配置变量a=1:

按后端服务器的响应时间来分配请求,响应时间短的优先分配。

set $a 1;
upstream backend { 
    fair; 
    server localhost:8080;
    server localhost:8081;
} 

下面这个案例配合if判断来做有更大的用处。

5、url_hash(第三方)

2.4 if判断

按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

nginx里面支持一些简单的if判断,但是没有多重逻辑的语法,多个判断条件用起来需要结合变量的方式来实现,比如允许ip地址为10.10.61段和和192.168.100段的用户访问,其余的拒绝,返回405状态码:

upstream backend { 
    hash $request_uri; 
    hash_method crc32; 
    server localhost:8080;
    server localhost:8081;
} 
set $err 0; if ( $remote_addr ~ 10.10.61.){ set $err 0; } if ( $remote_addr ~ 192.168.100.){ set $err 0; } if ( $err = 1){ return 405; }

以上5种负载均衡各自适用不同情况下使用,所以可以根据实际情况选择使用哪种策略模式,不过fair和url_hash需要安装第三方模块才能使用,由于本文主要介绍Nginx能做的事情,所以Nginx安装第三方模块不会再本文介绍

这样通过一个err变量比较巧妙实现了需求。

HTTP服务器

2.5 error_page

Nginx本身也是一个静态资源的服务器,当只有静态资源的时候,就可以使用Nginx来做服务器,同时现在也很流行动静分离,就可以通过Nginx来实现,首先看看Nginx做静态资源服务器

有用到后端proxy的地方需要加上这句话才可以传到状态码到nginx:

server {
    listen       80;                                                         
    server_name  localhost;                                               
    client_max_body_size 1024M;


    location / {
           root   e:wwwroot;
           index  index.html;
       }
}
fastcgi_intercept_errors on;

这样如果访问http://localhost 就会默认访问到E盘wwwroot目录下面的index.html,如果一个网站只是静态页面的话,那么就可以通过这种方式来实现部署。

本文由澳门三合彩票发布于Web前端,转载请注明出处:事实上nginx的并发能力确实在同类型的网页服务器

关键词: