Skip to content

Web服务器

Web服务器(Web Server)指的是用于支持**万维网(World Wide Web, WWW)*的服务器,也称为*HTTP服务器。它的主要功能是为网络信息浏览提供服务。

特点

  • Web服务器是一种被动访问的服务程序: 只有在接收到互联网中其他主机发出的请求后,Web服务器才会响应并处理该请求。
  • Web服务器通过HTTPHTTPS协议将请求内容返回给客户端(如浏览器)。
  • 客户端通过URL向服务器请求资源,服务器则根据请求提供静态资源(如HTML文件)或动态内容(通过后端脚本生成)。

以下是几种常见的Web服务器软件

  • Apache
  • Nginx
  • Lighttpd
  • Tomcat
  • IBM WebSphere

在线自动生成Nginx配置文件

https://www.digitalocean.com/community/tools/nginx?global.app.lang=zhCN

生成的nginx配置可以作为参考,贼好用

啥是Nginx

image-20241209171756975

Nginx是由俄罗斯工程师Igor Sysoev开发的一款高性能的HTTP和反向代理服务器

Nginx的特点:

  • 高效的网络IO模型

    • Nginx采用高效的事件驱动机制,如epoll(Linux)、kqueue(FreeBSD)和eventport(Solaris)。

    • 这种架构使其在高并发场景下表现出色。

  • 卓越的性能

    • 在默认配置下,Nginx可以轻松支持5万并发连接,并消耗极少的系统资源(内存和CPU)。

    • 通过硬件优化、Linux内核调整以及Nginx配置参数的优化,甚至可以实现百万级并发连接的支持。

  • 稳定性

    • Nginx以其稳定性著称,即使在高负载下运行也能保持流畅和可靠。

Nginx的核心功能:

  • Web服务器

    • 提供静态内容的托管(如HTML、CSS、JavaScript文件)。

    • 支持动态内容的代理(如与后端应用程序配合使用)。

  • 反向代理服务器

    • 用于分发请求到后端服务器,起到负载均衡的作用。

    • 提供缓存功能,减少后端服务器的压力并提高访问速度。

企业用Nginx都干啥

  • 提供静态页面展示和网页服务

    • 用于托管和快速分发静态资源文件(如HTML、CSS、JavaScript、图片等)。

    • 以高效的性能支持大规模访问。

  • 支持多个网站和多个域名的服务

    • Nginx支持虚拟主机功能,可以通过同一台服务器为多个域名或网站提供服务。

    • 适用于多站点托管需求。

  • 反向代理和动态应用支持

    • 通过反向代理将请求分发到后端应用服务器(如Java、PHP、Node.js等),实现动态内容的访问。

    • 提供负载均衡,优化后端服务器性能和资源利用。

  • 文件下载和认证服务

    • 配置Nginx作为文件下载服务,支持简单的身份认证(如密码保护)。
    • 可用作轻量级的FTP替代方案。
  • 用户行为分析(日志功能)

    • Nginx记录详细的访问日志,包括访问时间、IP地址、请求路径、用户代理等。

    • 企业可以基于这些日志进行用户行为分析和性能优化。

Nginx工作流程架构

Nginx是一个多进程架构,在启动后,它会创建一个Master进程,然后由Master进程进一步创建多个Worker进程

  1. Master进程:
    • 负责管理整个Nginx实例,包括加载配置、创建和终止Worker进程等。
    • 不直接处理客户端请求,只是起到管理和分发的作用。
  2. Worker进程:
    • 负责实际处理客户端请求
    • 每个Worker进程都可以独立地接收并响应HTTP请求。
    • 通常每个Worker进程会绑定到一个CPU核心上,充分利用多核资源。
bash
[root@iZ2zej10jlnefk7va4ms59Z ~]# ps -ef |grep nginx | grep -v grep
root     21487     1  0 May18 ?        00:00:00 nginx: master process nginx
root     26872 21487  0 May26 ?        00:00:30 nginx: worker process

image-20241210181255316

Master主进程

在Nginx架构中,Master进程充当“包工头”,主要负责对整个Nginx实例进行管理和协调。Master进程并不直接处理客户端请求,而是负责启动、监控、分配和管理所有Worker进程。

Master进程主要作用:

  • 验证配置文件:

    • 启动时会检查配置文件(nginx.conf)的语法是否正确。

    • 如果配置文件存在错误,Master进程会报错并终止启动。

  • 创建和监控Worker进程:

  • 根据配置文件中的参数,Master进程创建多个Worker进程。

  • 实时监控Worker进程的数量、状态及健康情况。

  • 监听Socket并分发请求:

    • Master进程监听客户端发起的Socket请求。

    • 当有请求到达时,Master会将请求分发给Worker进程。

    • Worker进程之间会进行**竞争连接的“抢夺”,**获胜的Worker会负责处理并响应请求。

  • 处理管理信号:

  • Master进程可以接收运维人员发送的管理信号(如:stopreload)。

  • 将接收到的信号分发给Worker进程,从而实现对Worker进程的控制。

  • 平滑重载配置:

    • 当运维人员发送reload命令时:
      • Master进程会重新加载最新的配置文件。
      • 它会创建新的Worker进程,同时优雅地终止旧的Worker进程,从而实现零中断配置更新

Worker工作进程

image-20241210181422486

Worker进程(Worker Process)——“实际操作工人”,在Nginx架构中,Worker进程负责真正处理客户端请求,它是Nginx中实际进行数据传输、请求响应的核心部分。每个Worker进程都可以独立地接收、处理并响应客户端的请求。

Worker进程主要作用:

  • 处理客户端请求

    • Worker进程是Nginx的核心工作单元,直接与客户端交互

    • 它处理来自客户端的HTTP请求、TCP连接等。

    • 在处理请求时,它可以访问静态资源、反向代理到其他后端服务器、执行动态内容解析等

  • 异步非阻塞IO操作

    • 基于异步、非阻塞IO模型(如:epoll、kqueue等),Worker可以高效地处理大量并发请求。

    • 当有多个请求同时到达时,Worker进程可以在等待数据的同时继续处理其他任务,从而实现高并发处理。

  • 与Master进程交互

    • Master进程分配请求给Worker进程,而Worker进程通常会竞争连接。

    • 如果Worker进程之间竞争失败,会由其他Worker继续处理。

    • Master进程负责监控Worker的健康状态,如果发现Worker异常,Master可以重新创建Worker进程。

  • 数据转发与反向代理

  • 当Nginx配置为反向代理服务器时,Worker会将请求转发到后端服务器。

  • 它还可以实现负载均衡,将请求分布到多个后端节点,提高可用性。

  • 缓存和优化

  • Worker进程可以对资源进行缓存(如:文件缓存、反向代理缓存)

  • 它还能执行请求的数据压缩、加密、访问控制等操作。

Nginx处理http请求

image-20241212093447120image-20241210182304709

Nginx的安装形式

三种形式;

  • 源代码编译安装

    • 优点:
      • 可以自由定义版本
        • 可以在官网获取稳定版本,最新版本,甚至测试版本的软件包安装
      • 可以自由定义安装路径
      • 可以自由定义第三方插件
    • 缺点:
      • 麻烦,耗时长
      • 如果自定义第三方插件,时间会更长
  • rmp安装:一般用于离线的安装环境(不常用)

    • 缺点:需要提前准备好nginx的rmp包,以及所需依赖的rpm包
  • yum安装,有几种形式的仓库可供使用

    • nginx官网仓库(用这个)
    • 第三方仓库,如阿里云
    • 自建的yum仓库

https://juejin.cn/post/6986190222241464350 这安装教程,现成的

Nginx管理进程命令

  • nginx:启动nginx,如果已经启动了,这命令会报错,如下图

    • image-20241212103216543
  • nginx -s reload:给master进程发信息,重新读取配置文件,因此worker进程会重新生成,worker的pid也会发生变化,但master进程的pid不会变,如下图

    • image-20241212103804454
  • nginx -s stop:停止nginx服务

Nginx配置文件详解

bash
cat /opt/homebrew/etc/nginx/nginx.conf

image-20241212105635710

image-20241212110322415

基于Nginx部署一个网站

单虚拟主机

在nginx服务器上只托管一个网站

只需要在配置文件的http{}中配置一个server{}即可

  1. nginx.conf配置文件中导入我们自己添加的配置文件

    bash
    worker_processes  1;      # 默认用户
    
    events {
        worker_connections  1024;
    }
    
    
    http {
        include       mime.types;
        default_type  application/octet-stream;
    
        sendfile        on;
    
        keepalive_timeout  65;
    
    
        server {
            listen       8080;
            server_name  localhost;
    
            location / {
                root   html;
                index  index.html index.htm;
            }
    
            error_page   500 502 503 504  /50x.html;
            location = /50x.html {
                root   html;
            }
    
        include servers/*;
        
        include /etc/nginx/conf.d/*.conf # include 导入该目录下的*.conf配置文件
    }
  2. 创建虚拟主机子配置文件

bash
# ip : huoying.linux0224.cc
# 把数据放在 /www/huoying/index.html

vim /etc/nginx/conf.d/huoying.linux0224.conf 

# 写入如下信息

server{

	listen 80;
	# nginx 会匹配 http://huoying.linux0224.cc:80
	server_name huoying.linux0224.cc;
	
	location / {
			# 根据root参数,填写网页根目录信息
			# 表示当你访问 http://huoying.linux0224.cc:80, 会自动来这个目录下找数据
			root /www/huoying/;
			# 默认找 /www/huoying/ 的名字叫做index.html的文件
			index index.html
	}

}

外界大脑的配置文件dahong.conf

bash

server{
    listen 80;
    server_name localhost;       # server的名字,可以是域名,也可以是IP      
    gzip on;
    gzip_static on;
    gzip_min_length 1k;
    gzip_vary on;
    gzip_proxied any;
    gzip_comp_level 2;
    gzip_buffers 4 16k;
    gzip_http_version 1.1;
    gzip_disable "MSIE [1-6]\.";
    gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript image/jpeg image/gif image/png image/svg+xml;
    add_header Cache-Control "max-age=31536000,immutable";
    location / {
        try_files $uri $uri/ @rewrites;
        root  /hongBrain/dist;     # 根据root信息填写的网络根目录信息,默认找这里的index.html文件 
        index index.html;
        autoindex on;
    }
    location @rewrites {
        rewrite ^.*$ /index.html last;
    }
}