{{ v.name }}
{{ v.cls }}类
{{ v.price }} ¥{{ v.price }}
nginx是一个高性能的http和反向代理服务器,也是一个imap/pop3/smtp代理服务器,相较于apache,具有占有内存少、稳定性高等优势。nginx安装非常简单、配置文件简洁,但是配置的类目却不少,本文主要记录nginx的安装以及相关的配置(以下操作在centos6.764bit环境下)。
作为一个喜欢折腾的人,nginx首选当然是采用源码包安装,不过也可以选择yum、rpm来安装。mac下,用brewinstallnginx来快速安装。
为了能从源码包编译nginx,除了编译器之外,还需要提供openssl(启用ssl)以及perl(使用rewrite)、zlib压缩库等等。由于nginx的模块化特性,还可以安装第三方模块为nginx提供额外的功能,如ngx_lua、pagespeed。
第三方模块可以在github或者https://www.nginx.com/resources/wiki/modules/查找。
接下来,通过安装nginx相关依赖库、nginx以及ngx_lua来介绍如何安装nginx以及第三方模块。
source_dir=/source/pcre_dir=pcre-8.37pcre_tar=pcre-8.37.tar.gzpcre_url=http://sourceforge.net/projects/pcre/files/pcre/8.37/pcre-8.37.tar.gzzlib_dir=zlib-1.2.8zlib_tar=zlib-1.2.8.tar.gzzlib_url=http://sourceforge.net/projects/libpng/files/zlib/1.2.8/zlib-1.2.8.tar.gzopenssl_dir=openssl-1.0.2hopenssl_tar=openssl-1.0.2h.tar.gzopenssl_url=https://www.openssl.org/source/openssl-1.0.2h.tar.gzopenssl_install=/usr/local/opensslluajit_dir=luajit-2.0.4luajit_tar=luajit-2.0.4.tar.gzluajit_url=http://luajit.org/download/luajit-2.0.4.tar.gznginx_dir=nginx-1.11.1nginx_tar=nginx-1.11.1.tar.gznginx_url=http://nginx.org/download/nginx-1.11.1.tar.gznginx_install_dir=/usr/local/nginx/ngx_devel_kit=https://github.com/simpl/ngx_devel_kit/archive/v0.3.0.tar.gzngx_devel_kit_tar=v0.3.0.tar.gzngx_devel_kit_dir=ngx_devel_kit-0.3.0ngx_lua=https://github.com/openresty/lua-nginx-module/archive/v0.10.5.tar.gzngx_lua_tar=v0.10.5.tar.gzngx_lua_dir=lua-nginx-module-0.10.5exportluajit_lib=/usr/local/libexportluajit_inc=/usr/local/include/luajit-2.0mkdir-p$source_dir#更新yum源以及安装gcc、gcc-c++yumupdate-y&&yuminstall-ygccgcc-c++#安装pcrecd$source_dirwget$pcre_urltar-zxvf$pcre_tarcd$source_dir$pcre_dir./configure&&make&&makeinstall#安装zlibcd$source_dirwget$zlib_urltar-zxvf$zlib_tarcd$source_dir$zlib_dir./configuremake&&makeinstall#安装perlyuminstall-yperl#安装opensslcd$source_dirwget$openssl_urltar-zxvf$openssl_tarcd$source_dir$openssl_dir./config--prefix=$openssl_installmake&&makeinstall#安装luajitcd$source_dirwget$luajit_urltar-zxvf$luajit_tarcd$source_dir$luajit_dirmakemakeinstallcd$source_dirwget$ngx_devel_kittar-zxvf$ngx_devel_kit_tarwget$ngx_luatar-zxvf$ngx_lua_tar#安装nginxcd$source_dirwget$nginx_urltar-zxvf$nginx_tarcd$nginx_dirgroupaddwwwuseraddwww-gwww./configure--user=www--group=www--prefix=$nginx_install_dir--with-http_stub_status_module--with-http_ssl_module--with-http_v2_module--with-openssl=$source_dir$openssl_dir--add-module=$source_dir$ngx_devel_kit_dir--add-module=$source_dir$ngx_lua_dirmake&&makeinstall#解决nginx启动问题ln-s/lib64/libpcre.so.0.0.1/lib64/libpcre.so.1ln-s/usr/local/lib/libluajit-5.1.so.2-s/lib64/libluajit-5.1.so.2nginx配置起步
nginx.conf是主配置文件,由若干个部分组成,每个大括号({})表示一个部分。每一行指令都由分号结束(;),标志着一行的结束。
以下是一份简单的配置:
usernobodynobody;worker_processes2;events{useepoll;worker_connections1024;}http{includemime.types;default_typeapplication/octet-stream;access_log/dev/null;error_log/dev/null;sendfileon;keepalive_timeout65;gzipon;gzip_min_length1024;gzip_buffers48k;gzip_http_version1.0;gzip_typestext/plainapplication/javascriptapplication/x-javascripttext/cssapplication/xmltext/javascript;server{listen80;server_namelocalhost;location/{roothtml;indexindex.htmlindex.htm;}}}
从配置可以看出,nginx监听了80端口、域名为localhost、根路径为html文件夹(上面安装路径为/usr/local/nginx,所以绝对路径为/usr/local/nginx/html)、默认index文件为index.html、index.htm。
nginx测试配置文件(包含include文件),可通过以下命令来完成,但是只检查语法错误。
nginx-t-c/path/to/nginx.confinclude指令
在nginx的配置文件中,include可以出现在任何地方,以便增强配置文件的可读性,使得部分配置文件可以重新使用。
使用include包含的文件,必须确保包含的文件自身有正确的nginx语法,即配置指令和块,然后指定这些文件的路径(没有给全路径的情况下,nginx会基于它的主配置文件路径进行搜索)。如:
includemime.types;#即:/usr/local/nginx/conf/mime.types
如果路径中出现通配符,表示可配置多个文件。这种多用于包含多个虚拟主机的情况,只需要在nginx.conf中http块结束前添加如下一行配置,就可以将多个虚拟主机的配置分离出来,比较好维护。
includeserver/*.conf;
nginx将会配置server目录下符合.conf结束的配置文件。
由关键字server开始的部分被称作虚拟服务器部分,包含在http部分中,用于响应http请求。一个虚拟服务器由listen和server_name指令组合定义。
listen指令定义了一个ip地址/端口组合或者是unix套接字路径。listen还有其他的一些可选参数比如default_server、ssl、http2等等。
listenaddress[:port];listenport;listenunix:path;
server_name指令默认值为"",意味着没有server_name指令时,对于没有设置host头的请求将会匹配该server。比如说,对于ip地址访问的请求,可以直接丢弃,如下:
server{listen80;return444;#nginx对于http非标准代码会立即关闭一个链接}location指令
location指令可以用在server部分,提供来自客户端的uri或者内部重定向访问,也可以被嵌套使用。
location定义:
location[modifier]uri{...}
修饰符
多个location配置的情况下匹配顺序为(当有匹配成功时候,停止匹配,按当前匹配规则处理请求):
除了上面的location定义之外,还可以命名location:
location@name{...}
命名location仅对内部访问重定向,在进入一个location之前它会保留被请求的uri部分。命名重定向只能够在server级别定义。
location指令除了以下两点之外可以被嵌套:
如下:
location/{location^~/css{location~*/css/.*.css${}}}valid_referers指令
valid_referers指令是用来校验http请求头referer是否有效。
valid_referersnone|blocked|server_names|string...;
nginx会通过查看referer字段和valid_referers后面的referer列表进行匹配,如果匹配到了就将invalid_referer字段值设为0,否则设为1。
通过我们通过校验referer头来处理图片防盗链,如下:
location~*.(gif|jpg|png)${valid_referersnoneblockedserver_names;if($invalid_referer){return403;}}try_files指令
try_files指令可以用在server部分,不过最常见的还是用在location部分,它会按照给定的参数顺序进行尝试,第一个被匹配到的将会被使用。
它的语法如下:
try_filesfile...uri;try_filesfile...=code;
try_files指令可能会通过添加‘/’来检查目录的存在,如“$uri/”。如果没有找到文件,会进行一个内部重定向到最后一个参数,最后一个参数可以是命名location或者http状态码。
它经常被用于从一个变量去匹配一个可能的文件,然后将处理传递到一个命名location,如下:
location/{try_files$uri$uri/@mongrel;}location@mongrel{proxy_passhttp://server;}if是邪恶的
当在location块中使用if指令,在某些情况下它并不按照预期运行,一般来说避免使用if指令。
if指令的语法如下:
if(condition){...}
在location块中if指令能够保证安全的指令应该只有以下两个:
return...;rewrite...break;
在某些情况下,需要测试一个变量,那么还是需要用到if指令,如下:
if($http_user_agent~msie){rewrite^(.*)$/msie/$1break;}if($invalid_referer){return403;}
以下用一些例子说明if可能产生一些意料不到的结果:
#第二个header才会出现在响应头中location/only-one-if{set$true1;if($true){add_headerx-first1;}if($true){add_headerx-second2;}return204;}#try_files失效location/if-try-files{try_files/file@fallback;set$true1;if($true){#nothing}}nginx内置预定义变量
为了使得更加容易配置nginx,nginx提供了许多预定义的变量,当然也可以通过使用set来设置变量。你可以在if中使用预定义变量,也可以将它们传递给代理服务器。以下是一些常见的预定义变量,更多详见http://nginx.org/en/docs/varindex.html
反向代理是一个web服务器,它接受客户端的连接请求,然后将请求转发给上游服务器,并将从服务器得到的结果返回给连接的客户端。
比如说,我们用node写了一个服务,挂载在服务器的3000端口上,用户并不能直接该服务,可以采用nginx来转发,访问http://xxx.com,nginx反向代理,从http://localhost:3000获取内容。配置如下:
server{listen80;server_namexxx.com;location/{proxy_passhttp://localhost:3000;proxy_set_headerx-real-ip$remote_addr;proxy_set_headerx-forwarded-for$proxy_add_x_forwarded_for;proxy_set_headerhost$http_host;}}
代理到上游服务器的配置中,最重要的是proxy_pass指令。
以下是代理模块中的一些常用指令:
upstream指令启用一个新的配置区段,在该区段定义一组上游服务器。这些服务器可能被设置不同的权重,也可能出于对服务器进行维护,标记为down。
以下是一个简单的upstream示例:
upstreamnodejs{ip_hash;server127.0.0.1:3000;server127.0.0.1:3001down;keepalive32;}
server指令可选参数:
keepalive指令:
nginx服务器将会为每一个worker进行保持同上游服务器的连接。
负载均衡:
upstream模块能够使用3种负载均衡算法:轮询、ip哈希、最少连接数。
使用ssl对流量进行加密
nginx经常被用于终结ssl连接,比如说多说采用第三方登录的图片并不支持https,可以通过改造图片url(指向https某个目录下),然后nginx将https反向代理到http上游服务器获取图片来解决。
以下以解决多说头像不支持http问题为例,将https://wenjs.me/proxy/xxx.png转发到http://xxx.png
server配置如下:
server{listen443sslhttp2default;server_namewenjs.me;sslon;ssl_certificatexxx.crt;ssl_certificate_keyxxx.key;ssl_protocolstlsv1tlsv1.1tlsv1.2;ssl_session_cacheshared:ssl:10m;ssl_session_timeout60m;ssl_session_ticketson;ssl_staplingon;ssl_stapling_verifyon;ssl_ciphers"ecdhe-rsa-aes256-gcm-sha384:ecdhe-rsa-aes128-gcm-sha256:dhe-rsa-aes256-gcm-sha384:dhe-rsa-aes128-gcm-sha256:ecdhe-rsa-aes256-sha384:ecdhe-rsa-aes128-sha256:ecdhe-rsa-aes256-sha:ecdhe-rsa-aes128-sha:dhe-rsa-aes256-sha256:dhe-rsa-aes128-sha256:dhe-rsa-aes256-sha:dhe-rsa-aes128-sha:ecdhe-rsa-des-cbc3-sha:edh-rsa-des-cbc3-sha:aes256-gcm-sha384:aes128-gcm-sha256:aes256-sha256:aes128-sha256:aes256-sha:aes128-sha:des-cbc3-sha:high:!anull:!enull:!export:!des:!md5:!psk:!rc4";ssl_prefer_server_cipherson;#otherlocationresolver8.8.8.8;#转发到http源地址location~^/proxy/(w+.)(bdimg.com|cdncache.org|douban.com|gravatar.com|qlogo.cn|sinaimg.cn|xnimg.cn)(/.*)${valid_referersblockedserver_names;if($invalid_referer){return403;}proxy_connect_timeout10s;proxy_read_timeout10s;proxy_passhttp://$1$2$3;expiresmax;}#返回默认图片location~^/proxy/(.*)${valid_referersblockedserver_names;if($invalid_referer){return403;}rewritehttps://static.duoshuo.com/images/noavatar_default.pngpermanent;}}
下载多说的embed.js,修改头像的url,页面引用该新的embed.js即可。
avatarurl:function(e){if(e.avatar_url){e.avatar_url=e.avatar_url.replace(/^http:///,"//wenjs.me/proxy/");}returne.avatar_url||nt.data.default_avatar_url}
跨域问题
在工作中,有时候会遇到一些接口不支持跨域,这时候可以简单的添加add_headers来支持cors跨域。配置如下:
server{listen80;server_nameapi.xxx.com;add_header'access-control-allow-origin''*';add_header'access-control-allow-credentials''true';add_header'access-control-allow-methods''get,post,head';location/{proxy_passhttp://127.0.0.1:3000;proxy_set_headerx-real-ip$remote_addr;proxy_set_headerx-forwarded-for$proxy_add_x_forwarded_for;proxy_set_headerhost$http_host;}}正向代理
正向代理是一个位于客户端和原始服务器之间的代理服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器),然后代理服务器向原始服务器转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。
比如说,一个用户访问不了某网站a,但是他能访问一个代理服务器,这个代理服务器能访问a,于是用户可以先连上代理服务器,告诉它需要访问的内容,代理服务器去取回来返回给用户。
透明代理的意思是客户端根本不需要知道有代理服务器的存在,它改编你的请求头(报文),并会传送真实ip。以前在学校的时候,校园网就采用了透明代理的方式。
以上内容主要介绍了nginx的安装、配置指令以及proxy模块相关的知识,希望能对nginx有个初步的认识,在前端开发中,能够利用nginx来快速搭建一些调试环境。