什么是web服务器?

什么是web服务器?

2023年08月14日 阅读:13 字数:2918 阅读时长:6 分钟

了解 web 服务器,明白大概的工作原理,对比分析几种 web 服务器,再深入探索下Nginx的应用。

1.前言

从软件方面来讲web 服务器包括控制网络用户如何访问托管文件的几个部分,至少是一台 HTTP 服务器。一台 HTTP 服务器是一种能够理解 URL(网络地址)和 HTTP(浏览器用来查看网页的协议)的软件。一个 HTTP 服务器可以通过它所存储的网站域名进行访问,并将这些托管网站的内容传递给最终用户的设备。

50e5e9624f2d629f.png

静态 web 服务器(static web server)由一个计算机(硬件)和一个 HTTP 服务器(软件)组成。我们称它为“静态”是因为这个服务器把它托管文件的“保持原样”地传送到你的浏览器。

动态 web 服务器(dynamic web server)由一个静态的网络服务器加上额外的软件组成,最普遍的是一个应用服务器和一个数据库。我们称它为“动态”是因为这个应用服务器会在通过 HTTP 服务器把托管文件传送到你的浏览器之前会对这些托管文件进行更新。

2.Apache

81e66350254d2b19.jpg

简介:Apache HTTP Server(简称 Apache)是世界上最流行的 Web 服务器软件之一,由 Apache 软件基金会开发和维护。它是一个强大而稳定的服务器软件。

突出特性:Apache 提供了广泛的功能和模块化的架构,支持多种操作系统。其特性包括可靠性、扩展性、灵活的配置选项、支持各种编程语言和脚本、良好的安全性等。Apache 可以用于托管静态和动态内容、运行脚本、处理 SSL 加密、提供虚拟主机等功能。

性能:Apache 在处理静态内容时通常表现良好,但相对于 Nginx 和其他一些较轻量级的服务器软件来说,其性能可能稍逊一筹。在处理动态内容时,Apache 可能需要更多的资源和内存,因此在高负载环境下可能会略有性能下降。

3.Apache Tomcat

3f1f46a556fe3067.png

简介:Apache Tomcat(简称 Tomcat)是一个开源的 Java Servlet 容器和 JSP 引擎,由 Apache 软件基金会开发和维护。它提供了一个运行 Java Web 应用程序的环境。

突出特性:Tomcat 的主要特性包括对 Java Servlet 和 JSP 规范的完全支持、轻量级、可嵌入性、易于部署和管理、良好的性能和可扩展性等。Tomcat 可以用于托管 Java Web 应用程序,支持 Java 技术栈的开发和部署。

性能:Tomcat 主要用于托管 Java Web 应用程序,它在处理 Java Servlet 和 JSP 方面表现出色。Tomcat 在处理动态内容时的性能通常很好,但在处理静态内容时可能略逊于专门用于静态内容传送的服务器软件。

4.IIS

d00a984548fc0d2a.png

简介:IIS (Internet Information Services) 是由 Microsoft 开发的 Web 服务器软件,用于托管和管理网站和应用程序。它作为 Windows 操作系统的一部分提供。

突出特性:IIS 具有易用性、集成性、安全性和可扩展性等特点。它支持多种协议、身份验证方式和扩展模块,具有丰富的安全功能和管理工具,适用于在 Windows 环境中快速构建和运行 Web 应用程序。

性能:IIS 在 Windows 环境下提供稳定且可扩展的性能,并且在处理静态和动态内容时都具有良好的表现。IIS 在与 ASP.NET 结合使用时,能够提供高度优化和快速的性能。

5.Node.js

2d787db1f92a7ee5.png

Node(正式名称 Node.js)是一个开源的、跨平台的运行时环境,有了它,开发人员可以使用 JavaScript 创建各种服务器端工具和应用程序。此运行时主要用于浏览器上下文之外(即可以直接运行于计算机或服务器操作系统上)。据此,该环境省略了一些浏览器专用的 JavaScript API,同时添加了对更传统的 OS API(比如 HTTP 库和文件系统库)的支持。

突出特性:

  • 卓越的性能表现!Node 为优化 web 应用的吞吐量和扩展度而生,对常见的 web 开发问题是一套绝佳方案(比如实时 web 应用)。
  • 代码还是熟悉的老伙伴 JavaScript,这意味着在客户端和服务器端“上下文切换”的时间成本更低。
  • Node 包管理工具(node package manager,NPM)提供了数十万个可重用的工具包。它还提供了一流的依赖解决方案,可实现自动化工具链构建。
  • Node.js 是可移植的,可运行于 Microsoft Windows、macOS、Linux、Solaris、FreeBSD、OpenBSD、WebOS 和 NonStop OS。此外,许多 web 主机供应商对其提供了良好支持。
// 调用 HTTP 模块
const http = require("http");

// 创建 HTTP 服务器并监听 8000 端口的所有请求
http
  .createServer((request, response) => {
    // 用 HTTP 状态码和内容类型来设定 HTTP 响应头
    response.writeHead(200, { "Content-Type": "text/plain" });

    // 发送响应体 "Hello World"
    response.end("Hello World\n");
  })
  .listen(8000);

// 在控制台打印访问服务器的 URL
console.log("服务器运行于 http://127.0.0.1:8000/");

6.Nginx

0f179f20c915060e.png

6.1.简介

简介:Nginx 是一款高性能的开源反向代理服务器和 Web 服务器软件。它设计简洁、轻量级,并且能够处理大量并发连接。

突出特性:Nginx 的关键特性包括高性能、低内存消耗、事件驱动的架构、强大的反向代理和负载均衡功能、支持热部署和动态模块加载、灵活的配置选项、高度可定制性等。Nginx 通常用于静态内容的快速传送、反向代理、负载均衡和高并发环境下的 Web 服务器。

性能:对于静态内容的传送,Nginx 在高负载情况下表现出色,在某些基准测试中可以处理数百万个并发连接。在动态内容方面,Nginx 可以通过与后端应用服务器(如 PHP-FPM、uWSGI 等)结合,提供快速和可靠的性能。

6.2.代理请求

6.2.1.正向代理

正向代理(Forward Proxy): 正向代理是位于客户端和目标服务器之间的代理服务器。当客户端请求访问某个资源时,请求首先发送到正向代理服务器,然后由代理服务器转发请求给目标服务器,并将目标服务器的响应返回给客户端。对于客户端来说,它只知道代理服务器的存在,而不知道真实的目标服务器。

正向代理的主要作用包括:

  • 访问互联网:在某些网络环境中,客户端无法直接访问互联网,这时可以通过正向代理服务器来访问特定的资源。
  • 资源缓存:正向代理服务器可以缓存常用的网页、图片等资源,提高访问速度并减轻目标服务器的负载。
  • 安全与隐私:通过正向代理,可以隐藏客户端的真实IP地址,提供匿名访问和保护隐私的功能。

6.2.2.反向代理

反向代理(Reverse Proxy): 反向代理是位于目标服务器和客户端之间的代理服务器。当客户端发送请求访问某个资源时,请求首先到达反向代理服务器,代理服务器会根据配置将请求转发给后端的目标服务器,并将目标服务器返回的响应发送给客户端。对于客户端来说,它只与反向代理服务器进行通信,不直接与目标服务器交互。

反向代理的主要作用包括:

  • 负载均衡:反向代理可以将请求分发给多个后端服务器,平衡服务器的负载,提高系统的可用性和性能。
  • 安全性:反向代理可以充当防火墙,保护后端服务器免受恶意请求和攻击。
  • 缓存和静态内容服务:反向代理可以缓存常用的静态内容,减少对后端服务器的请求,提高访问速度。
# nginx.conf
server {
  location /api {
    rewrite  /api/(.*)$  /$1  break;
    proxy_pass http://127.0.0.1:8360;
    proxy_send_timeout    600;
    proxy_read_timeout    600;
    proxy_set_header Host $host;
    proxy_set_header X-real-ip $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  }
}

webSocket反代

# nginx.conf
server {
  location /ws {
    proxy_pass http://127.0.0.1:8360;
    proxy_read_timeout 12h;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
  }
}

6.3.负载均衡

负载均衡是将请求分发到多个服务器上,以平衡每个服务器的负载,确保资源的合理利用,提高系统的可用性、性能和可扩展性。

负载均衡算法有多种选择,常见的包括:

6.3.1.轮询

轮询(Round Robin):它是upstream模块默认的负载均衡默认策略,依次将请求分发给每个服务器。

此策略适合服务器配置相当,无状态的服务使用。

upstream CDNServer {
  server cdn1.timelessq.com;
  server cdn2.timelessq.com;
}

6.3.2.least_conn

最小连接数(Least Connections):将请求发送到当前连接数最少的服务器。

此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

upstream CDNServer {
  least_conn;  #把请求转发给连接数较少的后端服务器
  server cdn1.timelessq.com;
  server cdn2.timelessq.com;
}

6.3.3.ip_hash

IP哈希(IP Hash):根据客户端的IP地址计算哈希值,将请求发送到对应的服务器。

这个方法确保了相同的客户端的请求一直发送到相同的服务器,以保证session会话。

upstream CDNServer {
  ip_hash;  #保证每个访客固定访问一个后端服务器
  server cdn1.timelessq.com;
  server cdn2.timelessq.com;
}

6.3.4.weight

加权轮询(Weighted Round Robin):根据服务器的权重分配请求。

weight的默认值为1,weight的数值与访问比率成正比,权重越高分配到需要处理的请求越多。适用于服务器配置差异大的情况。

upstream CDNServer {
  server cdn1.timelessq.com  weight=2; #这台服务器好,权重设置更大
  server cdn2.timelessq.com;
}

6.4.性能调优

6.4.1.Worker进程

worker_processes表示工作进程的数量,一般情况设置成CPU核的数量即可。

可以使用grep -c processor /proc/cpuinfo命令查看CPU核数

[root@localhost ~]# grep -c processor /proc/cpuinfo
2

worker_processes 这个参数最好是设置成 auto 自动匹配进程数。

# nginx.conf
worker_processes  auto;

6.4.2.进程连接数

worker_connections:单个工作进程(worker)可以允许同时建立外部连接的数量,根据系统的最大打开文件数来调整,worker_connections进程连接数量要小于等于系统的最大打开文件数。

比如: 用ulimit -a|grep "open files"命令查看系统的最大打开文件数是65535

events {
   # 单个进程允许的客户端最大连接数(65535/2)
   worker_connections 32000;
}

6.4.3.gzip压缩

http {
  #开启gzip
  gzip  on;
  gzip_static  on;
  #低于1kb的资源不压缩
  gzip_min_length 1k;
  #压缩级别1-9,越大压缩率越高,同时消耗cpu资源也越多,建议设置在5左右。
  gzip_comp_level 5;
  #需要压缩哪些响应类型的资源,多个空格隔开。不建议压缩图片.
  gzip_types text/plain text/html text/javascript text/xml text/css application/javascript application/x-javascript application/json application/octet-stream font/ttf image/svg+xml;
  #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
  gzip_disable "MSIE [1-6]\.";
  #是否添加“Vary: Accept-Encoding”响应头
  gzip_vary on;
}

 

 

还没写完~

 

参考文档:

推荐阅读

恰饭区

评论区 (0)

0/500

还没有评论,快来抢第一吧