Linux实战教学笔记27:Nginx详细讲解

前言:nginx的特点

本节主要对Nginx Web服务软件进行介绍,涉及Nginx的基础,特性,配置部署,优化,以及企业中的日常运维管理和应用。作为HTTP服务软件的后起之秀,Nginx与它的老大哥Apache相比有很多改进之处,比如,在性能上,Nginx占用的系统资源更少,能支持更多的并发连接(特别是静态小文件场景下),达到更高的访问效率;在功能上,Nginx不但是一个优秀的Web服务软件,还可以作为反向代理负载均衡及缓存服务使用;在安装配置上,Nginx更为方便,简单,灵活,可以说,Nginx是一个极具发展潜力的Web服务软件。

 

Nginx是什么?

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

1.nginx介绍

Nginx的重要面试知识

1.1 nginx的特点

nginx的基本特性

  1. 对静态资源高速高并发访问及缓存
  2. 可使用反向代理加速,并且可进行数据缓存
  3. 具有简单负载均衡、节点健康检查和容错功能
  4. 支持远程FastCGI服务的缓存加速
  5. 支持FastCGI、Uwsgi、SCGI、Memcache Server的加速和缓存
  6. 支持SSL、TLS、SNI
  7. 具有模块化的架构:过滤器包括gzip压缩、rangs支持、chunked响应、XSLT、SSI及图像缩放等功能。在SSI过滤中,一个包含多个SSI的页面,如果经由FastCGI或反向代理,可被并行处理。

它所具备的其他www服务特性

  1. 支持基于名字、端口、ip的多虚拟主机站点
  2. 支持Keepalive和pipelined连接
  3. 可支持简单方便灵活的配置和管理
  4. 支持修改nginx配置,并在代码上线时,可平滑重启,不中断业务访问
  5. 可自定义访问日志格式,临时缓冲写日志操作,快速日志轮询及通过rsyslog处理日志
  6. 可利用信号控制nginx进程
  7. 支持3xx-5xxHTTP状态码重定向
  8. 支持rewrite模块,支持URI重写及正则表达式匹配
  9. 支持基于客户端ip地址和HTTP基本认证的访问控制
  10. 支持PUT、DELETE、MKCOL、COPY、MOVE等特殊的HTTP请求方法
  11. 支持FLV流和MP4流技术产品应用
  12. 支持HTTP响应速率限制
  13. 支持同一ip地址的并发连接或请求数限制
  14. 支持邮件服务代理

面试时可能需要解答如下nginxHTTP服务器的特色及优点

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

apache软件的特点

  1. Apache2.2版本非常稳定强大,性能好。
  2. prefork模式取消了进程开销
  3. 处理动态业务数据时,因关联到后端的引擎和数据库,瓶颈不在Apache上
  4. 高并发时消耗资源相对多一些
  5. 基于传统的select模型,高并发能力有限
  6. 支持扩展库,可以通过DSO、apxs方法编译安装额外的插件功能,不需要重新编译Apache
  7. 功能多,更稳定,更安全,插件也多
  8. 市场份额逐渐递减

Nginx的重要特性

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

1.2 nginx和其他web对比(epoll和select)

  处理静态小文件(小于1Mb),nginx比Apache和Lighttpd更有优势,处理动态文件时Apache更有优势,但是差距不大。这是因为处理动态数据的能力取决于PHP(java)和后端数据库的服务能力,也就是说瓶颈不在web服务器上,一般情况下普通的PHP引擎支持的并发连接参考值为300~1000,java引擎和数据库的并发连接参考值为300~1500。

为什么nginx总体性能比Apache高

        nginx使用最新的epoll和kqueue(freebsb)异步网络I/O模型,而Apache使用的是传统的select模型

       异步的安全性、稳定性没有同步高,中间容易被人窃取,用户收不到数据

select和epoll的释义:

  select模型就像保姆照看一群孩子,会询问每个孩子是否要尿尿,有就带领去(尿尿比作网络I/O时间,时间复杂度是O(n))

       epoll就是孩子要尿尿,自己主动去规定好的地方,然后保姆带领去,这样保姆只需要关心那个地方有没有孩子 (时间复杂度O(1))

指标

select

epoll

性能

随着连接数的增加而急剧下降。处理成千上万的并发连接数时,性能很差。

随着连接数的增加,性能基本没有下降,处理成千上万的并发连接数时,性能好

连接数

连接数 有限制,处理最大连接数不超过1024.如果超过1024那么就要修改FD_SETSIZE宏,并重新编译。

连接数无限制

内在处理机制

性能轮询

回调callback

开发复杂性

表1   Apache select和nginx epoll技术对比

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等专业缓存软件的功能。

综上:Nginx的这三大功能(Web服务,反向代理或负载均衡服务,前端业务数据缓存服务)是国内使用Nginx的主要场景,特别是前两个。

1.3 如何选择web

静态业务:

  若是高并发场景,尽量采用nginx或Lighttpd,首选nginx

动态业务:

  理论上采用nginx和Apache均可,为了避免相同业务服务软件多样化,增加维护成本

既有动态又有静态:

  选用nginx

Web 服务产品性能对比测试

从下图中可以看出处理静态小文件(小于1MB时),Nginx和Lighttpd比Apache更有优势,Nginx处理小文件的优势明显,Lighttpd综合最强。

图片 1

下图是各类Web服务器在动态数据性能上的对比,从图中可以看出,在处理动态数据时,三者的差距不大,Apache更有优势一点。这是因为处理动态数据的能力取决于PHP(java)和后端数据库的服务能力,也就是说瓶颈不在Web服务器上。一般情况下普通PHP引擎支持的并发连接参考值为300~1000,Java引擎和数据库的并发连接参考值为300~1500.业务场景及网站架构不同,并发连接数也会有上下浮动。

图片 2

2.安装nginx

安装nginx有3种方法:

  1. rpm –ivh ngin*.rpm(有依赖问题)
  2. yum(自动解决rpm的安装依赖问题,安装简单化,缺点:不能定制)
  3. make编译安装(./configure(配置),make(编译),make install(安装),缺点:复杂,效率低)

 

更换国内的yum源

 

为什么Nginx总体性能比Apache高?

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

图片 3

图片 4

  CentOS 5

 

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-5.repo

 

如何正确选择Web服务器

虽然国内很多人都在使用Nginx,但是Apache,Lighttpd这两个Web服务器同样非常强大且实用,尤其时Apache,到目前为止仍是全球使用最广泛的Web服务软件。
在实际工作,我们需要根据业务需求来选择合适的业务服务软件,有关Web服务,建议如下。

  • 静态业务:若是高并发场景,尽量采用Nginx或Lighttpd,二者首选Nginx。
  • 动态业务:理论上采用Nginx和Apache均可,建议选择Nginx,为了避免相同业务的服务软件多样化,增加额外维护成本。动态业务可以由Nginx兼做前端代理,再根据页面元素的类型或目录,转发到后端相应的服务器进行处理。
  • 既有静态业务又有动态业务:采用Nginx

此外,如果并发不是很大,又对Apache很熟悉,采用Apache也是可以的,Apache2.4版本也很强大,并发连接数也有所增加。总的来说,在满足需求的前提下,首先选择自己最擅长的软件,若发现了更好的软件,可在掌握新软件之后逐步替换。虽然动态和静态业务都倾向于选择Nginx,但是大前提是自己要熟练掌握Nginx。切记,在工作中不要盲目选择软件,这可能最终会导致自己无法控制局面,从而给企业带来灾难性的损失。

  CentOS 6

 

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

 

1,nginx的编译安装部署

yum install -y pcre-devel openssl-devel         #用本地yum仓库安装依赖包
#wget -q http://nginx.org/download/nginx-1.10.2.tar.gz     #下载软件源码包
useradd -s /sbin/nologin -M www     #创建程序用户
tar xf nginx-1.10.2.tar.gz -C /usr/src/     #解压缩
cd /usr/src/nginx-1.10.2
./configure --user=www --group=www --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module       #预配置
make && make install        #编译和安装
ln -s /usr/local/nginx/sbin/* /usr/local/sbin/  #给命令做软连接,以便PATH能找到
/usr/local/nginx/sbin/nginx #启动nginx

特别提示:
/usr/local/nginx/sbin/nginx -s reload nginx平滑重启命令
/usr/local/nginx/sbin/nginx -s stop nginx停止服务命令

  CentOS 7

 

wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

 

安装阿里云的epol源

1、备份(如有配置其他epel源)

  mv /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.backup

  mv /etc/yum.repos.d/epel-testing.repo /etc/yum.repos.d/epel-testing.repo.backup

2、下载新repo 到/etc/yum.repos.d/

  epel(RHEL 7)

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo

  epel(RHEL 6)

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

  epel(RHEL 5)

    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-5.rep

 

配置安装nginx的yum源

cd /etc/yum.repos.d/

vim nginx.repo,填写如下内容:

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/6/$basearch/
gpgcheck=0
enabled=1

 

1.1 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服务自身问题,根据输出在排错

提示:
以上三步是客户端访问网站异常排查的重要三部曲。

2.1 编译安装步骤

1.安装nginx需要的pcre库

yum install pcre pcre-devel -y

安装pcre库是为了是nginx支持具备URI重写功能的rewrite模块,不安装那就无法使用rewrite模块的功能。基本上rewrite功能是企业必须的。

  1. 安装openssl-devel

    [root@web01 nginx]#yum -y install openssl openssl-devel

  2. 开始安装nginx

    [root@web01 nginx]#wget http://nginx.org/download/nginx-1.6.3.tar.gz [root@web01 nginx]#tar xf nginx-1.6.3.tar.gz [root@web01 nginx]#useradd nginx -M -s /sbin/nologin [root@web01 nginx]#cd nginx-1.6.3 [root@web01 nginx]#./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module --with-http_stub_status_module [root@web01 nginx]#make [root@web01 nginx]#make install [root@web01 nginx]#ls /application/nginx-1.6.3/ conf html logs sbin [root@web01 nginx]#ln -s /application/nginx-1.6.3/ /application/nginx [root@web01 nginx]#/application/nginx/sbin/nginx

2,Nginx主配置文件nginx.conf

Nginx主配置文件nginx.conf是一个纯文本类型的文件(其他配置文件大多也是如此),它位于Nginx安装目录下的conf目录,整个配置文件是以区块的形式组织的。一般,每个区块以一个大括号“{}”来表示,区块可以分为几个层次,整个配置文件中Main区位于最上层,在Main区下面可以有Events区,HTTP区等层级,在HTTP区中又包含有一个或多个Server区,每个Server区中又可有一个或多个location区,整个Nginx配置文件nginx.conf的主体框架为:

[root@chensiqi conf]# egrep -v "#|^$" nginx.conf #去掉包含#号和空行的内容
worker_processes  1; #worker进程的数量
error_log  logs/error.log;  #错误日志(默认没开)
pid        logs/nginx.pid;  #进程号(默认没开)
events {    #事件区块开始
    worker_connections  1024;   #每个worker进程支持的最大连接数
}           #事件区块结束
http {      #http区块开始
    include       mime.types;   #Nginx支持的媒体类型库文件包含
    default_type  application/octet-stream; #默认的媒体类型
    sendfile        on;     #开启高效传输模式
    keepalive_timeout  65;  #连接超时。
    server {      #网站配置区域(第一个server第一个虚拟主机站点)
        listen       80;    #提供服务的端口,默认80
        server_name  www.chensiqi.org; #提供服务的域名主机名
        location / {    #第一个Location区块开始
            root   html;  #站点的根目录(相对于nginx安装路径)
            index  index.html index.htm; #默认的首页文件,多个用空格分开
        }
        error_page 500 502 503 504  /50x.html;  #出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {  #Location区块开始,访问50x.html
            root   html;     #指定对应的站点目录为html
        }
    }
    server {      #网站配置区域(第二个server第二个虚拟主机站点)
        listen       80;    #提供服务的端口,默认80
        server_name  bbs.chensiqi.org; #提供服务的域名主机名
        location / {    #服务区块
            root   html;  #相对路径(nginx安装路径)
            index  index.html index.htm;
        }
        location = /50x.html { #发生错误访问的页面
            root   html;
        }
    }
}

整个nginx配置文件的核心框架如下:

worker_processes 1;
events {

    worker_connections 1024;

}
http {
    include mime.types;
    server {
        listen  80;
        server_name localhost;
        location / {
            root  html;
            index  index.html index.htm;
        }
    }
}

2.2 验证安装结果

  1. 检查语法

    [root@web01 nginx]#/application/nginx/sbin/nginx -t

  2. 启动nginx服务

    [root@web01 nginx]#/application/nginx/sbin/nginx

  3. 查看服务对应的端口是否成功开启

    [root@web01 nginx]#netstat -tunlp|grep 80 tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 7377/nginx

    [root@web01 nginx]# ps -ef|grep nginx root 7377 1 0 17:38 ? 00:00:00 nginx: master process www 7378 7377 0 17:38 ? 00:00:00 nginx: worker process /application/nginx/sbin/nginx root 7382 4710 0 17:39 pts/0 00:00:00 grep nginx

    [root@web01 nginx]# lsof -i:80 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 7377 root 6u IPv4 22767 0t0 TCP :http (LISTEN) nginx 7378 www 6u IPv4 22767 0t0 TCP :http (LISTEN)

  4. 结果

(1)用浏览器输入10.0.0.8看到下图就成功了

  图片 5

(2)wget 10.0.0.8

(3)curl -I http://nginx.org/

补充

/application/nginx/sbin/nginx -V        #显示编译参数

/application/nginx/sbin/nginx -h        #man帮助

/application/nginx/sbin/nginx -t         #检查语法

编译安装目录结构

[root@localhost ~]# tree /application/nginx-1.6.3/

/usr/local/nginx
├── client_body_temp
├── conf                                  # Nginx所有配置文件的目录
│   ├── fastcgi.conf                      # fastcgi相关参数的配置文件
│   ├── fastcgi.conf.default                 # fastcgi.conf的原始备份文件
│   ├── fastcgi_params                     # fastcgi的参数文件
│   ├── fastcgi_params.default              # 所有结尾为default的文件都是备份文件
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types                        # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf                        # Nginx主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params                        # scgi相关参数文件
│   ├── scgi_params.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的启动命令
├── scgi_temp                             # 临时目录
└── uwsgi_temp                          # 临时目录

yum安装的nginx的目录结构:
[root@10.0.0.20 ~]#rpm -qa nginx
nginx-1.12.2-1.el6.ngx.x86_64
[root@10.0.0.20 ~]#rpm -ql nginx-1.12.2-1.el6.ngx.x86_64

3,Nginx其他配置文件

  • 如果是配合动态服务(例如PHP服务),Nginx软件还会用到扩展的fastcgi相关配置文件,这个配置是通过在Nginx.conf主配置文件中嵌入include命令来实现的,不过默认情况是注释状态,不会生效。

  • fastcgi.conf配置文件的初始内容如下:

[root@localhost conf]# cat fastcgi.conf

fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;
  • fastcgi_params 默认配置文件的内容如下:
[root@localhost conf]# cat fastcgi_params

fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;
fastcgi_param  REQUEST_SCHEME     $scheme;
fastcgi_param  HTTPS              $https if_not_empty;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

上述未做注释的目录或文件是比较少用的,有关动态扩展配置后文讲到PHP服务时再来讲解。

2.3 编译安装nginx参数

编译安装nginx软件时。可以使用./configure--help查看相关参数帮助。

­--prefix                                         #设置安装路径

--user=USER                              #进程用户权限

--group=GROUP                         #进程用户组权限

--with-http_stub_status_module      #激活状态信息

--with-http_ssl_module                    #激活ssl功能

 

4,Nginx的功能模块说明

图片 6

2.4 Nginx http功能模块

Nginx http 功能模块                模块说明

ngx_http_core_module              包括一些核心的http参数配置对应的配置为http区块部分

ngx_http_access_module                 访问控制模块,用来控制网站用户对Nginx的访问

ngx_http_gzip_module                 压缩模块,对Nginx返回的数据压缩,属于性能优化模块

ngx_http_fastcgi_module             FastCGI模块,和动态应用相关的模块,例如PHP

ngx_http_proxy_module proxy     代理模块

ngx_http_upstream_module             负载均衡模块,实现网站的负载均衡功能及节点的健康检查

ngx_http_rewrite_module                 URL地址重写模块

ngx_http_limit_conn_module       限制用户并发连接数及请求数模块

ngx_http_limit_req_module         根据定义的key限制Nginx请求过程的速率

ngx_http_log_module                  访问日志模块,指定的格式记录Nginx客户访问日志等信息

ngx_http_auth_basic_module web   认证模块,设置web用户通过账号、密码访问Nginx

ngx_http_ssl_module                   ssl模块,用于加密的http连接,如https

ngx_http_stub_status_module     记录Nginx基本访问状态信息等的模块

5,Nginx虚拟主机配置实战

2.5 nginx.conf

[root@web01 conf]# egrep -v '#|^$' nginx.conf

worker_processes  1;                               #work进程的数量
events {                                            #事件区块开始
    worker_connections  1024;                          #每个worker进程支持的最大连接数
}                                                     #事件区块结束
http {                                             #http区块开始
    include       mime.types;                   #nginx支持的媒体类型库文件
    default_type  application/octet-stream;     #默认的媒体类型
    sendfile        on;                            #开启高效的传输模式
    keepalive_timeout  65;                      #连接超时
 include  path/*.conf;                          #如果server标签过多可以摘出去,到任何路径下

    server {                                #第一个server区块开始,表示一个独立的虚拟主机站点
        listen       80;                           #提供服务的端口,默认是80
        server_name  localhost;                     #提供服务的域名主机名
        location / {                                #第一个location区块开始
            root   html;                         #站点的根目录,相当于nginx安装目录
            index  index.html index.htm;         #默认的首页文件,如果没有首页文件报403,报403的除了添加首页文件的另一个解决方法,在这放置autoindex on
        }                                         #第一个location区块结束
        error_page   500 502 503 504  /50x.html;   #出现对应的http状态码时,使用50x.html回应客户
        location = /50x.html {                   #location区块开始,访问50x.html
            root   html;                           #指定站点目录html
        }
    }
}                                                 #http区块结束

 

5.1 虚拟主机概念和类型介绍

3. nginx虚拟主机配置

5.1.1 虚拟主机概念

所谓虚拟主机,在Web服务里就是一个独立的网站站点(www.baidu.org),这个站点对应独立的域名(也可能是IP或端口),具有独立的程序及资源目录,可以独立地对外提供服务供用户访问。
这个独立的站点在配置里是由一定格式的标签段标记,对于Apache软件来说,一个虚拟主机的标签段通常被包含在

3.1 虚拟主机的概念

  所谓的虚拟主机,在web访问里就是一个独立的网站站点,这个站点对应独立的域名(也可能是IP或端口),具有独立的程序和目资源录,可以独立的对外提供服务供用户访问。

  这个独立的站点在配置里由一定的格式的标签段标记的。在nginx软件里是使用一个server{}标签来标识一个虚拟主机,一个web服务里可以有多个虚拟主机,即可以支持多个虚拟主机站点。

5.1.2 虚拟主机类型

常见的虚拟主机类型有如下几种。

  • 基于域名的虚拟主机

所谓基于域名的虚拟主机,意思就是通过不同的域名区分不同的虚拟主机,基于域名的虚拟主机是企业应用最广的虚拟主机类型,几乎所有对外提供服务的网站都是使用基于域名的虚拟主机,例如:www.etiantian.org

  • 基于端口的虚拟主机

同理,所谓基于端口的虚拟主机,意思就是通过不同的端口来区分不同的虚拟主机,此类虚拟主机对应的企业应用主要为公司内部的网站,例如:一些不希望直接对外提供用户访问的网站后台等,访问基于端口的虚拟主机地址里要带有端口,例如:http://www.baidu.com:80

  • 基于IP的虚拟主机

同理,所谓基于IP的虚拟主机,意思就是通过不同的IP区分不同的虚拟主机,此类虚拟主机对应的企业应用非常少见,一般不同业务需要使用多IP的场景都会在负载均衡器上进行VIP绑定,而不是在Web上通过绑定IP区分不同的虚拟机。
三种虚拟主机类型均可独立使用,也可以互相混合一起使用,同学们应把基于域名的虚拟主机类型当作重点来学习掌握,其他的两个类型了解即可。

3.2 虚拟主机类型

5.2 基于域名的虚拟主机配置实战

说明:本节内容再生产场景中是最常用到的,因此,同学们要优先并且熟练掌握。

3.2.1 域名(应用层)

企业外网场景,通过不同的域名区分不同的虚拟主机,企业应用最广的类型

1.配置基于域名的nginx.conf内容

[root@web01 conf]# egrep -v '#|^$' nginx.conf.default >nginx.conf

[root@web01 conf]# cat nginx.conf
worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html;             
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

2.创建域名对应的站点目录即文件

mkdir -p /application/nginx/html/www -p
echo http://www.etiantian.org >/application/nginx/html/www/index.html

3.检查语法重新加载

/application/nginx/sbin/nginx -t
/application/nginx/sbin/nginx -s reload

4.最后测试配置的访问结果

echo “10.0.0.8 www.etiantian.org” >>/etc/hosts

注意:

  在windows客户端进行访问,如果域名没有做正是DNS解析,可在笔记本的hosts文件添加记录

5.2.1 配置基于域名的nginx.conf内容

这里使用grep过滤命令来生成基础的Nginx主配置文件nginx.conf,然后根据生成的初始配置进行修改,使其成为所需的形式,具体步骤为:

[root@localhost conf]# pwd
/application/nginx/conf
[root@localhost conf]# egrep -v "#|^$" nginx.conf.default >nginx.conf

或者干脆直接新创建配置文件nginx.conf,然后编辑,输入如下内容:

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
    }
}

编辑完配置文件后,我们需要检查语法

[root@localhost conf]# /application/nginx/sbin/nginx -t
nginx: the configuration file /application/nginx-1.10.2//conf/nginx.conf syntax is ok
nginx: configuration file /application/nginx-1.10.2//conf/nginx.conf test is successful

然后由于web的存放路径是相对路径,因此我们需要创建个目录,

图片 7

[root@localhost html]# cd /application/nginx/html/
[root@localhost html]# ls
50x.html  index.html            #原本的网页文件
[root@localhost html]# mkdir www   #创建一个目录叫做www
[root@localhost html]# echo "I am www" > www/index.html  #写入网页文件
[root@localhost html]# cat www/index.html   #查看一下
I am www
[root@localhost html]# curl 192.168.0.100  #测试链接
I am www

接下来,我们再创建一个域名的网站,配置文件如下

图片 8
注意:修改配置文件需要重启动nginx

给第二个网站添加网页文件

[root@localhost html]# ls
50x.html  index.html  www
[root@localhost html]# mkdir bbs
[root@localhost html]# echo "I am bbs" > bbs/index.html

通过测试,我们发现,永远都只能看到第一个网站

[root@localhost html]# curl 192.168.0.100
I am www
[root@localhost html]# curl 192.168.0.100
I am www
[root@localhost html]# curl 192.168.0.100
I am www
[root@localhost html]# curl 192.168.0.100
I am www

这是因为通过IP地址来访问的话,nginx并不知道你想要访问哪个站点,因此,他默认你是要访问他配置文件里的第一个站点,也就是www.chensiqi.com
通过修改hosts映射我们可以访问不同的站点。

修改hosts映射文件

[root@localhost html]# echo "192.168.0.100 www.chensiqi.com bbs.chensiqi.com" >> /etc/hosts
[root@localhost html]# tail -1 /etc/hosts
192.168.0.100 www.chensiqi.com bbs.chensiqi.com

现在我们再进行访问测试

[root@localhost html]# curl www.chensiqi.com
I am www
[root@localhost html]# curl www.chensiqi.com
I am www
[root@localhost html]# curl bbs.chensiqi.com
I am bbs
[root@localhost html]# curl bbs.chensiqi.com
I am bbs

如上所示:基于域名的虚拟主机配置完毕。我们在工作中遇到的基本都是这种类型的网站。配置过程需要重点练习。其他类型,了解即可。

3.2.2 端口(传输层)

  公司后台,测试场景,内部服务

  这类虚拟主机主要是针对企业内部网站,一些不希望直接对外提供用户访问的网站后台

注意:

  一般是先判断端口号,然后判断域名,如果端口对应上了,域名没有找见默认去找这个端口下的第一台主机(也就是第一个server标签)

[root@web01 conf]# cat nginx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  www.etiantian.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
   }
    server {
        listen       81;
        server_name  bbs.etiantian.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
   }
    server {
        listen       82;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
   }
}

检查

重启

访问

http://www.etiantian.org:80

http://bbs.etiantian.org:81

http://blog.etiantian.org:82

6 Nginx常用功能配置实战

3.2.3 IP(网络层)

网卡上增加IP

法一:

ip addr add 10.0.0.3/24 dev eth0 label eth0:3
ip addr add 10.0.0.4/24 dev eth0 label eth0:4

法二:

ifconfig eth0:0 10.0.0.101/24 up

查看结果:

[root@web01 conf]# ifconfig
eth0      Link encap:Ethernet  HWaddr 00:0C:29:98:47:1B 
          inet addr:10.0.0.8  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20c:29ff:fe98:471b/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:5611 errors:0 dropped:0 overruns:0 frame:0
          TX packets:3963 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2142583 (2.0 MiB)  TX bytes:579494 (565.9 KiB)
eth0:3    Link encap:Ethernet  HWaddr 00:0C:29:98:47:1B 
          inet addr:10.0.0.3  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
eth0:4    Link encap:Ethernet  HWaddr 00:0C:29:98:47:1B 
          inet addr:10.0.0.4  Bcast:0.0.0.0  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

[root@web01 conf]# cat nginx.conf.base_port

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       10.0.0.8:80;
        server_name  www.etiantian.org;
        location / {
            root   html/www;
            index  index.html index.htm;
        }
   }
    server {
        listen       10.0.0.3:81;
        server_name  bbs.etiantian.org;
        location / {
            root   html/bbs;
            index  index.html index.htm;
        }
   }
    server {
        listen       10.0.0.4:82;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
   }
}

6.1 规范化Nginx配置文件

下面是优化后的Nginx配置的实战方案

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include extra/www.conf;   #虚拟网站配置信息统一放在了当前的extra目录下
    include extra/mail.conf;
    include extra/status.conf;

}

[root@localhost nginx]# tree conf/extra/
conf/extra/
├── mail.conf
├── status.conf
└── www.conf

0 directories, 3 files
[root@localhost nginx]# cat conf/extra/www.conf 
    server {
        listen       80;
        server_name  www.yunjisuan.com;
        location / {
            root   /var/www/html/wwwcom;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   /var/www/html;
        }
    }

3.3 nginx状态信息功能

也就是新添加一个server标签打开stub_status on;,编译安装nginx的时候的参数--with-http_stub_status_module

[root@web01 extra]# cat extra/status.conf
    server {
        listen       80;
        server_name  status.etiantian.org;
        location / {
          stub_status on;
          access_log off;
        }
    }

检查语法,重启服务,配置hosts解析

 图片 9

第一个server表示nginx启动到现在共处理了多少个连接;

第二个accepts表示启动到现在共成功创建了多少多少次握手

第三个handled requests表示处理了多少次请求

reading为nginx读取到客户端的header信息数

writing为nginx返回给客户端的header信息数

waiting为nginx已经处理完正在等候下一次请求指令的驻留连接

6.2 Nginx状态信息功能实战

3.4 nginx访问日志

6.2.1 确认编译时是否设定了此模块

root@localhost nginx]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.10.2
built by gcc 4.4.7 20120313 (Red Hat 4.4.7-4) (GCC) 
built with OpenSSL 1.0.1e-fips 11 Feb 2013
TLS SNI support enabled
configure arguments: --user=www --group=www --prefix=/usr/local/nginx-1.10.2/ --with-http_stub_status_module --with-http_ssl_module

##说明
--with-http_stub_status_module模块就是状态信息模块

3.4.1 日志配置

[root@web01 conf]# cat >>/xxx/xxx/nginx/conf/extra/02_blog.conf<<EOF
    server {
        listen       80;
        server_name  blog.etiantian.org;
        location / {
            root   html/blog;
            index  index.html index.htm;
        }
        access_log  logs/access.log  [format buffer=size [flush=time]]  main;
   }
EOF

注意

       1. 这行配置中的main是http标签中配置的log_format后面的main对应的格式,可以多个格式,方便使用.

       2. 配置行的[]括号内的选项是可选的,配置缓存,防止高并发的大量IO

       3. format gzip[=level]

错误日志级别

default:error_log     logs/error.log      level;

         关键配置     日志文件             错误日志级别[debug|info|warn|error|alert|notice|crit|emerg]

生产场景一般用warn|error|crit三个级别

标签端的配置

  main,http,server,location

本文由金沙官网线上发布于操作系统,转载请注明出处:Linux实战教学笔记27:Nginx详细讲解

您可能还会对下面的文章感兴趣: