Nginx详细讲解

一、原理

1、nginx的特点:Nginx占用的系统资源更少,能支持更多的并发连接(特别是静态小文件场景下),达到更高的访问效率;在功能上,Nginx不但是一个优秀的Web服务软件,还可以作为反向代理负载均衡及缓存服务使用;在安装配置上,Nginx更为方便,简单,灵活,可以说,Nginx是一个极具发展潜力的Web服务软件。高并发容易造成系统崩溃,不如apache稳定。 
反向代理负载均衡:lvs,haproxy 
Web服务软件:apache,tomcat resin weblogic

2、Nginx是什么? 
nginx是一个开源的,支持高性能,高并发的www服务(web服务)和代理服务软件。 
nginx因具有高并发(特别是静态资源),占用系统资源少等特性,且功能丰富而逐渐流行起来。 
nginx不但是一个优秀Web服务软件,还具有反向代理负载均衡功能和缓存服务功能,与lvs负载均衡及Haproxy等专业代理软件相比,Nginx部署起来更为简单,方便;在缓存功能方面,它又类似于Squid等专业的缓存服务软件。 
apache是多进程,占用系统资源答,内存是隔离的,互相不冲突。nginx是多线程模式。

3、Nginx的重要特性 
支持高并发:能支持几万并发连接(特别是静态小文件业务环境) 
资源消耗少:在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB 
可以做HTTP反向代理及加速缓存,即负载均衡功能,内置对RS节点服务器健康检查功能,这相当于专业的Haproxy软件或LVS的功能 
具备Squid等专业缓存软件等的缓存功能。 
支持异部网络I/O事件模型epoll(linux2.6+)。

4、Nginx软件的主要企业功能应用 
(1)作为Web服务软件 
Nginx是一个支持高性能,高并发的Web服务软件,它具有很多优秀的特性,作为Web服务器,与Apache相比,Nginx能够支持更多的并发连接访问,但占用的资源更少,效率更高,在功能上也强大了很多,几乎不逊色于Apache。

(2)反向代理或负载均衡服务 
在反向代理或负载均衡服务方面,Nginx可以作为Web服务,PHP等动态服务及Memcached缓存的代理服务器,它具有类似专业反向代理软件(如Haproxy)的功能,同时也是一个优秀的邮件代理服务软件,但是Nginx的代理功能还是相对简单了些,特别是不支持TCP的代理(Nginx1.9.0版本已经开始支持TCP代理了)

(3)前端业务数据缓存服务 
在Web缓存服务方面,Nginx可通过自身的proxy_cache模块实现类Squid等专业缓存软件的功能。

5、为什么Nginx总体性能比Apache高? 
Nginx使用最新的epoll(Linux2.6内核)和kqueue(freebsd)异步网络I/O模型,而Apache使用的是传统的select模型。目前Linux下能够承受高并发访问的Squid,Memcached软件采用的都是epoll模型。 
处理大量连接的读写时,Apache所采用的select网络I/O模型比较低效。

image_1cr1p6cmis4o36umiu12vej909.png-118.8kB

 

二、编译nginx

1、安装解压

 
  1. yum install -y pcre-devel openssl-devel #用本地yum仓库安装依赖包
  2. #wget -q http://nginx.org/download/nginx-1.10.2.tar.gz #下载软件源码包
  3. tar xf nginx-1.10.2.tar.gz -C /usr/src/ #解压缩
  4. cd /usr/src/nginx-1.10.2
  5. ./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module #预配置,命令说明:--with-http_stub_status_module 要运用的模块名,--with指定模块
  6. make && make install #编译和安装
  7. ln -s /usr/local/nginx/sbin/* /usr/local/sbin/ #给命令做软连接,以便PATH能找到

2、创建一个程序用户

 
  1. useradd -M -s /sbin/nologin nginx #创建程序用户
  2. /usr/local/nginx/sbin/nginx #启动nginx

特别提示: /usr/local/nginx/sbin/nginx -s reload nginx平滑重启命令 
/usr/local/nginx/sbin/nginx -s stop nginx停止服务命令 
web排错三部曲下面介绍客户端排查的思路 
第一步,在客户端上ping服务器端IP,命令如下: 
ping 10.0.0.8排除物理线路问题影响 
第二步,在客户端上telnet服务器端IP,端口,命令如下: 
telnet 10.0.0.8 80排除防火墙等得影响 
第三步,在客户端使用wget命令检测,如下: 
wget 10.0.0.8(curl -I 10.0.0.8)模拟用户访问,排除http服务自身问题,根据输出在排错

3、安装完成后进入配置文件目录加工下配置文件

 
  1. Nginx主配置文件nginx.conf,路径:/usr/local/nginx/conf/nginx.conf
  2. egrep -v "#|^$" nginx.conf.default > nginx.conf #去掉包含#号和空行的内容

image_1cr1s5qnr1ivqmujnm710piqvt9.png-11.5kB

4、配置文件内容说明 
image_1cr6kbmdcbfs1f241k2bv3i95o1p.png-340.6kB

 

三、开始配置--制作虚拟域名

1、配置,配置完成后,nginx -t 可查询配置是否报错 
image_1cr6kcqiucu5a2h11ocmhu9hp26.png-30.4kB

image_1crmpa41a5ab1cdbpe3f5b1rro9.png-18.2kB

2、关闭防火墙 service iptables stop

3、模拟开始制作网页

 
  1. cd /usr/local/nginx/html
  2. echo "hostname" -I www.mendermi.com" > index.html
  3. echo "hostname" -I www.mendermi.com" >> /etc/hosts

image_1cr6l8f0g1nfo13cnnfj1tqt61s16.png-28.4kB

4、命令 curl,模拟访问浏览器 参数-v 查看报头和内容

curl www.mendermi.com

image_1cr6lbe0o1q3k1qfbiqq10rk13o123.png-7.6kB

5、以windows方式访问测试 
(1)windows的映射文件写入刚做的域名 
image_1cr6lh1up7ogt7h2d1bk4rfg30.png-34.4kB
就可以访问了 
image_1cr6lsito1u321rqu6961ekt9313d.png-22.1kB

6、模拟修改路径 
image_1cr6m1l2bv2k1hm31mvtcei4623q.png-27.5kB 
重启服务 
/usr/local/nginx/sbin/nginx -s reload 
image_1cr6m55grrhn19hv3ei12fpomb47.png-44.9kB

访问说明: 
原因是,以前我们访问的是html目录,现我们在配置文件里加了个www,也就表示访问的路径是www目录了。原来的网址还是访问的是html目录。所以访问不了,配置文件里面加了什么路径,我们访问的地址就要加上,域名/号表示配置文件里面的root,也就是根 
解决办法: 
image_1cr6ml1o11mn41bpjth1fmf1dri4k.png-33.6kB

image_1cr6mm35855j5scquq1uh51vfu51.png-22.3kB

为什么浏览器能分辨出来你向看哪个网址? 
image_1cr6nou3u1uuq7pc1chhhgfpbn5e.png-205.7kB

7、Web服务器搭建网站的方法,种类 
一个Web服务器搭建多个网站有三种方法 
1、基于不同域名的虚拟网站 
2、基于不同监听端口的虚拟网站 
3、基于不同IP的虚拟网站

(1)不同端口的搭建过程 
image_1cr6oduvj1e3c3gr192mqq315fv68.png-75kB 
(2)重启服务 
/usr/local/nginx/sbin/nginx -s reload 
(3)访问 
访问时候直接在域名后方输入对应的端口即可,例:192.128.200.128:81 
image_1crckih531lcc9khsodjl01a369.png-26.8kB

(4)处理禁止非法用户访问网站 
image_1cr6pg6p5b1n8hg1n6991j1f587f.png-268.6kB
工作中,我们都会加一个防黑的方法,做为安全防护。 
image_1cr6pagg32o5cakssd124l1l1t72.png-194kB 
注:在工作中,通常每个域名都有一个专门的目录,例,www.mendermi.com 这个是www打头的,我们创建www目录把index.html放入。

 

四、Nginx常用功能配置实战

下面是优化后的Nginx配置的实战方案 
image_1crclb14c1pcnglf1g2r1of010pam.png-21.6kB

image_1crclbukhvih1lm3nokd6uh41j.png-23kB

 

五、Nginx状态信息功能实战

1、确认编译时是否设定了此模块 
image_1cr6q2bff1ql01mia13m61e911vv27s.png-23.6kB

2、设定信息模块配置 
(1)设定模块信息 
image_1crcpq2m24qe1oec6b51hc4h1220.png-25.7kB

(2)主配置文件添加 
image_1crcq245pj9r1cn67k114l6rto2d.png-26.1kB

(3)本机映射文件添加域名 status.mendermi.com 
image_1crcq6oekii260g1iqe1dh11hk92q.png-13.3kB

注:需要重启Nginx服务

3、 Nginx status显示结果详解

[root@localhost nginx]# curl status.yunjisuan.com Active connections: 
2 #表示Nginx正在处理的活动连接2个 server accepts handled requests 39 39 41 
Reading: 0 Writing: 1 Waiting: 1 第一个server表示Nginx启动到现在2共处理了39个连接 
第二个accepts表示Nginx启动到现在共成功创建了39次握手 请求丢失数=(握手数-连接数),可以看出,本次状态显示没有丢失请求。 
第三个handled requests,表示总共处理了41次请求。 Reading为Nginx读取到客户端的Header信息数 
Writing为Nginx返回给客户端的Header信息数 
Waiting为Nginx已经处理完正在等候下一次请求指令的驻留连接。在开启keep-alive的情况下,这个值等于active - 
(reading+writing) 特别提示: 出于安全起见,这个状态信息要防止外部用户查看。

 

六、增加错误日志

1、Nginx访问日志轮询切割 
默认情况下Nginx会把所有的访问日志生成到一个指定的访问日志文件access.log里,但这样一来,时间长了就会导致日志个头很大,不利于日志的分析和处理,因此,有必要对Nginx日志,按天或按小时进行切割,使其分成不同的文件保存。

2、日志切割脚本 
image_1crcqv62t2jcfr71ccec3l8v37.png-32.8kB

 

七、Nginx location

liocation是nginx非常重要的过滤函数,可以通过正则表达式来匹配过滤不同URL里的URI部分,匹配到不同的URI进入到不同的location,也就是进入到不同的网页不同。

1、location使用的语法为:

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

  ...

}

2、匹配实例

image_1cr998fai1ba1129vols1ukavjl1p.png-70.7kB

 

八、Nginx rewrite

1 什么是Nginx rewrite? 
和Apache等Web服务软件一样,Nginx rewrite的主要功能也是实现URL地址重写。Nginx的rewrite规则需要PCRE软件的支持,即通过Perl兼容正则表达式语法进行规则匹配。默认参数编译时,Nginx就会安装支持rewrite的模块,但是,也必须要有PCRE软件的支持。

2 Nginx rewrite 语法 
(1)rewrite指令语法 
指令语法:rewrite regex replacement 【flag】; 
默认值:none 
应用位置:server,location,if 
rewrite是实现URL重写的关键指令,根据regex(正则表达式)部分的内容,重定向到replacement部分,结尾是flag标记。下面是一个简单的URL rewrite跳转例子:

rewrite ^/(.*) http://www.baidu.com/$1  permanent;
表示以根开头后面是任意的域名,一律重写成,www.baidu.com
$1的意思是取(.*)里的值

3、rewrite指令的最后一项参数flag标记的说明 
image_1crctd1ec1kq2fpq11rpnb3lue6u.png-94.5kB

在以上的flag标记中,last和break用来实现URL重写,浏览器地址栏的URL地址不变,但在服务器端访问的程序及路径发生了变化。redirect和permanent用来实现URL跳转,浏览器地址栏会显示跳转后的URL地址。 
last和break标记的实现功能类似,但二者之间有细微的差别,使用alias指令时必须用last标记,使用proxy_pass指令时要使用break标记。last标记在本条rewrite规则执行完毕后,会对其所在的server{...}标签重新发起请求,而break标记则会在本条规则匹配完成后,终止匹配,不再匹配后面的规则。

4、Nginx rewrite 301 跳转

 
  1. server {
  2. listen 80;
  3. server_name www.yunjisuan.com;
  4. root /var/www/html/wwwcom;
  5. location / {
  6. index index.html index.htm;
  7. }
  8. # location = / {
  9. # return 402;
  10. # }
  11. location = /images/ {
  12. return 501;
  13. }
  14. location /documents/ {
  15. return 403;
  16. }
  17. location ^~ /images/ {
  18. return 404;
  19. }
  20. location ~* .(gif|jpg|jpeg)$ {
  21. return 500;
  22. }
  23. }
  24. server{
  25. listen 80;
  26. server_name yunjisuan.com;
  27. rewrite ^/(.*) http://www.yunjisuan.com/$1 permanent;
  28. 当用户访问yunjisuan.com及下面的任意内容时,都会通过这条rewrite跳转到www.yunjisuan.com对应的地址
  29. }

客户端访问测试结果 
微信图片_20181106150032.png-68.7kB

微信图片_20181106150119.png-118kB

5、 实现不同域名的URL跳转 
示例:实现访问http://mail.yunjisuan.com时跳转到http://www.yunjisuan.com/mail/yunjisuan.html

外部跳转时,使用这种方法可以让浏览器地址变为跳转后的地址,另外,要事先设置http://www.yunjisuan.com/mail/yunjisuan.html有结果输出,不然会出现401等权限错误。

(1)配置Nginx rewrite规则

 
  1. [root@localhost nginx]# cat conf/extra/mail.conf
  2. server {
  3. listen 80;
  4. server_name mail.yunjisuan.com;
  5. location / {
  6. root /var/www/html/mailcom;
  7. index index.html index.htm;
  8. }
  9. if ( $http_host ~* "^(.*).yunjisuan.com$") { #$http_host取报头变量
  10. set $domain $1; #set是设置变量,表示把$1得值赋值给前面$domain里面
  11. rewrite ^(.*) http://www.yunjisuan.com/$domain/yunjisuan.html break;
  12. #开始重写,以任意开头,都跳转到后方域名
  13. }
  14. }

客户端访问测试结果 
image_1crjt830d1brv8n91pj51rbdm565b.png-222.2kB

6、rewrite跳转标记flag使用总结

1,在根location(即location / {...})中或server{...} 标签中编写rewrite规则,建议使用last标记
2,在普通的location(例 location/yunjisuan/{...}或if{}中编写rewrite规则,则建议使用break标记)
 

九、Nginx访问认证

有时,在实际工作中企业要求我们为网站设置访问账号和密码权限,这样操作后,只有拥有账号密码的用户才可以访问网站内容。 
这种使用账号密码才可以访问网站的功能主要应用在企业内部人员访问的地址上,例如:企业网站后台,MySQL客户端phpmyadmin,企业内部的CRM,WIKI网站平台。

1、安装http命令 
yum -y install httpd

2、创建密码文件 
我们可以借用apache的htpasswd软件,来创建加密的账号和密码 
htpasswd -bc /usr/local/nginx/conf/htpasswd yunjisuan 123123

3、在虚拟主机配置文件里加入两条配置信息

 
    1. server {
    2. listen 80;
    3. server_name blog.yunjisuan.com;
    4. location / {
    5. root /var/www/html/blogcom;
    6. index index.html index.htm;
    7. auth_basic "yunjisuan training"; #加入这条配置
    8. auth_basic_user_file /usr/local/nginx/conf/htpasswd; #加入这条配置
    9. }
    10. }
    11. #配置解释:
    12. auth_basic :验证的基本信息选项(后边跟着的双引号里就是验证窗口的名字)
    13. auth_basic_user_file :验证的用户文件(后边根账号密码文件的绝对路径)
    14. cat /usr/local/nginx/conf/htpasswd
    15. yunjisuan:FC1/eEc/iK0Mo #账号密码是加密的(htpasswd是文件的名字)
原文地址:https://www.cnblogs.com/mendermi/p/9950628.html