什么是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源进行安装- [root@master ~]# apt update -y
- [root@master ~]# apt install nginx -y
复制代码 启动nginx
- #启动nginx
- [root@master ~]# systemctl start nginx
- #检查nginx状态
- [root@master ~]# systemctl status nginx
- ● nginx.service - A high performance web server and a reverse proxy server
- Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
- Active: active (running) since Sat 2025-03-29 20:07:00 CST; 6 days ago
- Docs: man:nginx(8)
- Process: 1767 ExecStartPre=/usr/sbin/nginx -t -q -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
- Process: 1768 ExecStart=/usr/sbin/nginx -g daemon on; master_process on; (code=exited, status=0/SUCCESS)
- Main PID: 1863 (nginx)
- Tasks: 3 (limit: 4519)
- Memory: 4.4M
- CPU: 22ms
- CGroup: /system.slice/nginx.service
- ├─1863 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
- ├─1865 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
- └─1866 "nginx: worker process" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""
- Mar 29 20:07:00 master systemd[1]: Starting A high performance web server and a reverse proxy server...
- 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
nginx目录结构及配置文件详解
使用apt源安装的nginx,相关配置文件都在/etc/nginx目录下- [root@master ~]# ll /etc/nginx
- total 72
- drwxr-xr-x 8 root root 4096 Mar 29 20:08 ./
- drwxr-xr-x 93 root root 4096 Mar 29 20:15 ../
- drwxr-xr-x 2 root root 4096 Feb 15 02:40 conf.d/
- -rw-r--r-- 1 root root 1125 May 31 2023 fastcgi.conf
- -rw-r--r-- 1 root root 1055 May 31 2023 fastcgi_params
- -rw-r--r-- 1 root root 2837 May 31 2023 koi-utf
- -rw-r--r-- 1 root root 2223 May 31 2023 koi-win
- -rw-r--r-- 1 root root 3957 May 31 2023 mime.types
- drwxr-xr-x 2 root root 4096 Feb 15 02:40 modules-available/
- drwxr-xr-x 2 root root 4096 Mar 29 20:07 modules-enabled/
- -rw-r--r-- 1 root root 1447 May 31 2023 nginx.conf
- -rw-r--r-- 1 root root 180 May 31 2023 proxy_params
- -rw-r--r-- 1 root root 636 May 31 2023 scgi_params
- drwxr-xr-x 2 root root 4096 Mar 29 20:06 sites-available/
- drwxr-xr-x 2 root root 4096 Mar 29 20:06 sites-enabled/
- drwxr-xr-x 2 root root 4096 Mar 29 20:06 snippets/
- -rw-r--r-- 1 root root 664 May 31 2023 uwsgi_params
- -rw-r--r-- 1 root root 3071 May 31 2023 win-utf
复制代码 其中有几个文件和目录需要特别关注一下:
- nginx.conf文件
这是nginx的主配置文件,里面配置nginx的用户、进程配置、域名、端口、日志...等等一系列配置,我们后面会讲
- conf.d目录
子配置文件存放的目录,如果没有可以手动创建,配置文件以conf结尾
nginx主配置文件说明
nginx主配置文件是nginx.conf文件,我们看下里面的内容- [root@master ~]# cat /etc/nginx/nginx.conf
- #nginx的用户
- user www-data;
- #工作进程,默认是自动的
- worker_processes auto;
- #nginx的进程id文件
- pid /run/nginx.pid;
- #文件包含或引用功能,用于在nginx配置文件中调取其它文件,引用nginx子配置文件
- include /etc/nginx/modules-enabled/*.conf;
- events {
- #工作进程可以处理的最大连接数,默认是768,其它有的默认是1024
- worker_connections 768;
- }
- # http模块
- http {
- ##
- # Basic Settings
- ##
- #这些配置可以提高nginx的性能
- sendfile on;
- tcp_nopush on;
- types_hash_max_size 2048;
- # server_tokens off;
- # server_names_hash_bucket_size 64;
- # server_name_in_redirect off;
- #引用的媒体类型
- include /etc/nginx/mime.types;
- #默认的媒体类型
- default_type application/octet-stream;
- ##
- # SSL相关设置
- ##
- ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # Dropping SSLv3, ref: POODLE
- ssl_prefer_server_ciphers on;
- #访问日志
- access_log /var/log/nginx/access.log;
- #错误日志
- error_log /var/log/nginx/error.log;
- #文件压缩的开关
- gzip on;
- # gzip_vary on;
- # gzip_proxied any;
- # gzip_comp_level 6;
- # gzip_buffers 16 8k;
- # gzip_http_version 1.1;
- # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
- ##
- # Virtual Host Configs
- ##
- #引用的其它的子配置文件
- include /etc/nginx/conf.d/*.conf;
- include /etc/nginx/sites-enabled/*;
- # 指定状态码为404跳转的页面
- error_page 404 /404.html;
- location = /40x.html {
- }
- # 指定50x跳转的页面
- error_page 500 502 503 504 /50x.html;
- location = /50x.html {
- }
- }
复制代码 主配置文件图示:
子配置文件图示:
部署第一个项目
编译构建ruoyi项目
在这里我们使用ruoyi项目的前端文件,在这里特别感谢,ruoyi项目地址:https://gitee.com/y_project/RuoYi-Cloud
我们需要安装git、nodejs和npm- #下载git、nodejs和npm
- [root@master ~]# apt update -y
- [root@master ~]# apt install -y npm git nodejs
- #使用git克隆项目
- [root@master ~]# mkdir -p /data/gitcode
- [root@master ~]# cd /data/gitcode
- [root@master /data/gitcode]# git clone https://gitee.com/y_project/RuoYi-Cloud.git
- Cloning into 'RuoYi-Cloud'...
- remote: Enumerating objects: 17011, done.
- remote: Counting objects: 100% (17011/17011), done.
- remote: Compressing objects: 100% (5084/5084), done.
- remote: Total 17011 (delta 8067), reused 16610 (delta 7863), pack-reused 0 (from 0)
- Receiving objects: 100% (17011/17011), 3.38 MiB | 1.19 MiB/s, done.
- Resolving deltas: 100% (8067/8067), done.
- #安装依赖
- [root@master /data/gitcode]# cd RuoYi-Cloud/ruoyi-ui/
- [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# npm install --registry=https://registry.npmmirror.com
- npm WARN ERESOLVE overriding peer dependency
- npm WARN deprecated copy-concurrently@1.0.5: This package is no longer supported.
- #...省略万字内容...
- added 1609 packages in 1m
- 167 packages are looking for funding
- run `npm fund` for details
- #构建项目
- [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# npm run build:prod
- > ruoyi@3.6.5 build:prod
- > vue-cli-service build
- ##省略万字内容
- DONE Build complete. The dist directory is ready to be deployed.
- INFO Check out deployment instructions at https://cli.vuejs.org/guide/deployment.html
-
- [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# mkdir -p /data/nginx/
- [root@master /data/gitcode/RuoYi-Cloud/ruoyi-ui]# cp -r dist /data/nginx/
复制代码 配置nginx
新建一个nginx的子配置文件,并添加其内容- #配置内容
- [root@master /etc/nginx/conf.d]# cat /etc/nginx/conf.d/ruoyi_ui.conf
- server{
- # 监听端口
- listen 80;
- # 域名
- server_name ruoyi.huangSir-devops.cn;
- #指定访问的目录
- root /data/nginx/dist;
- #匹配规则
- location / {
- index index.html;
- }
- }
- #检查语法
- [root@master /etc/nginx/conf.d]# nginx -t
- nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
- nginx: configuration file /etc/nginx/nginx.conf test is successful
- #重启nginx
- [root@master /etc/nginx/conf.d]# systemctl restart nginx
复制代码 配置完成之后,我们需要在本地做一个hosts解析
windows中hosts文件路径:C:\Windows\System32\drivers\etc
使用管理员方式打开,添加以下内容- 10.0.0.20 ruoyi.huangSir-devops.cn
复制代码 浏览器输入地址并进行访问
http://ruoyi.huangsir-devops.cn/
至此,我们的网站就搭建完成咯
用户请求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确认请求,到此连接断开
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |