1。HTTP服务器Nginx本身也是一个静态资源服务器。当只有静态资源时,可以使用Nginx作为服务端。如果一个网站只有静态页面,那么可以通过这种方式实现部署。1、首先在文档根目录Docroot(/usr/local/var/www)下创建一个html目录,然后在html里面放一个test.html;2.在nginx.conf中配置serverusermengdaystaff;http{服务器{听80;服务器名称本地主机;client_max_body_size1024M;#默认位置location/{root/usr/local/var/www/html;indexindex.htmlindex.htm;}}}3.访问测试http://localhost/指向/usr/local/var/www/index.html,index.html是安装nginx自带的htmlhttp://localhost/test.html指向/usr/local/var/www/html/test.html注意:如果访问图片出现403Forbidden错误,可能是因为nginx.conf第一行用户配置不正确,默认是#usernobody;有注释,linux下改成root用户;macos下改成user用户名组;然后重新加载配置文件或者重启再试。可以通过whoami命令查看用户名。4、命令介绍server:用于定义服务,http中可以有多个server块port省略,使用标准端口是一个正则表达式,/表示匹配任意路径,当客户端访问的路径满足这个uri时,将执行location块中的代码根:根路径,访问http://localhost/test.html时,"/test.html”会匹配“/”uri,找到root是/usr/local/var/www/html,用户访问的资源物理??地址=root+uri=/usr/local/var/www/html+/test.html=/usr/local/var/www/html/test.htmlindex:设置首页,当只访问server_name时,会跟随index命令,不走任何路径;如果访问路径中没有指定具体文件,则返回index设置的资源,如果访问http://localhost/html/默认返回index.html5和locationuri正则表达式。:匹配除换行符以外的任何字符?:重复0次或1次+:重复1次或多次*:重复0次或多次更多次\d:匹配一个数字^:匹配一个字符串的开头$:匹配一个字符串的结尾{n}:重复ntimes{n,}:重复n次或更多次[c]:匹配单个字符c[a-z]:匹配a-z中任意一个小写字母(a|b|c):属性行表示匹配任意大小写,每个case是用竖线分隔,一般用括号括起来,匹配匹配一个字符或b字符或c字符的字符串\反斜杠:用于转义特殊字符括号()之间匹配的内容,后面可以用$1引用,和$2代表前面第二个()中的内容。正则表达式中令人困惑的是特殊字符的转义。2.静态服务器静态服务器在公司中经常会遇到,通常会提供上传功能。如果其他应用需要静态资源,可以从静态服务器获取。1、在/usr/local/var/www下创建images和img目录,在每个目录下放一个test.jpg。http{服务器{听80;服务器名称本地主机;设置$doc_root/usr/local/var/www;#默认位置location/{root/usr/local/var/www/html;indexindex.htmlindex.htm;}location^~/images/{root$doc_root;}位置~*\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${root$doc_root/img;}}}自定义变量使用set命令,语法设置变量名值;引用使用变量名值;引用使用变量名;这里自定义了doc_root变量。静态服务器的位置映射一般有两种方式:使用路径,比如/images/,一般图片会放在某个图片目录下,使用后缀,比如.jpg,.png等后缀匹配方式访问http://localhost/test.jpg会映射到$doc_root/img访问http://localhost/images/test.jpg当同一个路径满足多个location时,匹配优先级高的location第一的。由于^~比~优先级高,所以会取/images/对应的location常用location路径映射路径如下:=常用字符精确匹配。即,精确匹配。^~前缀匹配。如果匹配成功,则不会匹配其他位置。~表示进行正则匹配,区分大小写~*表示进行正则匹配,不区分大小写/xxx/正则字符串路径匹配/通用匹配,任何请求都会匹配到location优先级当一个path匹配多个location时location可匹配有优先顺序,优先顺序与location值的表达式类型有关,与配置文件中的顺序无关。对于相同类型的表达式,会优先匹配较长的字符串。推荐:Java面试题大全以下是按优先级排序的说明:等号类型(=)的优先级最高。一旦找到匹配项,就不会再找到其他匹配项,搜索也会停止。^~类型表达式,不是正则表达式。一旦找到匹配项,就不会再找到其他匹配项,搜索也会停止。正则表达式类型(~~*)具有第二优先级。如果有多个位置正则表达式可以匹配,则使用最长的正则表达式。常规字符串匹配类型。按前缀匹配。/万能匹配,如果没有匹配到,则匹配到一般优先搜索问题:不同类型的位置映射决定是否继续往下搜索等号类型,^~类型:一旦匹配到,就停止搜索,没有other会匹配location有正则表达式类型(~~*),正则字符串匹配类型/xxx/:匹配后,会继续搜索其他location,直到找到优先级最高的,否则停止搜索location如果找到第一个case优先级从高到低:(location=)>(locationfullpath)>(location^~path)>(location~,~*regularorder)>(locationpartialstartingpath)>(/)location=/{#精确匹配/,hostname后面不能跟任何字符串/[配置A]}location/{#匹配所有以/开头的请求。#但如果同类型有较长的表达式,则选择较长的表达式。#如果有正则表达式匹配,则先匹配正则表达式。[configurationB]}location/documents/{#匹配所有以/documents/开头的请求,匹配后继续查找。#但如果同类型有较长的表达式,则选择较长的表达式。#如果有正则表达式匹配,则先匹配正则表达式。[configurationC]}location^~/images/{#匹配所有以/images/开头的表达式,匹配成功则停止匹配搜索,停止搜索。#因此,即使有匹配的正则表达式location,也不会使用[配置D]}location~*\.(gif|jpg|jpeg)${#匹配所有以gif结尾的请求jpgjpeg.#但以/images/开头的请求会使用配置D,D优先级更高[配置E]}location/images/{#字符匹配/images/,会继续搜索[配置F]}location=/test.htm{root/usr/local/var/www/htm;indexindex.htm;}注意:location的优先级与location配置的位置无关3.反向代理反向代理应该是Nginx使用最多的功能,反向代理(ReverseProxy)就是使用代理服务器接受互联网上的连接请求,然后将请求转发给内网服务器,并将从服务器得到的结果返回给互联网上请求连接的客户端,此时代理服务器作为反向代理服务器到外界。简单来说,真实服务器不能被外网直接访问,所以需要一个代理服务器,代理服务器可以在和真实服务器处于同一个网络环境的情况下被外网访问。当然也有可能是同一个服务器,端口不同而已。反向代理是通过proxy_pass指令实现的。启动一个端口号为8081的JavaWeb项目server{listen80;服务器名称本地主机;位置/{proxy_passhttp://localhost:8081;proxy_set_header主机$host:$server_port;#设置用户ip地址proxy_set_headerX-Forwarded-For$remote_addr;#当请求服务器找不到其他服务器时proxy_next_upstreamerrortimeoutinvalid_headerhttp_500http_502http_503;}}当我们访问localhost时,就相当于访问localhost:80814.负载均衡负载均衡也是Nginx常用的功能,负载均衡就是分配给多个运行单元执行,比如Web服务器,FTP服务器、企业关键应用服务器等关键任务服务器,共同完成工作任务。简单来说就是当有两台或两台以上服务器时,将请求按照规则随机分发到指定的服务器上进行处理。一般负载均衡配置需要同时配置反向代理,通过反向代理跳转到负载均衡。Nginx目前支持3种负载均衡策略和2种常用的第三方策略。负载均衡是通过上游指令实现的。1.RR(roundrobin:pollingdefault)每个请求按照时间顺序一个一个分配到不同的后端服务器上,也就是说第一个请求分配到第一台服务器上,第二个请求分配到第二个上服务器,如果只有两台服务器,第三个请求会继续分配给第一台服务器,循环往复,即服务器接收请求的比例为1:1。如果后台服务器宕机,可以自动清除。轮询是默认配置,不需要太多配置。同一个项目使用8081和8082端口启动项目upstreamweb_servers{serverlocalhost:8081;服务器本地主机:8082;}服务器{听80;服务器名称本地主机;#access_loglogs/host.access.logmain;位置/{proxy_passhttp://web_servers;#必须指定HeaderHostproxy_set_headerHost$host:$server_port;}}访问地址仍然可以得到响应http://localhost/api/user/login?username=zhangsan&password=111111,这种方式是轮询2.权重指定轮询概率,权重与访问比例成正比,即即,服务器接收请求的比例是各自配置的权重的比例,用于后端服务器性能参差不齐,比如服务器性能差,接收请求少,如果服务器的性能越好,它会处理更多的请求。上游测试{服务器localhost:8081权重=1;服务器本地主机:8082权重=3;serverlocalhost:8083weight=4backup;}例子是4个请求中只有一个分配给8081,其他3个分配给8082。备份是指热备份。只有当8081和8082都down了,才去80833。ip_hash的上述两种方式都有一个问题,就是下一个请求来的时候,请求可能会分发到另外一台服务器上。当我们的程序不是无状态的(session是用来保存数据的)的时候,这时候就有很大的问题了。比如登录信息保存在session中,那么在跳转到另一台服务器的时候需要重新登录是的,所以很多时候我们需要一个客户端只访问一台服务器,那么我们就需要使用iphash,每次请求的iphash是根据访问ip的hash结果分配的,这样每个访问者固定访问一个后端服务器,可以解决session问题。上游测试{ip_hash;服务器本地主机:8080;serverlocalhost:8081;}4.公平(第三方)请求根据后端服务器的响应时间分配,响应时间短的优先。这个配置是为了更快的响应用户upstreambackend{fair;服务器本地主机:8080;serverlocalhost:8081;}5.url_hash(第三方)根据访问的URL的hash结果分配请求,使每个URL指向同一个后端服务器,当后端服务器是缓存时更有效.upstream添加hash语句,server语句中不能写权重等参数,hash_method是upstream后端使用的hash算法{hash$request_uri;hash_methodcrc32;服务器本地主机:8080;serverlocalhost:8081;}以上5种负载均衡适用于不同的情况,可以根据实际情况选择使用哪种策略模式,但是fair和url_hash需要安装第三方模块才能使用。五、动静分离动静分离是让动态网站中的动态网页按照一定的规则把不变的资源和经常变化的资源区分开来。动静态资源拆分后,我们可以根据静态资源的特点进行缓存操作,是网站静态处理的核心思想。上游web_servers{服务器localhost:8081;服务器本地主机:8082;}服务器{听80;服务器名称本地主机;设置$doc_root/usr/local/var/www;位置~*\.(gif|jpg|jpeg|png|bmp|ico|swf|css|js)${root$doc_root/img;}location/{proxy_passhttp://web_servers;#必须指定HeaderHostproxy_set_headerHost$host:$server_port;}error_page500502503504/50x.html;location=/50x.html{root$doc_root;}}6.其他1.return命令返回http状态码,可选的第二个参数可以重定向URLlocation/permanently/moved/url{return301http://www.example.com/moved/here;}2.rewrite指令重写URIrequestrewrite,rewrite指令在请求处理过程中多次修改请求URI,rewrite指令有一个可选参数和两个必需参数。第一个(必需)参数是请求URI必须匹配的正则表达式。第二个参数是用于替换匹配URI的URI。可选的第三个参数是一个标志,可以停止处理进一步的重写指令或发送重定向(代码301或302)location/users/{rewrite^/users/(.*)$/show?user=$1break;}3.error_page指令使用error_page指令,您可以将NGINX配置为返回自定义页面和错误代码,替换响应中的其他错误代码,或将浏览器重定向到不同的URI。在以下示例中,error_page指令指定页面(/404.html)以返回404页面错误代码。error_page404/404.html;4、日志访问日志:需要开启gzip压缩;否则,不会生成日志文件,并启用log_format和access_log注释$http_x_forwarded_for"';access_log/usr/local/etc/nginx/logs/host.access.logmain;gzipon;5.denydirective#禁止访问某个目录位置~*\.(txt|doc)${root$doc_root;denyall;}6.内置变量nginx的配置文件中可以使用的内置变量以美元符号$开头,也有人称其为全局变量。其中,一些预定义变量的值是可以改变的。$args:#这个变量等于请求行中的参数,同$query_string$content_length:请求头中的Content-length字段。$content_type:请求标头中的Content-Type字段。$document_root:在当前请求的根指令中指定的值。$host:请求主机头字段,否则为服务器名称。$http_user_agent:客户端代理信息$http_cookie:客户端cookie信息$limit_rate:这个变量可以限制连接速率。$request_method:客户端请求的动作,通常是GET或POST。$remote_addr:客户端的IP地址。$remote_port:客户端的端口。$remote_user:已通过AuthBasicModule认证的用户名。$request_filename:当前请求的文件路径,由root或alias命令和URI请求生成。$scheme:HTTP方案(例如http、https)。$server_protocol:请求使用的协议,一般为HTTP/1.0或HTTP/1.1。$server_addr:服务器地址,这个值可以在完成系统调用后确定。$server_name:服务器名称。$server_port:请求到达服务器的端口号。$request_uri:包含请求参数的原始URI,不带主机名,例如:“/foo/bar.php?arg=baz”。$uri:当前不带请求参数的URI,$uri不包含主机名,如“/foo/bar.html”。$document_uri:与$uri相同
