Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Posted 秃头A计划

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机相关的知识,希望对你有一定的参考价值。

nginx+lua+openresty系列将围绕基础概念和常用功能分享给各位看官,包括nginx的虚拟主机使用、反向代理、负责均衡策略配置和nginx的缓存使用,还有openresty基于lua在nginx上的各种开发等。



简单的介绍了一些概念和开发前的装备,想必读者已经迫不及待的想要使用了。我们知道openresty柔和了nginx和lua,所以我需要先了解下nginx都有哪些东西。当然读者也可以直接上手使用lua去实现些小案例(我之前这么做的结果是:一路基本都是懵逼状态。。。断层严重,语法不清楚,语义不知何意,只能不断尝试,所以很是浪费时间,建议循序渐进



今天我们就了解下nginx的虚拟主机配置,还是按照老套路,我们首先要知道什么是虚拟主机,能干啥用,怎么用。


一.什么是虚拟主机


如今计算机已经是家中必备的产品,而计算机可以整体划分为两类:一类是客户机,就是家中的台式电脑、办公室的笔记本电脑;另一类是服务于众多客户机,提供网络资源的计算机,称为服务器。因为服务器需要7*24小时不间断工作,所以技术和性能要求就和客户机不是一个层级的,故而购买服务器的成本也是非常高昂。

早期的时候,技术还不够成熟,一台服务器只能服务一个网站,对于那些刚起步的或者中小企业来说,购买服务器那确实得下血本。所以随着技术的发展,虚拟主机就诞生了。


首先看下官方说法:

虚拟主机是指在网络服务器上分出一定的磁盘空间,用户可以租用此部分空间,以供用户放置站点及应用组件,提供必要的数据存放和传输功能。



前面提到一台服务器价格很高,于是乎人们就想到能不能多个用户共用一台服务器呢?相互之间互不干扰,共享一台主机的所有资源。虚拟主机做到了,通过先进的软硬件技术,用户可以租用同一台服务器的不同存储空间,且可以拥有独立的ip和域名。虚拟主机又叫网络空间,把一台主机切割成不同的独立小空间,具有完整的Internet上网功能。

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机


对于用户来说,我使用的就是一台真实的主机,感觉不到还有其他用户在这个主机之上。这样,主机的资源就能得到充分的利用,一台主机可以租出去很多虚拟主机,所以虚拟主机的价格就远远低于一台服务器的价格了,对于中小网站来说不得不说是一个福音。虚拟主机完成了一机变多机的重大升级。

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

虚拟主机的优势很明显,那就是费用低廉,因为虚拟主机一般都是默认有建站环境的,所以建立网站简单快速。但是不足是,共享同一个主机的带宽,可能会影响用户体验,而且使用的是一台主机,万一宕机,则很多用户要受牵连。所以后面又有了VPS主机和云服务器,这里就不再详述这三者的区别,有兴趣的读者可以了解一下。


二.虚拟主机的作用


  1. 对虚拟主机提供者来说,极大的利用资源,压榨服务器到极致

  2. 对虚拟机使用者来说,成本降低,不用维护巨额的服务器

  3. 可以提供更多的服务器资源供消费者使用




三.如何一机变多机


Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

nginx跟apache服务器一样,可以配置多种类型的虚拟主机:

  1. 基于IP

  2. 基于域名 最常用

  3. 基于端口




首先需要搞懂配置文件

上篇文章我们简单启动了nginx并看到了欢迎页面,还使用了nginx.conf配置文件。既然nginx是C语言开发的,那么一般开发者都是怎么使用的呢?答案就是这个配置文件。该配置文件包揽了几乎所有你能见到的功能,除了 nginx的模块开发,当然这玩意一般人也不会接触到。

所以nginx.conf 可以说是整个nginx的核心了,它通过短小精悍的语法,可以让开发者定制一些常用功能。我们先来看下这个配置文件的内容,然后再详细完成三种虚拟主机的配置方案。


把openresty安装目录下的conf文件夹下的nginx.conf文件打开可以看到下面的一段代码,


  1. #user  nobody;

  2. #工作线程数量,一般设置为CPU数量

  3. worker_processes  1;

  #错误日志存储位置

  1. #error_log  logs/error.log;

  2. #设置日志的打印级别  info notice error等

  3. #error_log  logs/error.log  notice;

  4. #error_log  logs/error.log  info;


  5. #pid        logs/nginx.pid; #设置nginx的进程id



  6. events {

  7.    #允许客户端最大练接数量

  8.    worker_connections  1024;

  9. }



  10. http {

  11.   #加载 mime.types文件

  12.    include       mime.types;

  13.    #默认的HTTP 响应头形式

  14.    default_type  application/octet-stream;

  15.    #日志格式

  16.    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '

  17.    #                  '$status $body_bytes_sent "$http_referer" '

  18.    #                  '"$http_user_agent" "$http_x_forwarded_for"';

      #记录每个请求的存储日志

  1.    #access_log  logs/access.log  main;


  2.    sendfile        on;

  3.    #tcp_nopush     on;


  4.    #keepalive_timeout  0;#保持的连接时长

  5.    keepalive_timeout  65;


  6.    #gzip  on;#是否开启压缩模式


  7.    server {

  8.        listen       80;#监听端口

  9.        server_name  localhost;#虚拟主机名称


  10.        #charset koi8-r;#字符集


  11.        #access_log  logs/host.access.log  main;

  12.        #请求匹配路径

  13.        location / {

  14. #目录资源位置 这里是相对路径,相对于nginx.conf

  15.            root   html;

  16.            index  index.html index.htm;  #展示页面

  17.        }

  18.        #404错误响应页面

  19.        #error_page  404              /404.html;


  20.        # redirect server error pages to the static page /50x.html

  21.        #对应响应状态码时的响应页面

  22.        error_page   500 502 503 504  /50x.html;

  23.        location = /50x.html {

  24.            root   html;

  25.        }


  26.    }

  27. #下面的注释已删除


  28. }



配置文件的内容比较简单,初识肯定很陌生,看着别扭,熟悉了就好多了,大部分的常用配置都已经注释好了,看官多熟悉几遍哦。


然后我们分析下nginx的配置文件的组成。

  1. 主干部分:主要配置全局的东西,比如工作进程,错误日志等

  2. events部分:可配置客户端连接数和nginx使用模型,比如epoll

  3. http部分:这里是主要进行HTTP请求拦截控制的地方

  4.   主干:对HTTP请求的全局设置

       3.1server部分:

            主干:设置监听端口、字符集和server部分的全局设置等

            location:设置请求路径,请求资源和请求控制


Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

配置文件结构如上图所示。还是比较简洁的,events基本不需要定制,配置非常少,主要还是HTTP部分的server块。


虚拟主机实战

配置文件了解以后,如何将虚拟主机和nginx联系起来呢?我们都已经了解到虚拟主机其实是对一台主机的多个划分,从而可供多个用户使用。在我的理解层面,nginx并不是用于如何去将一个主机分成多个虚拟主机然后卖给客户,它主要是面对开发者,让开发者充分利用我们的服务器资源,尽可能的节约成本的。怎么做呢?比如开发者的企业有两个网站,规模也不大,完全可以用一台服务器运行这两个网站,而不是购买两台服务器。



3.1 基于域名的虚拟主机


我们把默认的nginx.conf内容重新拷贝下,然后把注释的内容都删掉。注释是 # 号开头的,然后开启debug日志。日志在openresty根目录下的/logs文件夹下,启动之后就能看到error.log日志文件

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

我们按照上面这个配置文件启动,发现启动不了

nginx: [emerg] CreateFile() "./workspace/conf/mime.types" failed (2: The system cannot find the file specified) in ./workspace/conf/nginx.conf:7
这就是上篇文章中首次启动为何要删除 http内的第一行include的原因了。include是加载文件的意思,它要把mime.types文件加载到nginx,但是我们项目中又没有,所以就报错了。可以把这行删掉,也可以把openresty/conf/mime.types 拷贝到项目中和nginx.conf平级目录。



然后我们在启动,就应该没问题了。这里我们再演示下error_page和下面的location ,为了配置文件更简洁,我们搞明白了这个然后就把这段配置删了

--

首先,启动nginx,打开localhost,默认会返回openresty的欢迎页面。然后我们分别访问  localhost/index.html  和  localhost/50x.html。会出现两个页面,一个是欢迎页和错误页面。这是直接访问了服务器的内部资源,所以nginx也可以作为资源服务器

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

--

首先我写一个会报500的错误的配置,其他不变,也不用关心为什么会报500错误,只看结果即可

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

然后重新启动nginx,再次访问localhost,你会发现出现的不是欢迎页面,而是一个错误页面,也就是openresty/html/50x.html中的内容。所以error_page的作用就是当出现后面的HTTP响应状态码时,nginx自动跳转/50x.html路径,然后匹配到location中的/50x.html,并去html目录中查询50x.html是否存在,存在则展示,否则报错。


我们把error_page后面的都删掉,再重启下nginx,发现500错误,因为没有配置错误页面,所以没有跳转到错误页面且展示并不友好

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

我们把这段代码删除,配置文件看起来更加简洁了,真正的线上环境我们肯定要加上这段配置,错误页面可以更加人性化,让用户体验更好。这里我们就删掉,没什么影响



我们回到如何配置域名虚拟主机上来。我们看server这段配置,监听端口是80,location的路径是 / ,所以当我们访问localhost时,匹配的正好是端口80和根路径/。

server代表什么呢?它就可以作为一个虚拟主机,我们刚刚的配置其实就是一个虚拟主机了。什么?就这么简单吗?对,就是如此简单。访问localhost就相当于我们访问其他网站,不同的是其他网站的页面很是丰富,图文并茂,然而我们的localhost只是一个简陋的欢迎页。但是性质是一样的,都是通过网站,获取到了资源。


所以配置多个虚拟主机也就相当简单了,多配置几个server代码块

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

如上图,为了演示方便,我们使用echo命令输出文本,并改变了响应头为text/html,这样浏览器就可以解析echo的输出。三台虚拟主机分别是server1.test.com,server2.test.com,server3.test.com,分别代表三个网站,真正的线上情况访问这些网站肯定要返回首页的,这里演示就直接输出一段简短的文本用于提示。




127.0.0.1 server1.test.com

127.0.0.1 server2.test.com

127.0.0.1 server3.test.com



启动nginx,分别访问这个三个域名,会得到不同的结果

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

这样,简单的虚拟主机就配置好了,你可以在一台主机上创建多个网站,充分利用主机的资源,从而降低成本,也方便维护。如果不通过nginx(或其他软件比如apache服务器)想让一台主机运行多个网站几乎是不可能的,像tomcat这样的服务器只能监听80端口,并不能监听域名+端口




Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

三个ip分别是:

192.168.1.1

192.168.199.1

10.103.11.16 

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

或者这么配置

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

nginx: [emerg] bind() to 192.168.1.2:80 failed (10049: The requested address is not valid in its context)



3.3 基于端口配置虚拟主机


基于端口配置也比较简单,只需要配置不同的端口即可

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机

 

然后我们访问不同的端口,即得到不同的结果

Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机




至此,三种配置方式都已经配置完毕了。这里小结一下:

后续我们将介绍反向代理的使用。



本文如有瑕疵错误,欢迎指正!



以上是关于Nginx+lua+openresty系列 | 第二篇:nginx虚拟主机的主要内容,如果未能解决你的问题,请参考以下文章

高并发 Nginx+Lua OpenResty系列——Lua模版渲染

高并发 Nginx+Lua OpenResty系列——Lua模版渲染

Nginx+lua+openresty系列 | 第三篇:nginx反向代理

高并发 Nginx+Lua OpenResty系列——HTTP服务

高并发 Nginx+Lua OpenResty系列——HTTP服务

高并发 Nginx+Lua OpenResty系列(10)——商品详情页