找回密码
 立即注册
首页 业界区 安全 一文搞懂nginx

一文搞懂nginx

俏挺喳 2025-6-1 18:41:40
什么是nginx?

Nginx 同 Apache 一样都是一种 Web 服务器。基于 REST 架构风格,以统一资源描述符(Uniform Resources Identifier)URI 或者 统一资源定位符(Uniform Resources Locator)URL 作为沟通依据,通过 HTTP 协议 提供各种网络服务。
Nginx是一款 轻量级 的 Web服务器、反向代理服务器,由于它的内存占用少,启动极快,高并发能力强,在互联网项目中广泛应用。
Nginx有报告称并发能力为50000,当然这要有足够的服务器资源支撑
Nginx主要功能

HTTP服务器

这是Nginx最核心的功能之一。它可以高效地处理静态文件请求,如HTML、CSS、JavaScript、图片等。Nginx通过异步非阻塞的方式处理请求,与传统的Apache服务器相比,在高并发场景下具有显著的性能优势。例如,当有大量用户同时访问一个网站时,Nginx能够快速响应静态资源请求,而不会因为线程阻塞而降低性能。
它还支持动态内容的处理,可以通过与后端服务器(如PHP-FPM、Tomcat等)配合,将动态请求转发给相应的处理程序,从而实现完整的Web应用服务。
反向代理服务器

Nginx可以作为反向代理服务器,将客户端的请求转发到后端的多个服务器上。例如,在一个大型网站中,可能会有多个应用服务器,Nginx可以根据配置的规则(如负载均衡算法)将请求分发到不同的后端服务器,从而实现负载均衡和高可用性。
它还可以对后端服务器的响应进行缓存,减少对后端服务器的访问压力,提高整体的响应速度。例如,对于一些不经常更新的页面内容,Nginx可以缓存这些内容,当客户端再次请求时,直接从缓存中返回,而不需要再次访问后端服务器。
负载均衡

Nginx提供了多种负载均衡算法,如轮询、最少连接、IP哈希等。轮询算法是将请求依次分配到各个后端服务器;最少连接算法会优先将请求分配到当前连接数最少的服务器;IP哈希算法则是根据客户端的IP地址进行哈希计算,将请求分配到固定的后端服务器,从而实现会话保持。
通过负载均衡,可以有效地分散请求压力,提高系统的整体性能和可靠性。例如,一个电商网站在促销活动期间,访问量会急剧增加,通过Nginx的负载均衡功能,可以将流量均匀地分配到多个服务器上,避免单个服务器过载。
SSL/TLS支持

Nginx支持SSL/TLS协议,可以为网站提供HTTPS服务。通过配置SSL证书,Nginx可以对客户端和服务器之间的通信进行加密,确保数据传输的安全性。这对于保护用户的隐私信息(如登录密码、信用卡信息等)非常重要。
它还可以实现证书的自动更新和管理,简化了HTTPS部署的复杂性。
Nginx架构设计

事件驱动架构

Nginx采用事件驱动的架构模型,基于异步非阻塞的I/O操作。它通过工作进程(worker process)来处理请求,每个工作进程可以同时处理多个连接。当一个连接有数据可读或可写时,Nginx会触发相应的事件,工作进程会处理这些事件,而不会像传统的多线程服务器那样阻塞等待。
这种架构使得Nginx在处理高并发连接时具有很高的效率。例如,它可以轻松地处理数万个并发连接,而不会因为线程切换和上下文切换而导致性能下降。
主从进程架构

Nginx的架构包括一个主进程(master process)和多个工作进程。主进程主要负责管理配置文件的加载、日志文件的管理、工作进程的启动和停止等管理工作。
工作进程则是用来处理具体的请求。主进程会根据配置文件中的指令,将请求分发给不同的工作进程。这种主从架构使得Nginx可以灵活地调整工作进程的数量,以适应不同的负载情况。
Nginx常用四大发行版本

Nginx开源版

地址:http://nginx.org
由 Nginx 官方发布的版本,这是最常见和最基础的版本。官方版专注于提供核心的 Nginx 功能,定期更新并提供安全补丁和性能优化。它适用于大多数使用场景,是企业和个人用户的首选。
Nginx Plus 商业版

地址:https://www.nginx.com
这是 Nginx 官方的商业版本,提供了更多高级功能和企业级支持,例如会话保持(Sticky Sessions)、应用程序负载均衡、动态 DNS 解析、活动健康检查以及更高级的监控和管理功能。Nginx Plus 适合需要企业级支持和额外功能的用户。
Openresty

地址:http://openresty.org
基于 Nginx 的一个高性能 Web 平台,集成了 LuaJIT 和大量的 Lua 模块,使用户可以用 Lua 编写 Nginx 的扩展模块和逻辑,适用于需要高度可定制和高性能 Web 服务的场景。OpenResty 常用于需要动态内容生成或更复杂请求处理的应用中。
Tengine

地址:http://tengine.taobao.org
由阿里巴巴开发和维护的 Nginx 分支,特别为大型网站和互联网企业优化。Tengine 在 Nginx 的基础上添加了许多新特性和增强功能,如动态模块加载、更高效的处理请求能力和性能优化,是中国互联网企业广泛使用的版本。
Nginx开源版安装

环境信息

IP主机名系统规格10.0.0.20masterUbuntu22.042c4g安装步骤

这里使用最简单的安装方式,直接使用apt源进行安装
  1. [root@master ~]# apt update -y
  2. [root@master ~]# apt install nginx -y
复制代码
启动nginx
  1. #启动nginx
  2. [root@master ~]# systemctl start nginx
  3. #检查nginx状态
  4. [root@master ~]# systemctl status nginx
  5. ● nginx.service - A high performance web server and a reverse proxy server
  6.      Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
  7.      Active: active (running) since Sat 2025-03-29 20:07:00 CST; 6 days ago
  8.        Docs: man:nginx(8)
  9.     Process: 1767 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  10.     Process: 1768 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
  11.    Main PID: 1863 (nginx)
  12.       Tasks: 3 (limit: 4519)
  13.      Memory: 4.4M
  14.         CPU: 22ms
  15.      CGroup: /system.slice/nginx.service
  16.              ├─1863 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
  17.              ├─1865 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
  18.              └─1866 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
  19. Mar 29 20:07:00 master systemd[1]: Starting A high performance web server and a reverse proxy server...
  20. Mar 29 20:07:00 master systemd[1]: Started A high performance web server and a reverse proxy server.
复制代码
访问nginx-->http://10.0.0.20:80
1.png

nginx目录结构及配置文件详解

使用apt源安装的nginx,相关配置文件都在/etc/nginx目录下
  1. [root@master ~]# ll /etc/nginx
  2. total 72
  3. drwxr-xr-x  8 root root 4096 Mar 29 20:08 ./
  4. drwxr-xr-x 93 root root 4096 Mar 29 20:15 ../
  5. drwxr-xr-x  2 root root 4096 Feb 15 02:40 conf.d/
  6. -rw-r--r--  1 root root 1125 May 31  2023 fastcgi.conf
  7. -rw-r--r--  1 root root 1055 May 31  2023 fastcgi_params
  8. -rw-r--r--  1 root root 2837 May 31  2023 koi-utf
  9. -rw-r--r--  1 root root 2223 May 31  2023 koi-win
  10. -rw-r--r--  1 root root 3957 May 31  2023 mime.types
  11. drwxr-xr-x  2 root root 4096 Feb 15 02:40 modules-available/
  12. drwxr-xr-x  2 root root 4096 Mar 29 20:07 modules-enabled/
  13. -rw-r--r--  1 root root 1447 May 31  2023 nginx.conf
  14. -rw-r--r--  1 root root  180 May 31  2023 proxy_params
  15. -rw-r--r--  1 root root  636 May 31  2023 scgi_params
  16. drwxr-xr-x  2 root root 4096 Mar 29 20:06 sites-available/
  17. drwxr-xr-x  2 root root 4096 Mar 29 20:06 sites-enabled/
  18. drwxr-xr-x  2 root root 4096 Mar 29 20:06 snippets/
  19. -rw-r--r--  1 root root  664 May 31  2023 uwsgi_params
  20. -rw-r--r--  1 root root 3071 May 31  2023 win-utf
复制代码
其中有几个文件和目录需要特别关注一下:

  • nginx.conf文件
    这是nginx的主配置文件,里面配置nginx的用户、进程配置、域名、端口、日志...等等一系列配置,我们后面会讲
  • conf.d目录
    子配置文件存放的目录,如果没有可以手动创建,配置文件以conf结尾
nginx主配置文件说明

nginx主配置文件是nginx.conf文件,我们看下里面的内容
  1. [root@master ~]# cat /etc/nginx/nginx.conf
  2. #nginx的用户
  3. user www-data;
  4. #工作进程,默认是自动的
  5. worker_processes auto;
  6. #nginx的进程id文件
  7. pid /run/nginx.pid;
  8. #文件包含或引用功能,用于在nginx配置文件中调取其它文件,引用nginx子配置文件
  9. include /etc/nginx/modules-enabled/*.conf;
  10. events {
  11.         #工作进程可以处理的最大连接数,默认是768,其它有的默认是1024
  12.         worker_connections 768;
  13. }
  14. # http模块
  15. http {
  16.         ##
  17.         # Basic Settings
  18.         ##
  19.         #这些配置可以提高nginx的性能
  20.         sendfile on;
  21.         tcp_nopush on;
  22.         types_hash_max_size 2048;
  23.         # server_tokens off;
  24.         # server_names_hash_bucket_size 64;
  25.         # server_name_in_redirect off;
  26.         #引用的媒体类型
  27.         include /etc/nginx/mime.types;
  28.         #默认的媒体类型
  29.         default_type application/octet-stream;
  30.         ##
  31.         # SSL相关设置
  32.         ##
  33.         ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
  34.         ssl_prefer_server_ciphers on;
  35.         #访问日志
  36.         access_log /var/log/nginx/access.log;
  37.         #错误日志
  38.         error_log /var/log/nginx/error.log;
  39.         #文件压缩的开关
  40.         gzip on;
  41.         # gzip_vary on;
  42.         # gzip_proxied any;
  43.         # gzip_comp_level 6;
  44.         # gzip_buffers 16 8k;
  45.         # gzip_http_version 1.1;
  46.         # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  47.         ##
  48.         # Virtual Host Configs
  49.         ##
  50.         #引用的其它的子配置文件
  51.         include /etc/nginx/conf.d/*.conf;
  52.         include /etc/nginx/sites-enabled/*;
  53.         # 指定状态码为404跳转的页面
  54.         error_page 404 /404.html;
  55.             location = /40x.html {
  56.         }
  57.         # 指定50x跳转的页面
  58.         error_page 500 502 503 504 /50x.html;
  59.             location = /50x.html {
  60.         }
  61. }
复制代码
主配置文件图示:
2.png

子配置文件图示:
3.png

部署第一个项目

编译构建ruoyi项目

在这里我们使用ruoyi项目的前端文件,在这里特别感谢,ruoyi项目地址:https://gitee.com/y_project/RuoYi-Cloud
我们需要安装git、nodejs和npm
  1. #下载git、nodejs和npm
  2. [root@master ~]# apt update -y
  3. [root@master ~]# apt install -y npm git nodejs
  4. #使用git克隆项目
  5. [root@master ~]# mkdir -p /data/gitcode
  6. [root@master ~]# cd /data/gitcode
  7. [root@master /data/gitcode]# git clone https://gitee.com/y_project/RuoYi-Cloud.git
  8. Cloning into 'RuoYi-Cloud'...
  9. remote: Enumerating objects: 17011, done.
  10. remote: Counting objects: 100% (17011/17011), done.
  11. remote: Compressing objects: 100% (5084/5084), done.
  12. remote: Total 17011 (delta 8067), reused 16610 (delta 7863), pack-reused 0 (from 0)
  13. Receiving objects: 100% (17011/17011), 3.38 MiB | 1.19 MiB/s, done.
  14. Resolving deltas: 100% (8067/8067), done.
  15. #安装依赖
  16. [root@master /data/gitcode]# cd RuoYi-Cloud/ruoyi-ui/
  17. [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# npm install --registry=https://registry.npmmirror.com
  18. npm WARN ERESOLVE overriding peer dependency
  19. npm WARN deprecated copy-concurrently@1.0.5: This package is no longer supported.
  20. #...省略万字内容...
  21. added 1609 packages in 1m
  22. 167 packages are looking for funding
  23.   run `npm fund` for details
  24. #构建项目
  25. [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# npm run build:prod
  26. > ruoyi@3.6.5 build:prod
  27. > vue-cli-service build
  28. ##省略万字内容
  29. DONE  Build complete. The dist directory is ready to be deployed.
  30. INFO  Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html
  31. [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# mkdir -p /data/nginx/
  32. [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# cp -r dist /data/nginx/
复制代码
配置nginx

新建一个nginx的子配置文件,并添加其内容
  1. #配置内容
  2. [root@master /etc/nginx/conf.d]# cat /etc/nginx/conf.d/ruoyi_ui.conf
  3. server{
  4.   # 监听端口
  5.   listen 80;
  6.   # 域名
  7.   server_name ruoyi.huangSir-devops.cn;
  8.   #指定访问的目录
  9.   root /data/nginx/dist;
  10.   #匹配规则
  11.   location / {
  12.     index index.html;
  13.   }
  14. }
  15. #检查语法
  16. [root@master /etc/nginx/conf.d]# nginx -t
  17. nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  18. nginx: configuration file /etc/nginx/nginx.conf test is successful
  19. #重启nginx
  20. [root@master /etc/nginx/conf.d]# systemctl restart nginx
复制代码
配置完成之后,我们需要在本地做一个hosts解析
windows中hosts文件路径:C:\Windows\System32\drivers\etc
使用管理员方式打开,添加以下内容
  1. 10.0.0.20 ruoyi.huangSir-devops.cn
复制代码
浏览器输入地址并进行访问
http://ruoyi.huangsir-devops.cn/
4.png

至此,我们的网站就搭建完成咯
用户请求nginx的流程

这里涉及到一些网络相关的知识,可以先看这篇文章-->计算机网络初识
当我们向nginx发起请求时,一般会经历下面几个步骤

  • DNS解析域名
    首先会经过DNS解析域名,解析域名的流程大概是

    • 找本地hosts文件和本地DNS缓存
    • 找本地DNS服务器询问是否知道这个域名
    • 本地DNS服务器依次询问根域名服务器、顶级域名服务器、二级域名服务器是否知道该域名
    • 返回IP地址

  • 通过IP加端口,TCP三次握手建立连接

    • 客户端发起SYN请求到服务端,请求建立连接
    • 服务端向客户端发起SYN、ACK到客户端进行确认
    • 客户端向服务端发起ACK确认建立连接

  • 客户端发起HTTP请求,携带请求报文

    • 携带请求头、请求方法、请求URI以及HTTP版本发送给服务端

  • 请求通过建立的80端口,到达nginx,nginx开始处理,http区域负责处理
  • 用户请求的域名与子配置文件中的server_name部分进行匹配

    • 匹配成功,则对应的server处理用户请求
    • 如果没有携带域名进行访问,则默认第一个server处理请求,或者设置了默认站点的server处理请求

  • 站点处理用户请求的时候根据用户请求的url+站点目录进行处理
  • HTTP请求响应给用户
  • TCP四次挥手断开连接

    • 客户端向服务端发起断开请求,携带FIN、ACK标记,以及seq和ack
    • 服务端收到请求,向客户端发出ACK确认请求
    • 这里服务端会向客户端传输未传输完成的数据,当数据传输完成之后,服务端向客户端发起断开连接请求,携带FIN、PSH、ACK标记,并携带seq和ack
    • 客户端收到服务端请求,并向服务端发出ACK确认请求,到此连接断开


来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册