Nginx教程(小白必看,看了必会,不看血亏),

Posted 云闲不收

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx教程(小白必看,看了必会,不看血亏),相关的知识,希望对你有一定的参考价值。

Notice 测试请打开浏览器禁止缓存

Notice:再使用前,请打开浏览器 F12 然后网络 然后点禁用缓存,避免nginx配置后磁盘缓存的情况。而且,请确认host没问题。
备注:你本地设置的host对服务器反向代理后的就没用了

一、介绍

概述

Nginx是lgor Sysoev为俄罗斯访问量第二的rambler.ru站点设计开发的。从2004年发布至今,凭借开源的力量,已经接近成熟与完善。

Nginx功能丰富,可作为HTTP服务器,也可作为反向代理服务器,邮件服务器。支持FastCGI、SSL、Virtual Host、URL Rewrite、Gzip等功能。并且支持很多第三方的模块扩展。

Nginx的稳定性、功能集、示例配置文件和低系统资源的消耗让他后来居上,在全球活跃的网站中有12.18%的使用比率,大约为2220万个网站。

牛逼吹的差不多啦,如果你还不过瘾,你可以百度百科或者一些书上找到这样的夸耀,比比皆是。

工作模式

分master-worker和单进程模式,单进程模式方便调试,但是不支持平滑升级等,一般只开发环境用。

安装

可参考:
https://blog.csdn.net/wzj_110/article/details/108393207
https://blog.csdn.net/wzj_110/article/details/94202452

二、Nginx功能亮点——为什么要用nginx

最明显的当然是访问ip地址得到对应资源文件,但是比如golang,也能自定义路由去访问,那么为什么要用nginx呢

2.1 性能高

跨平台、配置简单、方向代理、高并发连接:处理2-3万并发连接数,官方监测能支持5万并发,内存消耗小:开启10个nginx才占150M内存 ,nginx处理静态文件好,耗费内存少

异步非阻塞事件处理机制:运用了epoll模型,提供了一个队列,排队解决

所谓静态资源访问,就是存放在nginx的html页面,我们可以自己编写

2.2 反向代理

2.2.1先介绍正向代理

正向代理是一个位于客户端和目标服务器之间的代理服务器(中间服务器)。为了从原始服务器取得内容,客户端向代理服务器发送一个请求,并且指定目标服务器,之后代理向目标服务器转交并且将获得的内容返回给客户端。正向代理的情况下客户端必须要进行一些特别的设置才能使用。

  • 比如,用户A无法访问fa#ce#bo#ok,但是能访问服务器B,而服务器B可以访问fa@ce¥book。于是用户A访问服务器B,通过服务器B去访问fa#c#eb#ook,,服务器B收到请求后,去访问f#b,f#b把响应信息返回给服务器B,服务器B再把响应信息返回给A。这样,通过代理服务器B,就实现了翻【河蟹】墙。

  • 某用户小A,不想要某网站发现他的ip登录过,使用代理ip以后,他在互联网中的所作所为,就好像都是那个代理IP在做的,
    代理ip代替着小A,互联网中的各个server们只知道代理ip来过,不知道小A来过

  • 又比如一些网站禁止一个ip访问太频繁,但client方的小B又需要频繁获取这个网站的信息,那么"正向代理"的代理ip就起作用了,小B只需要频繁更换代理ip来伪装是很多client访问网站就行了。

  • 比如 V_P_N 游戏加速方面的原理,我们要玩网通区的 LOL,但是本机接入的是电信的宽带,玩网通区的会比较卡,这时候就利用 V_P_N 将电信网络变为网通网络,然后在玩网通区的LOL就不会卡了(注意:V_P_N 是不能增加带宽的,不要以为不卡了是因为网速提升了)。

2.2.2反向代理是什么

反向代理正好相反。对于客户端来说,反向代理就好像目标服务器。并且客户端不需要进行任何设置。客户端向反向代理发送请求,接着反向代理判断请求走向何处,并将请求转交给客户端,使得这些内容就好似他自己一样,一次客户端并不会感知到反向代理后面的服务,也因此不需要客户端做任何设置,只需要把反向代理服务器当成真正的服务器就好了。

假设用户A访问 http://www.somesite.com/something.html,但www.somesite.com上并不存在something.html页面,于是接收用户请求的该服务器就偷偷从另外一台服务器上取回来,然后返回给用户,而用户并不知道something.html页面究竟位于哪台机器上。

很多互联网公司的网站,都是做了类似的处理的,用户在网站上的操作和数据,需要在某个重点服务器上进行计算和处理,
这个重要的服务器就等同于"真正的生产车间",
所以就需要一个招待厅,一般的互联网公司都是用的Nginx服务器,
用户感觉自己的请求都是这个"招待厅-nginx服务器"处理的,但其实真正的server被隐藏起来了,
nginx是隐藏的server
这样就可以在nginx前台服务器上做些安全处理,比如"防止客户藏屎",对于一些疑似不安全的请求记录,就不转发到后台主服务器,
再比如如果有人炸掉了招待厅———"DDos"攻击导致服务器崩溃,主要生成环境没被破坏,可以快速搭建一个新的nginx服务器,nginx服务器搭建肯定比系统主环境服务器简单,
————————————————
版权声明:本文为CSDN博主「重启电脑工程师」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44404384/article/details/114675894

2.2.3反向代理的作用

反向代理的作用就比较多了,这里简单列举一下:

  • 保护和隐藏原始资源服务器

    用户A始终认为它访问的是原始服务器B而不是代理服务器Z,但实用际上反向代理服务器接受用户A的应答,从原始资源服务器B中取得用户A的需求资源,然后发送给用户A。由于防火墙的作用,只允许代理服务器Z访问原始资源服务器B。尽管在这个虚拟的环境下,防火墙和反向代理的共同作用保护了原始资源服务器B,但用户A并不知情。
  • 加密和SSL加速
  • 负载均衡

    后面会详细介绍
  • 缓存静态内容
  • 压缩
  • 减速上传
  • 安全
  • 透明代理
    比较类似正向代理的功能,差别在于客户端根本不知道代理的存在,它改编你的request,并会传送真实IP(使用场景就是公司限制网络的访问)。
    比如为了工作效率或者安全,A公司屏蔽了QQ软件的使用。A公司的员工接上了网络,但发现无法使用qq。这就是透明代理捣的鬼。公司在内网和外网的中间插入一个透明代理,这个代理会根据规则抓取请求内容,遇到qq的请求我就把这个请求给屏蔽掉,这样就完成了透明屏蔽。当然了,如果你明白原理,就可以自己搞个正向代理来绕过公司的屏蔽。
  • 解决前端跨域问题,使用Nginx转发请求。把跨域的接口写成调本域的接口,然后将这些接口转发到真正的请求地址。

2.2.4区别

用户设置上
  • 正向代理需要你主动设置代理服务器ip或者域名进行访问,由设置的服务器ip或者域名去获取访问内容并返回;
  • 反向代理不需要你做任何设置,直接访问服务器真实ip或者域名,但是服务器内部会自动根据访问内容进行跳转及内容返回,你不知道它最终访问的是哪些机器
主体上
  • 正向代理其实是客户端的代理,帮助客户端访问其无法访问的服务器资源。
  • 反向代理则是服务器的代理,帮助服务器做负载均衡,安全防护等。
可见性上
  • 正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见
  • 而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见

正向代理伪造client,反向代理伪造server

用途上
  • 正向代理:正向代理用途是为了在防火墙内的局域网提供访问internet的途径。另外还可以使用缓冲特性减少网络使用率
  • 反向代理:反向代理的用途是将防火墙后面的服务器提供给internet用户访问。同时还可以完成诸如负载均衡等功能
安全性:
  • 正向代理:正向代理允许客户端通过它访问任意网站并且隐蔽客户端自身,因此你必须采取安全措施来确保仅为经过授权的客户端提供服务
  • 反向代理:对外是透明的,访问者并不知道自己访问的是代理。对访问者而言,他以为访问的就是原始服务器

正向代理和反向代理的区别
https://blog.51cto.com/u_14097531/4952784
从上面的描述也能看得出来正向代理和反向代理最关键的两点区别:

  • 是否指定目标服务器
  • 客户端是否要做设置

2.2.4 php fastcgi就应用了nginx的反向代理

比如你访问我的网站 https://xiaogd.net, 然后你看下主页的请求里的服务器信息, 它告诉你响应这个主页请求的是一台 Nginx server, 如下图所示:

问题是 Nginx 是最终生成这个网页的 server 吗? 其实不是的! 如果你了解 Nginx, 就会知道它通常只是一个静态资源服务器, 而我的网站主页是一个动态生成的内容, 其实你要是认真看过我网站底部的一个声明, 如下图所示:

就会明白这个主页其实是 php 的一个叫 wordpress 的建站应用去生成的. 在我的云主机的内部, Nginx 其实是将主页的请求转发给一个所谓的 php-fpm 网关
这个 php-fpm 网关基本可以看作是个 php 的 web 服务器, 不过严格来说它用的协议不是 http, 而是一种内部简化的 fastcgi 协议.
如果你要较真的话, 这可以算是 反向代理 模式, 但整体不全是 http 反向代理, 但对外而言则确实是.

这是内部配置的一个情况:

location ~ .php$ 
    root           /ftp/wwwroot;
    fastcgi_pass   127.0.0.1:9000;
    fastcgi_index  index.php;
    fastcgi_param  SCRIPT_FILENAME  $document_root/$fastcgi_script_name;
    include        fastcgi_params;

请求被转发到内部一个在 9000 端口上监听的 php 应用服务器.

从外部浏览器的角度看, 请求直接发给了 Nginx server, 响应也从 Nginx server 里回来了, 中间没有任何的(正向)代理. 至于说你内部请求又被怎么转发了, 显然浏览器是无从知道也不需要去知道的.

站在整个体系设计者的角度去看, 当然但很多请求 Nginx 其实是没有能力去响应的, 它只不过在内部把它代理给了另一个内部的 php 应用服务器, 内部的 php 应用服务器才是最终的响应生成者.

在整个体系里面, Nginx 的角色就是一个"反向代理"服务器, 浏览器被代理了, 但它无从知道自己是否被代理了, 这一切对它而言是透明的, 反正它自己是没有主动走(正向)代理的.

当然了, 你现在知道了我内部的配置, 如果直接访问 http://xiaogd.net:9000, 那就是真正的"直接访问"了, 那就绕过了 Nginx.

#不过需要说明的一点是, 直接访问是访问不通的, 因为 9000 端口并没有对外放开. 
#但是在内部是可以访问到的, 比如这样尝试用 wget 去访问:
wget localhost:9000

这样就是真正的"直接访问"了, 没有任何的代理, 既没有正向代理, 也没有反向代理.
需要说明的一点是, 用 wget 这样去获取响应还是会报错, 因为 wget 使用的是 http 协议, php 的 cgi 网关实际使用的是 fastcgi 协议, 是一个比 http 更为简化的协议, 作为内部通讯更加高效, 不过 wget 不支持这个协议, 但 Nginx 能理解这个协议, 整个过程是这样的:
browser – [http] --> Nginx – [fastcgi] --> php-fpm
严格来说, 不完全是 http 代理, 内部的反向代理实际用的是 fastcgi 网关协议, 不过这个原理还是一样的, 如果内部用一个比如 tomcat 来响应, 那么全程就都可以是 http 协议.
browser – [http] --> Nginx – [http] --> tomcat
而如果在内部发请求 80, 比如 wget localhost 那就还是被反向代理, 请求先到在 80 端口监听的 Nginx, Nginx 再转给 php-fpm.

2.3 负载均衡

一个很直接的原因就是利用反向代理可以作为内部 负载均衡(load balance) 的手段.

举个例子来说, 假如我现在开发了一个 java web 的应用作为我的网站后台, 我直接部署它到 tomcat 服务器上, 让 tomcat 监听 80 端口, 直接对外服务. 一开始访问量也不大, 所以这样也是没有问题的, 如下图所示:

注: 因为 http 协议的缺省端口就是 80, 所以用户输入地址时可以省略这个端口号, 也即只需这样:
http://xiaogd.net, 而不是繁琐的像这样: http://xiaogd.net:80, 关于缺省端口的话题,
还是可以参考前面所提的 深入理解端口.

但过一段时间之后, 访问量可能上来了, 一个 tomcat 进程处理不过来, 那怎么办呢? 于是我打算再起一个新的 tomcat 进程, 但这样就面临一个问题, 只有一个 80 端口, 它已经被第一个 tomcat 进程占用, 如果还要再起另外一个, 则只能选用其它的端口, 比如 8080.

当使用另外一个端口时, 确实可以启动两个 tomcat 的进程, 但用户想访问到第二个 tomcat 进程的服务, 却要这样去访问: http://xiaogd.net:8080. 显然, 这样的方案是有问题的, 用户根本不知道 8080 端口上服务的存在, 就算你有办法告诉用户, 用户也可能不太理解, 用户同时也很怕麻烦的, 为啥要我输入一个冒号加 8080 呢?

此外, 就算有些用户愿意如你所说转向访问 8080 端口, 你还是不能很好的控制把访问量平均地分配在两个 tomcat 上, 毕竟这是用户随机决定的, 也许很多用户又突然涌过来了 8080 端口的应用上, 造成了这边的拥挤.

又或者只有很少的用户愿意听从你的劝告转到新的 8080 端口上, 访问还是集中在旧的 80 端口上的, 这样旧的应用上响应还是很缓慢, 而新的应用却因为没几个用户访问而显得空闲, 没有得到充分的使用.

那么, 在这种情况下, 反向代理的好处就体现出来了, 具体的操作是这样的, 让 Nginx 作为一个前置的反向代理, 监听在 80 端口上; 而第一个 tomcat 则躲到幕后, 同时它也不再监听 80 端口(需要让给 Nginx), 而改为监听一个其它没有被使用的端口, 比如 8081, 然后让 Nginx 转发请求给它处理.

当然了, 如果只有一个 tomcat, 配置大概是这样的:(先大概猜一猜什么以上即可 后面会详细说明)

location / 
    proxy_pass   http://127.0.0.1:8080;

请求处理的流程是这样的:

请求: browser – [http] --> Nginx – [http] --> tomcat 响应: browser <–
[http] – Nginx <-- [http] – tomcat

自然, 这种情形下反向代理似乎不太必要, 还加多了一个环节, 响应速度反而慢了.

但如果有两个 tomcat, 情况就不一样了, 此时就可以在 Nginx 这个反向代理的层面, 启用负载均衡的策略, 大概的配置如下:

http 
    upstream myapp1 
        server 127.0.0.1:8080;
        server 127.0.0.1:8081;
    

    server 
        listen 80;

        location / 
            proxy_pass http://myapp1;
        
    

此时, 如果同时涌入了很多请求, Nginx 会把一半的请求交给 8080 端口上的 tomcat, 另一半的请求交给 8081 端口上的 tomcat, 如下图所示:

对外来看, 所有请求还是 Nginx 来处理, 用户不需要去做选择, 也不需要知道什么 8080, 8081 端口上应用的存在, 他们还是继续访问原来的网址 http://xiaogd.net 即可, 无需做任何改变.

如果你在云上有好几台主机, 甚至还可以将其组成一个内网, 然后将 tomcat 部署在不同的主机上. 比如有三台主机的话, 一台运行 Nginx 监听 80 端口, 其余两台运行 tomcat, 分别监听 8080 和 8081 端口, 同时接受并处理 Nginx 反向代理过来的请求, 如下图所示:

如果两台 tomcat 主机的配置不同, 比如一台的性能更强劲些, 还可以调整负载的比例(即权重, weight), 让性能更强的一台承担更多的请求:

http 
    upstream myapp1 
        server 192.168.0.20:8080 weight=3;
        server 192.168.0.21:8080 weight=2;
    

    server 
        listen 80;

        location / 
            proxy_pass http://myapp1;
        
    

如上配置 3:2 的权重比, 让其中一台承担 60% 的请求, 而另一台性能较差的则承担 40%, 也即每 5 个请求, 3 个会被转到 ip 为 20 的主机上, 2 个会转到 ip 为 21 的主机上.

自然, 有人可能还会有疑问, 所有请求都还是要经过 Nginx, 它能处理得过来吗? 答案是可以的, 因为它的功能仅仅是转发, 这就有点像美团外卖, 虽然它每天接受成千上万的人的点餐, 但它自己不需要去买菜, 洗菜, 切菜, 炒菜等, 它仅仅需要把订单交给饭店餐馆, 然后把它们做好的饭菜配送出去, 也即那些耗时的做饭过程都交给了饭店餐馆处理.

在这种反向代理的模式中, 同样的, 生成网页这个重任交到了隐藏在背后的 tomcat, 生成一个复杂的动态网页可能需要经过一些复杂的计算, 要查询数据库, 要拼凑各个页面组件, 可能会比较耗时, 但这些请求被两个 tomcat 应用并发地处理了, 因此响应的速度还是得到了保证, 而这些就是反向代理能给我们带来的好处.

转自 https://zhuanlan.zhihu.com/p/464965616 这个博主主要讲cpp的 其他文章也不错

2.4 健康检查

而且Nginx内置的健康检查功能:如果有一个服务器宕机,会做一个健康检查,再发送的请求就不会发送到宕机的服务器了。重新将请求提交到其他的节点上。

2.5服务器限流

Nginx限流就是限制用户请求速度,防止服务器受不了
限流有3种
正常限制访问频率(正常流量)
突发限制访问频率(突发流量)
限制并发连接数
Nginx的限流都是基于漏桶流算法,底下会说道什么是桶铜流

2.6动静分离

Nginx是当下最热的Web容器,网站优化的重要点在于静态化网站,网站静态化的关键点则是是动静分离,动静分离是让动态网站里的动态网页根据一定规则把不变的资源和经常变的资源区分开来,动静资源做好了拆分以后,我们则根据静态资源的特点将其做缓存操作。
让静态的资源只走静态资源服务器,动态的走动态的服务器
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术。
对于静态资源比如图片,js,css等文件,我们则在反向代理服务器nginx中进行缓存。这样浏览器在请求一个静态资源时,代理服务器nginx就可以直接处理,无需将请求转发给后端服务器tomcat。
若用户请求的动态文件,比如servlet,jsp则转发给Tomcat服务器处理,从而实现动静分离。这也是反向代理服务器的一个重要的作用。

其他

使用Nginx的话还能:
节省宽带:支持GZIP压缩,可以添加浏览器本地缓存
稳定性高:宕机的概率非常小
接收用户请求是异步的

缺点

    动态处理差:nginx处理静态文件好,耗费内存少,但是处理动态页面则很鸡肋,现在一般前端用nginx作为反向代理抗住压力,

三、基础使用

1、命令行相关命令

nginx 的使用比较简单,就是几条命令。

常用到的命令如下:

  • nginx -s stop :快速关闭Nginx,可能不保存相关信息,并迅速终止web服务。
  • nginx -s quit :平稳关闭Nginx,保存相关信息,有安排的结束web服务。
  • nginx -s reload :因改变了Nginx相关配置,需要重新加载配置而重载。
  • nginx -s reopen :重新打开日志文件。
  • nginx -c filename :为 Nginx 指定一个配置文件,来代替缺省的。
  • nginx -t :不运行,而仅仅测试配置文件。nginx 将检查配置文件的语法的正确性,并尝试打开配置文件中所引用到的文件。
  • nginx -v:显示 nginx 的版本。
  • nginx -V:显示 nginx 的版本,编译器版本和配置参数。

如果不想每次都敲命令,可以在nginx安装目录下新添一个启动批处理文件startup.bat,双击即可运行。内容如下:

@echo off
rem 如果启动前已经启动nginx并记录下pid文件,会kill指定进程
nginx.exe -s stop
 
rem 测试配置文件语法正确性
nginx.exe -t -c conf/nginx.conf
 
rem 显示版本信息
nginx.exe -v
 
rem 按照指定配置去启动nginx
nginx.exe -c conf/nginx.conf

如果是运行在 Linux 下,写一个 shell 脚本,大同小异。

2、nginx 目录结构

[root@localhost ~]# tree /usr/local/nginx
/usr/local/nginx
├── client_body_temp
├── conf                             # Nginx所有配置文件的目录
│   ├── fastcgi.conf                 # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default         # fastcgi.conf的原始备份文件
│   ├── fastcgi_params               # fastcgi的参数文件
│   ├── fastcgi_params.default       
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                   # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                   # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                  # scgi相关参数文件
│   ├── scgi_params.default           #default结尾的都是备份文件
│   ├── uwsgi_params                 # uwsgi相关参数文件
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp                     # fastcgi临时数据目录
├── html                             # Nginx默认站点目录
│   ├── 50x.html                     # 错误页面优雅替代显示文件,例如当出现502错误时会调用此页面
│   └── index.html                   # 默认的首页文件
├── logs                             # Nginx日志目录
│   ├── access.log                   # 访问日志文件
│   ├── error.log                    # 错误日志文件
│   └── nginx.pid                    # pid文件,Nginx进程启动后,会把所有进程的ID号写到此文件
├── proxy_temp                       # 临时目录
├── sbin                             # Nginx命令目录
│   └── nginx                        # 这是'nginx命令的目录'如Nginx的启动命令
├── scgi_temp                        # 临时目录
└── uwsgi_temp                       # 临时目录
————————————————

版权声明:本文为CSDN博主「小 源」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_51414096/article/details/125293932

3、nginx.conf配置文件结构

...              #全局块

events          #events块
   ...


http      #http块

    ...   #http全局块
    server        #server块
     
        ...       #server全局块
        location [PATTERN]   #location块
        
            ...
        
        location [PATTERN] 
        
            ...
        
    
    server
    
      ...
    
    ...     #http全局块

  1. 全局块:从配置文件开始到events块之间的内容,主要会设置一些影响Nginx服务器整体运行的配置指令,配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。
  2. events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
  3. http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。
  4. server块:配置虚拟主机的相关参数,一个http中可以有多个server。server其实就是host,比如www.csdn.com
  5. location块:配置请求的路由,以及各种页面的处理情况。https://editor.csdn.net/md//md/就是location。再如www.csdn.com/index.html,/index.html就是location。需要注意的是,如果没有输入location,如www.csdn.com,那么浏览器会自动帮我们加上/ , /www.csdn.com/
    PS:但是,如果我们访问的是www.csdn.com/a 则不会自动帮我们加上/ 因为这里不只是host了

4、配置文件示例

1)注意配置文件中的结尾有’;‘作为结束~!(切记!)
2)每次实验修改完配置文件后需要’重启 nginx 才会生效’

示例1


worker_processes  1# worker进程的数量
events                               					# 事件区块开始
    worker_connections  1024# 每个worker进程支持的最大连接数
                                    					# 事件区块结束
http                                					# HTTP区块开始
    include       mime.types;            				# Nginx支持的媒体类型库文件
    default_type  application/octet-stream;     		# 默认的媒体类型
    sendfile        on;       							# 开启高效传输模式
    keepalive_timeout  65# 连接超时
    
    #可以在nginx.conf同级目录下新建文件夹include
 	#然后里面根据不同的域名命名新建文件夹  再在里面新建vhost.conf文件,/usr/local/nginx/conf/include/csdn.com/csdn.vhost
 	#在里面写server块,避免一个nginx文件配置项太多且不好找 或者误删
 	include include/*/vhost.conf;  
 	include include/*.conf; #类似上面 不过是不建文件夹了 直接以名字命令,可灵活配置 域名视图、个人开发视图~~
 	                     
 	

    server             								# 第一个Server区块开始,表示一个独立的虚拟主机站点
        listen       80# 提供服务的端口,默认80
        server_name  localhost;       					# 提供服务的域名主机名
        location /             						# 第一个location区块开始
            root   html;       						# 站点的根目录,相当于Nginx的安装目录
            index  index.html index.htm;      			# 默认的首页文件,多个用空格分开
                  										# 第一个location区块结果
        error_page   500502503504  /50x.html;     		# 出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html           				# location区块开始,访问50x.html
            root   html;      							# 指定对应的站点目录为html
        
      

示例2

########### 每个指令必须有分号结束。#################
#user administrator administrators;  #配置用户或者组,默认为nobody nobody。
#worker_processes 2;  #允许生成的进程数,默认为1
#pid /nginx/pid/nginx.pid;   #指定nginx进程运行文件存放地址
error_log log/error.log debug;  #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg

events 
    accept_mutex on;   #设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  #设置一个进程是否同时接受多个网络连接,默认为off
    #use epoll;      #事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    #最大连接数,默认为512


http 
    include       mime.types;   #文件扩展名与文件类型映射表
    default_type  application/octet-stream; #默认文件类型,默认为text/plain
    #access_log off; #取消服务日志    
    log_format myFormat '$remote_addr–$remote_user [$time_local] $request $status $body_bytes_sent $http_referer $http_user_agent $http_x_forwarded_for'; #自定义格式
    access_log log/access.log myFormat;  #combined为日志格式的默认值
    sendfile on;   #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
    sendfile_max_chunk 100k;  #每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。
    keepalive_timeout 65;  #连接超时时间,默认为75s,可以在http,server,location块。

    upstream mysvr    
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    
    
    error_page 404 https://www.baidu.com; #错误页
    
    server 
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$        #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           #root path;  #根目录
           #index vv.txt;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向上面mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
         
        
    
    

示例3 默认的nginx.conf长这样

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


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  on;

    server 
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / 
            root   html;
            index  index.html index.htm;
        

        #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;
        #
    


    # 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;
    #    
    #


如何避免conf文件太长

仔细看示例1的include那里

5、server虚拟主机配置详解

示例如下

 server 
        listen       80;
        server_name  www.lijie.com;
        location / 
            root   data/www;
            index  index.html index.htm;
        
    

listen指令详解

该指令用于配置网络监听。主要有如下三种配置语法结构:

一、配置监听的IP地址

listen address[:port] [default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [deferred]
    [accept_filter=filter] [bind] [ssl];

二、配置监听端口

listen port[default_server] [setfib=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ipv6only=on|off] [ssl];

三、配置 UNIX Domain Socket

listen unix:path [default_server]  [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] 
    [deferred] [bind] [ssl];

上面的配置看似比较复杂,其实使用起来是比较简单的:

1 listen *:80 | *:8080 #监听所有80端口和8080端口
2 listen  IP_address:port   #监听指定的地址和端口号
3 listen  IP_address     #监听指定ip地址所有端口
4 listen port     #监听该端口的所有IP连接

下面分别解释每个选项的具体含义:

1、address:IP地址,如果是 IPV6地址,需要使用中括号[] 括起来,比如[fe80::1]等。

2、port:端口号,如果只定义了IP地址,没有定义端口号,那么就使用80端口。

3、path:socket文件路径,如 var/run/nginx.sock等。

4、default_server:标识符,将此虚拟主机设置为 address:port 的默认主机。(在 nginx-0.8.21 之前使用的是 default 指令)# 如果没有显式声明 default server 则第一个 server 会被隐式的设为 default server

5、 setfib=number:Nginx-0.8.44 中使用这个变量监听 socket 关联路由表,目前只对 FreeBSD 起作用,不常用。

6、backlog=number:设置监听函数listen()最多允许多少网络连接同时处于挂起状态,在 FreeBSD 中默认为 -1,其他平台默认为511.

7、rcvbuf=size:设置监听socket接收缓存区大小。

8、sndbuf=size:设置监听socket发送缓存区大小。

9、deferred:标识符,将accept()设置为Deferred模式。

10、accept_filter=filter:设置监听端口对所有请求进行过滤,被过滤的内容不能被接收和处理,本指令只在 FreeBSD 和 NetBSD 5.0+ 平台下有效。filter 可以设置为 dataready 或 httpready 。

11、bind:标识符,使用独立的bind() 处理此address:port,一般情况下,对于端口相同而IP地址不同的多个连接,Nginx 服务器将只使用一个监听指令,并使用 bind() 处理端口相同的所有连接。

12、ssl:标识符,设置会话连接使用 SSL模式进行,此标识符和Nginx服务器提供的 HTTPS 服务有关。

server_name指令详解

该指令用于虚拟主机的配置。通常分为以下三种:

1、基于域名的虚拟主机,通过域名来区分虚拟主机——应用:外部网站

需要建立/data/www /data/bbs目录,windows本地hosts添加虚拟机ip地址对应的域名解析;对应域名网站目录下新增index.html文件;


#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/www目录下文件
    server 
        listen       80;
        server_name  www.lijie.com;
        location / 
            root   data/www;
            index  index.html index.htm;
        
    
 
	#当客户端访问www.lijie.com,监听端口号为80,直接跳转到data/bbs目录下文件
	 server 
        listen       80;
        server_name  bbs.lijie.com;
        location / 
            root   data/bbs;
            index  index.html index.htm;
        
    
  • 语法格式如下:
server_name   name ...;
  • 对于name 来说,可以只有一个名称,也可以有多个名称,中间用空格隔开。而每个名字由两段或者三段组成,每段之间用“.”隔开。
server_name 123.com www.123.com
  • 可以使用通配符“*”,但通配符只能用在由三段字符组成的首段或者尾端,或者由两端字符组成的尾端。
server_name *.123.com www.123.*
  • 还可以使用正则表达式,用“~”作为正则表达式字符串的开始标记。
server_name ~^www\\d+\\.123\\.com$;
该表达式“~”表示匹配正则表达式,以www开头(“^”表示开头),
紧跟着一个0~9之间的数字,在紧跟“.123.co”,最后跟着“m”($表示结尾)

  • 以上匹配的顺序优先级如下:
1 ①、准确匹配 server_name
2 ②、通配符在开始时匹配 server_name 成功
3 ③、通配符在结尾时匹配 server_name 成功
4 ④、正则表达式匹配 server_name 成功

2、基于端口的虚拟主机,通过端口来区分虚拟主机——应用:公司内部网站,外部网站的管理后台

使用端口来区分,浏览器使用域名或ip地址:端口号 访问

 #当客户端访问www.lijie.com,监听端口号为8080,直接跳转到data/www目录下文件
	 server 
        listen       8080;
        server_name  www.lijie.com;
        location / 
            root   data/www;
            index  index.html index.htm;
        
    

	
	#当客户端访问www.lijie.com,监听端口号为80直接跳转到真实ip服务器地址 127.0.0.1:8080
	server 
        listen       80;
        server_name  www.lijie.com;
        location / 
		 	proxy_pass http://127.0.0.1:8080;
            index  index.html index.htm;
        
	
3、基于 IP 地址的虚拟主机配置

语法结构和基于域名匹配一样,而且不需要考虑通配符和正则表达式的问题。

server_name 192.168.1.1

6、location路由块配置详解

语法格式

location指令的作用是根据用户请求的URI来执行不同的应用,也就是根据用户请求的网站URL进行匹配,匹配成功即进行相关的操作。

 location [ = | ~ | ~* | ^~] uri 
 
 

1、= :用于不含正则表达式的 uri 前,要求请求字符串与 uri 严格匹配,如果匹配成功,就停止继续向下搜索并立即处理该请求。

2、~:用于表示 uri 包含正则表达式,并且区分大小写。

3、~*:用于表示 uri 包含正则表达式,并且不区分大小写。

4、^~:用于不含正则表达式的 uri 前,要求 Nginx 服务器找到标识 uri 和请求字符串匹配度最高的 location 后,立即使用此 location 处理请求,而不再使用 location 块中的正则 uri 和请求字符串做匹配。

注意:如果 uri 包含正则表达式,则必须要有 ~ 或者 ~* 标识。

模糊匹配

1)没有 / 时,location /abc/def可以匹配/abc/defghi请求,也可以匹配/abc/def/ghi

2)而有 / 时,location /abc/def/不能匹配/abc/defghi请求,只能匹配/abc/def/anything这样的请求

正则语法与优先级


1优先级最高 7最低
更详细的生效顺序可以看:http://wjhsh.net/pangbing-p-6956644.html

示例


#优先级1,精确匹配,根路径
    location =/ 
        return 400;
    
 
    #优先级2,以某个字符串开头,以av开头的,优先匹配这里,区分大小写
    location ^~ /av 
       root /data/av/;
    
 
    #优先级3,区分大小写的正则匹配,匹配/media*****路径
    location ~ /media 
          alias /data/static/;
    
 
    #优先级4 ,不区分大小写的正则匹配,所有的****.jpg|gif|png 都走这里
    location ~* .*Maven 最全教程,看了必懂,99% 的人都收藏了!

Maven 最全教程,看了必懂

Maven最全教程,看了必懂

重量级!Maven史上最全教程,看了必懂

不看绝对血亏!mysqlserver安装失败

Maven 最全教程,看了必懂,99% 的人都收藏了。。