Linux下Nginx详解

1、概念

1.1 介绍

Nginx是一个高性能的开源Web服务器软件,也可以用作反向代理服务器、负载均衡器和HTTP缓存。它的设计目标是高性能、稳定性、丰富的功能和低资源消耗。

1.2 应用场景

  • Web服务器:Nginx可以作为静态资源服务器,处理静态文件的请求,提供高性能的Web服务。
  • 反向代理服务器:Nginx可以代理后端服务器,接收客户端的请求并将其转发给后端服务器,实现负载均衡和高可用性。
  • 负载均衡器:Nginx可以分发客户端请求到多个后端服务器,实现负载均衡,提高系统的整体性能和可靠性。
  • HTTP缓存:Nginx可以缓存静态文件和动态页面,减轻后端服务器的压力,提高网站的访问速度。

1.3 反向代理

反向代理是指代理服务器接收来自客户端的请求,然后将这些请求转发给后端服务器,最终将后端服务器的响应返回给客户端。客户端只知道代理服务器的存在,而不知道后端服务器的信息。有以下优点:

  • 隐藏后端服务器:客户端无法直接访问后端服务器,增强了安全性。
  • 负载均衡:可以将请求分发给多个后端服务器,提高性能和可靠性。
  • 缓存:代理服务器可以缓存响应,减轻后端服务器压力。

在Nginx中,使用proxy_pass指令来设置反向代理。例如:proxy_pass http://backend_server;

1.4 负载均衡

负载均衡是指将请求分发给多个后端服务器,以实现负载均衡、提高性能和可靠性。常见的负载均衡算法包括轮询、加权轮询、最少连接等。有以下优点:

  • 提高性能:将请求分发给多个服务器,减轻单个服务器的压力。
  • 提高可靠性:当某个服务器出现故障时,负载均衡器可以将请求转发给其他正常的服务器。
  • 横向扩展:可以随时添加或移除后端服务器,实现系统的横向扩展。

在Nginx中,可以使用upstream块定义后端服务器组,然后在location块中使用proxy_pass指令将请求代理到这个后端服务器组。例如:

upstream backend_servers {
    server backend1.example.com;
    server backend2.example.com;
}

location / {
    proxy_pass http://backend_servers;
}

2、Linux部署

2.1 安装

ubuntu安装命令如下:

sudo apt update
sudo apt install nginx

2.2 访问测试

安装完成后查看服务状态为running:

通过网线与开发板连接,直接在电脑浏览器上输入开发板IP进行访问:

2.3 常用命令

常用命令如下:

命令描述
nginx -h显示帮助信息
nginx -v显示版本信息
nginx -V显示版本信息和配置选项并退出
nginx -t测试配置文件是否正确并退出
nginx -T测试配置文件是否正确并将其转储并退出
nginx -q在配置测试期间抑制非错误消息
nginx -s signal向主进程发送信号:stop, quit, reopen, reload
nginx -p prefix设置前缀路径(默认值:/usr/share/nginx/)
nginx -c filename设置配置文件(默认值:/etc/nginx/nginx.conf)
nginx -g directives设置全局指令,超出配置文件之外

3、配置文件详解

3.1 配置文件位置和格式

配置文件一般位于:/etc/nginx/nginx.conf。

其大致格式如下:

events {
    // 全局事件配置
}

http {
    // 全局HTTP配置
    server {
        // 服务器配置
		    location / {
			// 路径配置
		}
    }
}

3.2 events块

events块中,可以配置一些与Nginx服务器的事件相关的参数。

3.2.1 worker_connections
  • 作用:设置每个工作进程允许的最大并发连接数。
  • 取值:整数。默认值取决于系统的最大文件描述符数,通常为1024或更高。
events {
    worker_connections 1024;
}
3.2.2 use
  • 作用:指定事件驱动模块,用于处理连接和请求。
  • 取值epollkqueueeventport/dev/poll等,取决于操作系统和Nginx编译时的选项。
events {
    use epoll;
}
3.2.3 multi_accept
  • 作用:允许一个工作进程同时接受多个新连接。
  • 取值onoff。默认为off
events {
    multi_accept on;
}
3.2.4 worker_processes
  • 作用:指定启动的工作进程数。
  • 取值:整数。通常设置为CPU核心数的倍数,以充分利用多核处理器。
events {
    worker_processes 4;
}

3.3 http块

http块的常见配置整理如下:

配置指令作用取值示例
worker_processes工作进程数整数worker_processes 4;
worker_connections每个工作进程的最大连接数整数worker_connections 1024;
include包含其他配置文件文件路径include /etc/nginx/conf.d/*.conf;
default_type默认MIME类型MIME类型default_type application/octet-stream;
error_log全局错误日志文件路径文件路径error_log /var/log/nginx/error.log;
sendfile启用直接文件传输onoffsendfile on;
tcp_nopush启用TCP_NOPUSH选项onofftcp_nopush on;
tcp_nodelay启用TCP_NODELAY选项onofftcp_nodelay on;
keepalive_timeoutKeep-alive连接超时时间整数(秒)keepalive_timeout 65;
types_hash_max_sizeMIME类型哈希表最大尺寸整数types_hash_max_size 2048;
server_tokens控制Nginx版本号显示或隐藏onoffserver_tokens off;

3.4 server块

server块的常见配置整理如下:

配置指令作用取值示例
listen监听端口IP地址:端口、端口listen 80; 或 listen 127.0.0.1:8080;
server_name定义虚拟主机的域名域名或通配符server_name example.com;
root网站根目录目录路径root /var/www/html;
index默认首页文件文件名或文件列表index index.html;
location匹配请求的URL路径路径或正则表达式location / { ... }
access_log访问日志文件路径文件路径access_log /var/log/nginx/access.log;
error_page定义错误页面HTTP状态码 页面路径error_page 404 /404.html;
ssl_certificateSSL证书文件路径文件路径ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_keySSL私钥文件路径文件路径ssl_certificate_key /etc/nginx/ssl/key.pem;
ssl_protocols定义SSL/TLS协议版本协议版本列表ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers定义SSL加密算法加密算法列表ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM';

3.5 location块

location块的常见配置整理如下:

配置指令作用取值示例
location匹配请求的URL路径路径或正则表达式location / { ... }
root指定当前location块的根目录目录路径root /var/www/html;
index指定当前location块的默认首页文件文件名或文件列表index index.html;
try_files尝试不同的文件或路径来匹配请求文件或路径列表try_files $uri $uri/ /index.html;
rewrite重写URL重写规则rewrite ^/old-url$ /new-url permanent;
proxy_pass反向代理到后端服务器后端服务器地址proxy_pass http://localhost:8080;
fastcgi_pass将请求传递给FastCGI服务器FastCGI地址fastcgi_pass unix:/var/run/php-fpm.sock;
deny拒绝访问IP地址、主机名、alldeny 192.168.1.1;
allow允许访问IP地址、主机名、allallow 192.168.1.0/24;
expires设置缓存过期时间时间值expires 1h;

在Nginx的location块中,可以使用正则表达式来匹配复杂的URL路径模式。以下是一些常用的正则表达式及其示例:

  • 匹配以特定字符开头的URL路径

    • 正则表达式:^/admin/.*
    • 示例:location ~ ^/admin/.* { ... }
    • 描述:匹配以/admin/开头的所有URL路径,如/admin/dashboard/admin/settings等。
  • 匹配特定文件扩展名的URL路径

    • 正则表达式:\.html$
    • 示例:location ~ \.html$ { ... }
    • 描述:匹配以.html结尾的URL路径,如/page.html/about.html等。
  • 匹配数字作为URL路径一部分

    • 正则表达式:/[0-9]+
    • 示例:location ~ /[0-9]+ { ... }
    • 描述:匹配包含数字的URL路径部分,如/post/123/user/456等。
  • 匹配多种可能性的URL路径

    • 正则表达式:/(news|blog)/[0-9]+
    • 示例:location ~ /(news|blog)/[0-9]+ { ... }
    • 描述:匹配类似/news/123/blog/456等多种可能性的URL路径。
  • 匹配任意字符的URL路径

    • 正则表达式:.*
    • 示例:location ~ .* { ... }
    • 描述:匹配任意字符的URL路径。

4、测试

4.1 设置默认界面

编写一个简单的HTML界面作为首页,代码如下,命令为mynginx.html。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>my nginx</title>
	<style>
    body {
        font-family: Arial, sans-serif;
        text-align: center;
    }
    form {
        margin-top: 20px;
    }
    input {
        padding: 5px;
        width: 300px;
    }
    button {
        padding: 5px 10px;
        background-color: #3385ff;
        color: white;
        border: none;
        cursor: pointer;
    }
	</style>
</head>
<body>
    <div>
    <form id="search-form">
        <input type="text" id="search-input" placeholder="请输入搜索内容">
        <button type="submit">搜索</button>
    </form>
	</div>
</body>

</html>

修改配置文件如下,并将上述HTML文件放置在/home/orangepi/Nginx目录下。

events{}

http{ 
  server{
    listen 80;
    server_name localhost;
	
    # 指定根目录
    root /home/orangepi/Nginx;
	
	# 指定默认网页
    index mynginx.html;
  }
}

使用nginx -s reload命令重新加载后进行访问测试:

4.2 编写服务器测试程序

编写服务器测试程序代码如下,通过命令行指定监听的端口:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

#define MAX_SIZE 1024

int main(int argc, char *argv[]) 
{
    if (argc != 2) 
    {
        fprintf(stderr, "Usage: %s <port>\n", argv[0]);
        return 1;
    }

    int PORT = atoi(argv[1]);
    int server_fd, new_socket;
    struct sockaddr_in address;
    int addrlen = sizeof(address);
    
    const char *ok = "HTTP/1.1 200 OK\r\n"  
                         "Content-Type: text/html; charset=UTF-8\r\n\r\n"  
                         "<html><body><h1>OK</h1></body></html>";
    
    // 创建TCP套接字
    if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {
        perror("socket failed");
        exit(EXIT_FAILURE);
    }

    address.sin_family = AF_INET;
    address.sin_addr.s_addr = INADDR_ANY;
    address.sin_port = htons(PORT);

    // 绑定套接字到指定端口
    if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {
        perror("bind failed");
        exit(EXIT_FAILURE);
    }

    // 监听端口
    if (listen(server_fd, 3) < 0) {
        perror("listen failed");
        exit(EXIT_FAILURE);
    }

    printf("Server listening on port %d\n", PORT);

    while(1)
    {
        printf("Waiting......\n");
        // 接受连接
        if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) 
        {
            perror("accept failed");
            exit(EXIT_FAILURE);
        }
        char rcvbuffer[MAX_SIZE] = {0};
        
        bzero((char *)rcvbuffer, sizeof(rcvbuffer));
        int bytesReceived = read(new_socket, rcvbuffer, MAX_SIZE);

        send(new_socket, ok, strlen(ok), 0);  
        printf("Connect Ok\n");

        usleep(1000);
        
        close(new_socket);
    }
    
    close(server_fd);
    return 0;
}

4.3 测试负载均衡

修改配置文件如下:

events{}

http{ 
  upstream my-servers{
	server localhost:8080 weight=3;
	server localhost:8081 weight=1;
  }
  
  server{
    listen 80;
    server_name localhost;
	
    # 指定根目录
    root /home/orangepi/Nginx;
	
	# 指定默认网页
    index index.html;
	
	location / {
		# 反向代理到后端服务器
		proxy_pass http://my-servers;
	}
  }
}

发起服务器程序,同时在浏览器侧一直访问进行测试:

5、总结

本文讲解了Nginx的特点,详细讲解了配置文件的格式和配置语法,编写测试程序测试了设置默认界面以及负载均衡调节等功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/514370.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

uniapp选择退出到指定页面

方法一&#xff1a;返回上n层页面 onUnload(){uni.navigateBack({delta:5,//返回上5层})},方法二&#xff1a;关闭当前页面&#xff0c;跳转到应用内的某个页面。 uni.redirectTo({url: "../home/index"//页面地址}) 方法三&#xff1a;关闭所有页面&#xff0c;打…

(2024)Ubuntu源码安装多个版本的opencv并切换使用

本人工作会用到x86_64的opencv和aarch64的opencv&#xff0c;所以写下来备忘自用 一、源码编译安装 依赖库安装&#xff1a; sudo apt-get install build-essential libgtk2.0-dev libgtk-3-dev libavcodec-dev libavformat-dev libjpeg-dev libswscale-dev libtiff5-dev o…

图论(Graph theory)

抽象数据结构类型 Graphic操作接口 操作接口功能描述操作接口功能描述e()获取图的总边数n()顶点的总数exits(v,u)判断v,u两个顶点是否存在边insert(v) 在顶点集 V 中插入新顶点 v remove(v,u)删除从v 到u的 关联边 remove(v) 将顶点 v 从顶点集中删除 type(v,u)边所属的类型(…

特征增强自蒸馏卷积神经网络

目录 1.1 模型总体架构 1.2 特征增强金字塔模块 1.3 辅助分类器 1.1 模型总体架构 与自然图像相比&#xff0c;遥感场景图像地物较为复杂&#xff0c;具有类间相似度高和类内差异大的特点&#xff0c;这导致常用的网络模型难以有效学习遥感场景图像的表征特征。此外&#xf…

使用Python获取红某书笔记详情并批量无水印下载

根据红某手最新版 请求接口必须要携带x-s x-s-c x-t,而调用官方接口又必须携带cookie,缺一不可,获取笔记详情可以通过爬取网页的形式获取&#xff0c;虽然也是无水印&#xff0c;但是一些详情信息只能获取大概&#xff0c;并不是详细的数值&#xff0c;因此既不想自己破解x-s x…

【Qt】Ubuntu20.04.6+Qt5.15.2+QtCreator10.0.1无法输入中文

1、前提条件 1)已经安装了fcitx sudo apt install fcitx sudo apt install fcitx-pinyin sudo apt install fcitx-bin fcitx-table-all sudo apt install fcitx-qt52)系统已经配置fcitx 3)将系统下 /usr/lib/x86_64-linux-gnu/qt5/plugins/platforminputcontexts/libfcitx…

Pygame基础11-mask 蒙版

蒙版 蒙版是二值化的图像&#xff0c;每个像素的值只能是0或1。 mask(蒙版)的用途&#xff1a; 碰撞检测部分着色 案例 和字母的碰撞检测 当玩家碰到字母 α \alpha α时&#xff0c;改变玩家颜色为绿色&#xff0c;否则为红色。 注意&#xff1a;我们希望碰到字母 α \alp…

c语言--联合体(声明、特点、计算)

目录 一、联合体类型的声明二、 联合体的特点三、 相同成员的结构体和联合体对比四、 联合体大小的计算 一、联合体类型的声明 像结构体⼀样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。 但是编译器只为最大的成员分配足够的内存空间。…

游戏引擎中的物理应用

一、 角色控制器 Character Controller和普通的动态对象&#xff08;Dynamic Actor &#xff09;是不同的&#xff0c;主要的三个特点是: 它拥有可控制的刚体间的交互假设它是有无穷的摩擦力&#xff08;可以站停在位置上&#xff09;&#xff0c;没有弹性加速和刹车几乎立即…

2023最新汽车网络安全报告汇总

2023最新汽车网络安全报告、安全参考架构及指南汇总&#xff0c;供大家学习参考。https://t.zsxq.com/18RkG260k 汽车信息安全法律法规及标准全景图V3.2.pdf 车载智能计算基础平台参考架构2.0.pdf 车载智能计算芯片白皮书(2023版).pdf 智能驾驶行为安全评价方法发布版.pdf 智能…

C#实现只保存2天的日志文件

文章目录 业务需求代码运行效果 欢迎讨论&#xff01; 业务需求 在生产环境中&#xff0c;控制台窗口不便展示出来。 为了在生产环境中&#xff0c;完整记录控制台应用的输出&#xff0c;选择将其输出到文件中。 但是&#xff0c;存储所有输出的话会占用很多空间&#xff0c;…

Docker 部署开源远程桌面工具 RustDesk

RustDesk是一款远程控制&#xff0c;远程协助的开源软件。完美替代TeamViewer &#xff0c;ToDesk&#xff0c;向日葵等平台。关键支持自建服务器&#xff0c;更安全私密远程控制电脑&#xff01;官网地址&#xff1a;https://rustdesk.com/ 环境准备 1、阿里云服务器一 台&a…

ChatGPT全方位解析:如何培养 AI 智能对话技能?

简介 ChatGPT 的主要优点之一是它能够理解和响应自然语言输入。在日常生活中&#xff0c;沟通本来就是很重要的一门课程&#xff0c;沟通的过程中表达的越清晰&#xff0c;给到的信息越多&#xff0c;那么沟通就越顺畅。 和 ChatGPT 沟通也是同样的道理&#xff0c;如果想要C…

【论文阅读笔记】SAM-Adapter: Adapting Segment Anything in Underperformed Scenes

1.论文介绍 SAM-Adapter: Adapting Segment Anything in Underperformed Scenes SAM适配器&#xff1a;在表现不佳的场景中适配任何片段 2023年 ICCV Paper Code SAM Fails to Segment Anything? – SAM-Adapter: Adapting SAM in Underperformed Scenes: Camouflage, Shado…

5.5G,只比6G少0.5G

5.5G成为通信行业2024年开年的一大焦点。提到5.5G&#xff0c;多出来的0.5G又是啥&#xff1f;为什么不直接迈向6G时代&#xff1f;今天我们一探究竟&#xff01; “0.5G”&#xff0c;现在与未来的桥梁 2021年&#xff0c;国际标准组织3GPP为通信技术的进一步发展定义了新的里…

云上百世慧 | 达索系统电池行业智能制造解决方案

当今诸多电池厂商快速成长的同时也面临诸多挑战&#xff1a; ※ 如何获得实时、数据驱动的KPI来衡量生产率&#xff1f; ※ 如何更好地管理生产线、物料流和周期时间&#xff1f; ※ 如何增强整个生产系统并推动实时制造流程&#xff1f; 达索系统专家通过实际案例&#xf…

Kimi精选提示词,总结PPT内容

大家好&#xff0c;我是子云&#xff0c;最近真是觉得Kimi这个大模型&#xff0c;产品体验很棒&#xff0c;能力也是不错&#xff0c;感觉产品经理用心了。 发现一个Kimi 一个小技巧&#xff0c;可以学习到很多高级提示词。 Kimi输入框可以配置常用提示词&#xff0c;同时也可…

上位机图像处理和嵌入式模块部署(qmacvisual亮度检测)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们说过&#xff0c;在机器视觉当中&#xff0c;对于光源的处理要非常小心。这里面不仅包括了选择什么样的光源&#xff0c;还取决于怎样使用…

美创科技获浙江省网络空间安全协会多项荣誉认可

4月2日&#xff0c;浙江省网络空间安全协会第二届会员大会第一次会议在杭州隆重召开&#xff0c;近180家会员单位代表、数十位特邀专家、嘉宾莅临现场。浙江省委网信办副主任马晓军出席会议并致辞&#xff0c;本次大会由协会秘书长吴铤主持。 凝心聚力&#xff0c;继往开来&…

鸿蒙OS开发实例:【应用状态变量共享】

平时在开发的过程中&#xff0c;我们会在应用中共享数据&#xff0c;在不同的页面间共享信息。虽然常用的共享信息&#xff0c;也可以通过不同页面中组件间信息共享的方式&#xff0c;但有时使用应用级别的状态管理会让开发工作变得简单。 根据不同的使用场景&#xff0c;ArkT…