web server开发之nginx

概述

本篇开始,我们详细了解下Web Server(通常也代表http server),以及我们经常看到的,入nginx, tomcat, apache都是什么,都在什么场景下使用。

HTTP 服务的本质

HTTP服务器本质上也是一种应用程序——它通常运行在服务器之上,绑定服务器的IP地址并监听某一个tcp端口来接收并处理HTTP请求,这样客户端(一般来说是IE, Firefox,Chrome这样的浏览器)就能够通过HTTP协议来获取服务器上的网页(HTML格式)、文档(PDF格式)、音频(MP4格式)、视频(MOV格式)等等资源。下图描述的就是这一过程

不同的语言都有相关类库可以实现简单的HTTP 服务,如 NodeJs , Python, Java等,它们都能够通过绑定IP地址并监听tcp端口来提供HTTP服务。

Ngixn

Nginx是一款免费开源的高性能 HTTP 代理服务器及反向代理服务器(Reverse Proxy)产品,同时它还可以提供 IMAP/POP3 邮件代理服务等功能。他是由俄罗斯人Igor Sysoev设计开发的,开发工作从2002年开始,第一次公开发布在2004年10月4日。

特点:

  • 使用基于事件驱动架构,性能优秀,支持数以百万级别的 TCP 连接
  • 完全开源,第三方模块层出不穷(这是个开源的时代啊)
  • 跨平台,支持几乎所有常见操作系统

安装

使用yum进行安装(也可以使用源码编译安装,方法自行百度)

yum install nginx

常用操作:

service nginx start   # 启动Nginx服务

service nginx stop    # 停止Nginx服务

service nginx restart # 重启Nginx服务

service nginx status  # 查看Nginx运行状态

nginx -s reload       # 服务运行中重新加载配置

nginx -s reopen       #重启Nginx

nginx -s reload       #重新加载Nginx配置文件,然后以优雅的方式重启Nginx

nginx -s stop         #强制停止Nginx服务

nginx -s quit         #优雅地停止Nginx服务(即处理完所有请求后再停止服务)

nginx -?,-h           #打开帮助信息

nginx -v              #显示版本信息并退出

nginx -V              #显示版本和配置选项信息,然后退出

nginx -t              #检测配置文件是否有语法错误,然后退出

nginx -T              #检测配置文件是否有语法错误,转储并退出

nginx -q              #在检测配置文件期间屏蔽非错误信息

nginx -p prefix       #设置前缀路径(默认是:/usr/share/nginx/)nginx -c filename #设置配置文件(默认是:/etc/nginx/nginx.conf)

nginx -g directives   #设置配置文件外的全局指令

killall nginx         #杀死所有nginx进程

使用

正向代理

平常使用FQ软件访问Google,Facebook时的过程就是正常代理:客户端请求代理服务器(节点)去访问目标站点,代理服务器将请求到的内容返给客户端。

正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息

Webpack-dev-server的proxy用法就属于正向代理模式。

反向代理

多个客户端给服务器发送的请求,nginx服务器接收到之后,按照一定的规则分发给了后端的业务处理服务器进行处理了。此时请求的来源也就是客户端是明确的,但是请求具体由哪台服务器处理的并不明确了,nginx扮演的就是一个反向代理角色

一个更通俗的例子就是拨打10086客服,客服总台会将闲置的客服转接给你,客服总台扮演的就是一个反向代理角色。

下面要讲到的负载均衡也是一个反向代理模式。

负载均衡

将一个应用部署在多台服务器上时,就需要将用户请求进行合理分配,分配到不同的机器进行运行,同时也能保证万一有服务器宕机,其他服务器还可以正常运行,就不会影响用户使用。

Nginx可以通过反向代理来实现负载均衡:

upstream myweb {
  server 192.168.0.111:8080; # 应用服务器1
  server 192.168.0.112:8080; # 应用服务器2
}
server {
  listen 80;
  location / {
    proxy_pass http://myweb;
  }
}

虚拟主机

对于多个服务部署在一台机器上的时候,我们也可以使用nginx配置虚拟主机,用户通过不同的域名打开不同的服务,就像在访问不同的服务器,

譬如,将www.a.com 代理到本地3000端口,将admin.a.com 代理到本地4000端口(需要确保两个域名都能解析到同一台机器上)

  server {
      listen       80;
      server_name  www.a.com;
      location / {
        proxy_pass http://localhost:4001; # 对应端口号4001
      }
  }
  server {
      listen       80;
      server_name  admin.a.com;
      location / {
        proxy_pass http://localhost:4002; # 对应端口号4002
      }
  }

本人的主站就是通过这种方式进行部署(ps:如果该端口已经被其他服务占用,启动nginx会报错)

Apache & Tomcat

Apache,全称为:Apache HTTP Server Project,是Apache软件基金会下的一个项目;由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件。上世纪就已经开始作为HTTP服务开始大规模运行了。

Tomcat是应用(Java)服务器,它只是一个Servlet(JSP也翻译成Servlet)容器,可以认为是Apache的扩展,但是可以独立于Apache运行。

Nginx VS Apache

  • Nginx 配置简洁, Apache 复杂;
  • Nginx 静态处理性能比 Apache 高 3倍以上;
  • Apache 对 PHP 支持比较简单,Nginx 需要配合其他后端用;
  • Apache 的组件比 Nginx 多;
  • Apache是同步多进程模型,一个连接对应一个进程;nginx是异步的,多个连接(万级别)可以对应一个进程;
  • Nginx处理静态文件好,耗费内存少;动态请求由apache去做,nginx只适合静态和反向;
  • Nginx适合做前端服务器,负载性能很好;
  • Nginx本身就是一个反向代理服务器 ,且支持负载均衡

补充:开源许可证

参考