Nginx 服务器

文章目录

一、什么是 Nginx?

Nginx 是一个开源的、高性能的 HTTP 和反向代理服务器,同时也提供了 IMAP/POP3/SMTP 服务。

开发者:由俄罗斯程序员 Igor Sysoev 开发,最初是为了解决 C10k 问题(即同时处理 10,000 个并发连接)。

核心特点:由 C 语言编写,专注于性能优化。它采用事件驱动(Event-driven)、异步非阻塞的架构。

地位:许多全球访问量巨大的网站(如 Netflix、Airbnb、GitHub、百度、腾讯等)都在使用 Nginx。

Nginx最重要的特征包括高性能、高并发和低资源占用。除此之外,Nginx还有其他功能,比如反向代理负载均衡缓存、访问控制等等,Nginx也可以作为复杂的Web应用的基础架构。

Nginx采用了事件驱动模型,每个连接不再会占据一个进程/线程的资源,一般来说只会消耗文件句柄和一些其他必要的资源。

架构:

二、Nginx的五大核心应用场景

1.静态Web服务器 (Static Web Server)

Nginx 处理静态文件(如 HTML, CSS, JavaScript, 图片)的速度非常快。

用途:直接作为前端服务器,托管 React/Vue 的打包文件或一般静态网站。

优势:相比 Tomcat、Apache 等应用服务器,Nginx 处理静态资源时的 CPU 和内存消耗极低。

2.正向代理(Forward Proxy)

Nginx 不仅可以做反向代理,实现负载均衡。还能用作正向代理来进行上网等功能。 正向代理:如果把局域网外的 Internet 想象成一个巨大的资源库,则局域网中的客户端要访 问 Internet,则需要通过代理服务器来访问,这种代理服务就称为正向代理。

简单一点:通过代理服务器来访问服务器的过程 就叫 正向代理。

需要在客户端配置代理服务器进行指定网站访问

3.反向代理 (Reverse Proxy)

这是 Nginx 最常见的用法。

原理:客户端(用户)不知道后端服务器的存在。用户直接访问 Nginx,Nginx 再将请求转发给后端的应用服务器(如 Java 的 Tomcat, Python 的 Flask, Node.js 等)。

作用:隐藏后端服务器真实 IP(安全)、统一入口、处理跨域问题。

4.负载均衡 (Load Balancing)

跳转到下文的负载均衡详解

当网站流量很大,一台服务器扛不住时,通常会部署多台服务器(集群)。

原理:Nginx 作为一个调度员,按照设定的规则(如轮询、权重、IP 哈希)将用户的请求分发到不同的后端服务器上。

作用:提高系统的扩展性和容错能力(如果一台后端挂了,Nginx 会自动剔除它)。


5.动静分离

为了加快网站的解析速度,可以把动态页面和静态页面由不同的服务器来解析,加快解析速 度。降低原来单个服务器的压力。

三、Nginx 为什么这么快?(核心原理)

Nginx 能够轻松处理数万甚至数十万并发连接,主要归功于其架构设计:

1.Master-Worker 进程模型

Master 进程:主要负责管理 Worker 进程(读取配置、监控状态)。

Worker 进程:通过单线程处理网络请求。

2.异步非阻塞 (Epoll 模型)

这是 Nginx 与传统服务器(如旧版 Apache)最大的区别。

传统服务器通常采用"一个连接一个线程"的模式,并发高时,线程切换开销巨大。

Nginx 采用多路复用技术,一个 Worker 线程就可以高效地监控和处理成千上万个连接,没有频繁的线程上下文切换开销。

3.Nginx 与 Apache 对比

特性 Nginx Apache
架构 事件驱动,异步非阻塞 进程/线程驱动,阻塞式
并发能力 极高,资源消耗低 高并发下内存消耗大
静态内容 处理速度极快 相对较慢
动态内容 不直接支持(需转发给 PHP-FPM 等) 原生支持(如 mod_php)
配置 简洁,更现代化 灵活,支持 .htaccess (目录级配置)
稳定性 极高,几乎不需要重启 非常稳定,历史悠久

四、nginx的安装和部署

0.基础配置示例 (nginx.conf)

Nginx 的配置文件结构清晰,通常位于 /etc/nginx/nginx.conf。

一个典型的配置结构如下:

ruby 复制代码
# 全局块:配置运行用户、进程数等
worker_processes  1; 

events {
    # 每个 worker 允许的最大连接数
    worker_connections  1024; 
}

http {
    # http 块:包含文件类型、日志格式、各种 server 块
    include       mime.types;
    default_type  application/octet-stream;

    # 定义一个负载均衡组(Upstream)
    upstream my_backend_app {
        server 192.168.1.101:8080 weight=1;
        server 192.168.1.102:8080 weight=2; # 权重更高
    }

    # Server 块:代表一个虚拟主机(网站)
    server {
        listen       80;             # 监听端口
        server_name  localhost;      # 域名

        # 场景1:静态文件代理
        location / {
            root   /usr/share/nginx/html; # 静态文件目录
            index  index.html index.htm;
        }

        # 场景2:反向代理 API 请求给后端
        location /api/ {
            proxy_pass http://my_backend_app; # 转发给上面的 upstream
            proxy_set_header Host $host;      # 传递真实头部信息
        }
    }
}

1.安装nginx

1.安装nginx

cpp 复制代码
sudo apt install nginx

切换到root用户

bash 复制代码
sudo su

2.查看nginx

bash 复制代码
netstat -ntlp
ps -elLf | grep nginx
kill -9 进程号


3.安装nignx的效果,多出来的东西

(1)可执行程序

(2)默认的配置文件路径

bash 复制代码
/etc/nginx/nginx.conf

(3)nginx进程的默认当前工作目录 (当前工作目录:相对路径的起点)

bash 复制代码
/usr/share/nginx

2.使用nginx服务器部署静态资源

4.nginx配置文件

①location的作用:路由匹配。让不同的path 执行不同的业务。

②root指令的效果:静态资源服务器将服务端的磁盘文件作为响应内容回复给客户端。

bash 复制代码
worker_processes  1;  
user root;            
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;     #nginx默认端口号为80
        server_name  localhost;
        location / {
            #root   html;       #相对路径
            root   reference;  #相对路径
            #root /home/edward/cpp58/workflow/workflowday1;  #绝对路径
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

5.启动和停止nginx

①退出残留的nginx进程 (强制杀死,暴力退出):

bash 复制代码
//root下杀死master
ps -elLf | grep nginx
kill -9 master进程号

②启动nginx

bash 复制代码
nginx -c /etc/nginx/nginx.conf

③退出nginx (优雅退出)

bash 复制代码
nginx -s quit -c /etc/nginx/nginx.conf

6.测试:访问nginx服务器部署的静态资源

(1)相对路径与绝对路径:部署网页

bash 复制代码
#配置文件中用相对路径
root html  				   #结果是拼接, /usr/share/nginx/html

#配置文件中用绝对路径
root /home/edward/reference  #结果就是把绝对路径作为前缀

(2)在root用户下 (sudo su),使用curl命令请求服务器的静态资源

bash 复制代码
sudo apt update
sudo apt install curl     #安装curl
bash 复制代码
curl localhost:80/index.html
curl localhost:80/en/cpp.html

curl localhost:80/help.txt

(3)用windows浏览器访问linux:

bash 复制代码
192.168.49.131/index.html
192.168.49.131/en/cpp/container/map/begin.html

192.168.49.131/help.txt

五、HTTP服务器架构

0.成熟的HTTP服务端产品:Nginx、Apache


1.基于进程、基于线程:APache

多进程/多线程服务器(进程驱动/线程驱动):每一个线程/进程 负责一个业务的处理。

优点:代码好写,开发效率高。业务逻辑可以一口气写到底。

缺点:性能差。

①每一个事务要分配一个进程/线程,占用内存大,并发量低。

②进行业务切换要进行进程/线程切换,CPU要从用户态切换到内核态再切换回用户态,CPU耗时高。

2.事件驱动模型:Nginx

事件驱动模型:1个线程用IO多路复用 (select/epoll) 管理多个连接。

优点:调用是用户态的,CPU耗时低。

缺点:代码不好写。要把完整的业务,拆分成事件碎片。

并发量:

APache单核并发量为2000-3000。(并大低,代码好写,一口气写到底)

nginx单核并发量为2w~4w QPS,深度优化可达10w。 (并大量大,代码不好写)

QPS:Queries Per Second,每秒查询数

TPS:Transactions Per Second,每秒事务数

搭配使用:最合理的方式是一起用,各司其职:

(1)Nginx:简单,大流量。如:访问静态资源(主页),缓存。Nginx作为网关。

(2)Apache:复杂业务。作为后端。

3.反向代理

反向代理 :靠近服务端。对复杂业务进行转发。对重复的请求进行缓存。

反向代理:

在Web应用的设计过程,有的时候并不适合直接让客户端和服务端之间相连,而是增加一些中间服务器用于转发请求和响应。如果代理服务器的设计是为了将某个客户端的请求按需从多个服务器当中分配一个的话,那么这个代理服务器就是反向代理服务器。

4.负载均衡

1.定义
负载均衡:合理地分配流量,对多个Apache进行任务分配。

2.负载均衡的策略:

(1)轮询 / 随机:不能充分利用缓存

(2)哈希:能充分利用缓存,但加入新服务器时,会存在大量缓存失效。

(3)环形哈希 (一致性哈希):大幅度减少缓存失效的数量。

环形哈希在服务器节点的增减时能够最大限度地减少缓存的失效和重新分配的成本。


3.事件驱动模型 要充分利用多核:

(1)单reactor + 线程池:连接数不多,但每个链接的业务复杂,耗时

(2)每个线程一个reactor:连接数非常大,但业务简单。

Nginx的策略:每个进程一个Reactor,提高可靠性。

4.线程数是CPU核心数的1-2倍

①IO密集型:2倍。

②CPU密集型:1倍。

③都密集:1-2倍,压力测试取最佳值。

5.压力测试(性能测试/跑分)工具:(本质上是一个客户端,发很多个请求,长短不一定。统计响应的回复时间。每秒处理的响应数称为QPS)

(1)apache bench:测http服务端,只能测http协议

bash 复制代码
sudo apt install apache2-utils  #安装
ab -n 10000 -c 100 http://192.168.49.131:12345/
ab -n 100000 (任务量) -c 10 (线程数) http://192.168.49.131:12345/

(2)wrk

六、博主的其他相关参考博客

workflow

相关推荐
咸鱼加辣1 天前
【nginx面试题】nginx虚拟
运维·nginx·github
全栈工程师修炼指南1 天前
Nginx | HTTPS 加密传输:Nginx 反向代理与上游服务 SSL 双向认证实践
网络·数据库·nginx·https·ssl
苹果醋31 天前
JAVA设计模式之策略模式
java·运维·spring boot·mysql·nginx
linweidong2 天前
顺丰运维面试题及参考答案
运维·nginx·容器·ansible·运维开发·防火墙·python面试
MonkeyKing_sunyuhua2 天前
ubuntu22.04安装nginx
运维·windows·nginx
无极小卒2 天前
Nginx服务器无法访问图片的问题解决
运维·服务器·nginx
眠りたいです2 天前
Docker:认识Docker镜像仓库并进行拉取推送
运维·nginx·docker·容器·busybox
kong79069282 天前
环境搭建-运行前端工程(Nginx)
前端·nginx·前端工程
苹果醋32 天前
java设计模式之责任链模式
java·运维·spring boot·mysql·nginx