C++后端编程 构建高性能后端的数据库、API 与 Web 服务器 8 使用 NGINX 管理 Web 服务器

Web 服务器概述

Web 服务器是 Web 应用程序运行的基础,充当用户交互与服务器端计算之间的关键纽带。 其主要功能是存储、处理并在请求时向客户端交付网页。 因此,它们对 Web 应用的性能、安全性和可扩展性起着至关重要的作用。
理解 Web 服务器的重要性要从认识基本的 Web 请求-响应周期开始。 当用户访问网页时,其浏览器会向托管该页面的服务器发送请求。 服务器随后处理该请求,定位所请求的资源,并将其发送回客户端浏览器进行显示。 没有 Web 服务器,这种交互就无法实现,访问 Web 内容也将成为不可能。
图 8.1 Web 服务器工作原理
在上述流程中,
● 客户端向 Web 服务器发送 HTTP 请求。
● Web 服务器将请求转发至应用服务器。
● 应用服务器查询数据库。
● 数据库将查询结果返回给应用服务器。
● 应用服务器将响应发送回 Web 服务器。
● 最后,Web 服务器将 HTTP 响应返回给客户端。
应用程序的性能还会受到其所使用的 Web 服务器的显著影响。 服务器处理请求并响应的速度会极大影响终端用户的体验。 服务器响应缓慢可能导致内容交付延迟,从而造成糟糕的用户体验。 另一方面,快速且优化良好的服务器能够更快地交付内容,从而带来更流畅愉悦的用户体验。
在安全方面,Web 服务器同样至关重要,这也是另一个极其重要的方面。Web 服务器负责确保客户端与自身之间数据传输的机密性。 它们可以通过 HTTPS 等协议加密保护敏感数据,限制漏洞,缓解攻击,并防止自身遭受攻击。 正因如此,拥有安全的 Web 服务器对于保持用户信任和防止数据泄露至关重要。
可扩展性是 Web 服务器另一个需要关注的重要特性。 随着 Web 应用程序的发展,它可能会吸引更多访问者,从而导致发送到服务器的请求数量增加。 可靠的 Web 服务器能够有效管理不断增长的负载,确保即使在其用户数量增加的情况下,应用程序仍能保持可访问性并高效运行。 此外,Web 服务器还配备各种附加功能,包括负载均衡、缓存、压缩等,这些都有助于提升应用程序的整体性能、可靠性和工作效率。
Nginx 是最知名的 Web 服务器之一,大量高流量网站都在使用它。 在接下来的章节中,我们将深入研究这款服务器。 它的卓越地位源于其高性能、稳定性、丰富的功能集、简洁的配置方式以及对系统资源的低消耗。 本章将引导您完成针对 C++后端应用的 Nginx 配置与优化,帮助您实现最高效的运行效果。

探索 Nginx

Nginx 是一款强大、高性能且灵活的开源软件,可用作 Web 服务器、反向代理、负载均衡器和 HTTP 缓存。 其诞生于 2000 年代初,旨在解决 C10K 问题——即服务器软件需要同时处理大量客户端连接的挑战。Nginx 的设计能够在最小内存占用下处理大量并发连接,使其特别适合需要支持数千甚至数百万并发连接的现代 Web 应用。
功能特性
Web 服务器
Nginx 能够非常高效地提供静态内容服务,这使其成为静态网站 Web 服务器的绝佳选择,也适合作为动态网站中处理静态内容的补充服务器。
反向代理
反向代理允许 Nginx 处理所有传入的网络流量并将请求转发到其他服务器。 此功能适用于负载均衡、卸载 SSL 连接或提供缓存内容。
负载均衡器
Nginx 能够将网络流量分发到多台服务器上,确保没有单台服务器过载。 支持的负载均衡技术包括轮询、最少连接和 IP 哈希。
HTTP 缓存
Nginx 可以存储 HTTP 请求的响应。 当客户端再次请求相同资源时,Nginx 会直接返回缓存的响应,从而减轻应用服务器负载并提供更快的响应速度。
邮件代理
Nginx 可作为 IMAP、POP3 和 SMTP 协议的代理服务器,并支持用户认证等附加功能。
组件
Nginx 由多个协同工作的组件组成,能高效处理客户端请求:以下是 Nginx 核心组件的深入解析:

图 8.2 Nginx 组件架构
主进程
主进程是 Nginx 应用的核心。 它负责读取和验证配置文件。 该进程控制工作进程并管理共享资源。 主进程还负责维护 Nginx 服务器的整体健康状态。 它会监控工作进程,并在工作进程失败时生成新的进程。 它还处理需要特权访问的任务,例如绑定端口和读取 SSL 证书。
工作进程
工作进程是 Nginx 的核心执行单元。 它们负责实际处理来自客户端的请求。 得益于 Nginx 的事件驱动架构,每个工作进程可同时处理数千个连接。 这与传统 Web 服务器形成鲜明对比——后者需要为每个连接创建新线程或进程,导致显著的开销。 工作进程负责建立网络连接、读写磁盘内容以及与上游服务器通信等任务。
缓存加载器
缓存加载器是 Nginx 启动时运行的进程,负责将磁盘缓存载入内存。 该进程会从磁盘读取现有缓存元数据,检查缓存数据的有效性,并将有效缓存项加载到内存中。 缓存加载器仅在 Nginx 启动时运行一次,完成内存缓存的初始化后即退出。
缓存管理器
缓存管理器是一个用于管理磁盘缓存大小的进程。 它通过移除旧的缓存条目来确保缓存大小始终保持在配置的限制范围内。 该进程会定期运行,通过清理过期条目或长期未被访问的条目来维护缓存。
上述组件协同工作,确保 Nginx 能够以最少的资源消耗处理大量并发请求。Nginx 的模块化事件驱动架构使其具备高性能、可扩展性和高效的资源利用率。
Nginx 的工作机制
Nginx 采用事件驱动架构,而非基于线程或进程的模型。 由于其非阻塞的事件驱动特性,每个 Nginx 工作进程都能处理数千个连接。 当请求到达时,工作进程处理完该请求后会立即返回等待更多连接,从而实现同时处理大量请求的能力。

 

图 8.3 Nginx 工作原理
Nginx 的典型工作流程包括主进程启动后根据配置生成工作进程。 当客户端发起请求时,其中一个工作进程会接受连接,处理请求(如提供静态文件或将请求转发至上游服务器),发送响应并关闭连接。 如果请求无法立即处理(例如需要从磁盘读取文件),Nginx 不会等待操作完成,而是立即切换到其他任务,比如处理另一个客户端请求。 这种非阻塞、异步的特性使得 Nginx 能够在有限资源下实现高性能,同时处理大量连接。

为 C++安装和配置 Nginx

安装和配置 Nginx 需要几个步骤。 以下是在 Linux 环境中操作的逐步指南。 如果您使用其他操作系统,过程应该类似,但可能需要相应调整部分命令。
更新系统
在安装任何软件包之前,最好先更新系统的默认应用程序。 您可以使用以下命令完成此操作:
sudo apt-get update
sudo apt-get upgrade
安装 Nginx
接下来,使用以下命令安装 Nginx:
sudo apt-get install nginx

启动 Nginx
安装完成后,您可以通过以下命令启动 Nginx:
sudo systemctl start nginx

您还可以使用以下命令设置 Nginx 开机自启:
sudo systemctl enable nginx

调整防火墙
如果启用了防火墙,您需要调整设置以允许 Nginx 正常运行。 可以使用以下命令实现:
sudo ufw app list

您将看到一个应用程序列表。 注意其中包含 Nginx Full、Nginx HTTP 和 Nginx HTTPS。 您可以通过以下命令允许 80 端口(标准 HTTP 流量)的通信:
sudo ufw allow 'Nginx HTTP'

使用以下命令验证更改:
sudo ufw status

验证安装
验证 Nginx 是否正确安装:
systemctl status nginx

您应该看到 Nginx 处于活动运行状态。 您还可以通过在 Web 浏览器中访问服务器 IP 地址来检查 Nginx 是否正常提供页面:
http://server_domain_or_IP

您应该能看到默认的 Nginx 欢迎页面。
配置 Nginx
Nginx 的主配置文件位于/etc/nginx/nginx.conf。 但建议使用服务器块(类似于 Apache 中的虚拟主机)来配置单个站点。 这些配置文件存放在/etc/nginx/sites-available/目录下。
一个站点服务器块的配置示例如下:
server {
   listen 80;
   server_name myblogapp.com;
   location / {
       root /var/www/myblogapp.com;
       index index.html;
   }
}
该区块监听 80 端口上对 myblogapp.com 的请求。 它从/var/www/myblogapp.com 目录提供文件,并将 index.html 作为目录索引呈现。
添加服务器区块后,您可以通过创建到 sites-enabled 目录的符号链接来启用它们:
sudo ln -s /etc/nginx/sites-available/myblogapp.com /etc/nginx/sites-enabled/

修改 Nginx 配置后,应检查配置是否存在语法错误:
sudo nginx -t

若未报错,即可将新配置重新加载到 Nginx 中:
sudo systemctl reload nginx

至此,Nginx 已安装并配置完成,可为您的 C++ 后端应用程序提供服务。
Nginx 与 C++ 后端集成
通过 FastCGI 协议(通用网关接口 CGI 的变体)可实现 Nginx 与 C++ 后端的集成。FastCGI 旨在减少 Web 服务器与 CGI 程序交互的开销,使服务器能同时处理更多网页请求。
要开始集成流程,首先需要安装 FastCGI 和 spawn-fcgi。FastCGI 是用于将交互式程序与 Web 服务器接口连接的二进制协议,而 spawn-fcgi 则是保持 FastCGI 进程存活的进程管理器。 这两者都可以通过操作系统的包管理器进行安装。
例如,在 Ubuntu 系统上,可以使用以下命令:
sudo apt-get update
sudo apt-get install libfcgi-dev spawn-fcgi
安装完 FastCGI 和 spawn-fcgi 后,下一步是将 C++应用程序配置为使用 FastCGI。 这包括在 C++代码中包含 FastCGI 库,并使用 FastCGI API 来处理请求和响应。
以下是一个使用 FastCGI 的简单 C++程序示例:
#include <iostream>
#include <fcgi_stdio.h>
int main() {
   while (FCGI_Accept() >= 0) {
       std::cout << "Content-type: text/html\r\n"
                 << "\r\n"
                 << "<html>\n"
                 << "<body>\n"
                 << "<p>Hello, world!</p>\n"
                 << "</body>\n"
                 << "</html>\n";
   }
   return 0;
}
该程序持续接收新的 FastCGI 请求,并以简单的 HTML 页面作为响应。 最后一步是配置 Nginx 通过 FastCGI 与您的 C++应用程序通信。 这需要在 Nginx 配置文件中为您的 C++应用程序添加一个 server 块。 在该 server 块中,使用 fastcgi_pass 指令来指定 FastCGI 服务器。
以下是一个示例:
server {
   listen 80;
   server_name example.com;
   location / {
       fastcgi_pass 127.0.0.1:9000;
       include fastcgi_params;
       fastcgi_param SCRIPT_FILENAME /path/to/your/app;
   }
}
在此配置中,Nginx 监听 example.com 域名 80 端口的请求。 当收到请求时,会将其传递给运行在 127.0.0.1:9000 上的 FastCGI 服务器。

反向代理

反向代理是一种位于网络服务器前端的服务器,它将客户端(例如网页浏览器)的请求转发给这些网络服务器。 反向代理用于实现负载均衡、网络加速和增强安全控制等功能。
反向代理的优势
反向代理的主要优势包括:
● 负载均衡:反向代理可以将客户端请求分发到多台服务器,从而减轻单台服务器的负载并确保冗余性。
● 增强安全性:反向代理服务器作为客户端从其他服务器获取资源的中介,可保护后端服务器免于直接暴露在互联网环境中。
● SSL 终止:通过解密传入请求并加密服务器响应,反向代理可释放原本用于加解密任务的服务器资源。
● 缓存功能:反向代理还可充当缓存服务器。 当请求网页时,反向代理可能返回存储的页面副本,而无需将请求转发至实际托管该页面的服务器。
使用 Nginx 配置反向代理
让我们来看看如何将 Nginx 设置为博客应用的反向代理。
首先,您需要安装 Nginx,这在前面的章节中已经介绍过。Nginx 安装完成后,就可以开始配置反向代理了。
具体步骤如下:
配置 Nginx
使用如下命令打开 Nginx 配置文件:
sudo nano /etc/nginx/sites-available/default

删除文件中所有现有内容,并替换为以下配置:
server {
   listen 80;
   location / {
       proxy_pass http://localhost:5000;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
   }
}
此配置告知 Nginx 将所有传入请求转发至运行在 5000 端口的博客应用。 请注意,如果您的应用地址和端口不同,请将 http://localhost:5000 替换为实际值。
检查并重新加载 Nginx 配置
使用以下命令检查配置更改的语法:
sudo nginx -t

如果语法正确,系统会显示"syntax is okay"。 如果存在问题,系统会提示您需要检查的位置。
准备就绪后,重新加载 Nginx 以应用更改:
sudo systemctl reload nginx

完成后,Nginx 现在将作为您博客应用程序的反向代理运行。 它将在 80 端口监听传入请求,并将这些请求转发至 5000 端口的应用程序。

处理 HTTPS 流量

处理 HTTPS 流量和高并发流量是使用 Nginx 管理应用程序的两个不同方面。 让我们分别解决它们。
管理 HTTPS 流量
要处理 HTTPS 流量,需要将 Nginx 配置为监听 443 端口(HTTPS 默认端口)并安装有效的 SSL 证书。
假设您已获得受信任证书颁发机构(CA)颁发的 SSL 证书,您需要添加如下配置:
server {
   listen 80;
   listen [::]:80;
   server_name your_domain www.your_domain;
   location / {
       return 301 https://$host$request_uri;
   }  
}
server {
   listen 443 ssl http2;
   listen [::]:443 ssl http2;
   server_name your_domain www.your_domain;
    ssl_certificate /etc/ssl/certs/your_domain.pem; # adjust for your certificate's location
    ssl_certificate_key /etc/ssl/private/your_domain.key; # adjust for your key's location
   location / {
       proxy_pass http://localhost:5000;
       proxy_http_version 1.1;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection 'upgrade';
       proxy_set_header Host $host;
       proxy_cache_bypass $http_upgrade;
   }
}
第一个服务器块监听 HTTP 连接并将其重定向至 HTTPS。 第二个服务器块处理 HTTPS 连接并将其代理至您的应用。
高流量处理
为应对高流量,可使用 Nginx 作为负载均衡器,将负载分配到多个后端服务器。 这要求您的应用程序需在多台服务器上运行。 以下是一个配置示例:
http {
   upstream backend {
       server backend1.myblogapp.com;
       server backend2.myblogapp.com;
       server backend3.myblogapp.com;
   }
   server {
       listen 80;
       location / {
           proxy_pass http://backend;
       }
   }
}
在此配置中,Nginx 被设置为将传入流量分发到三个不同的后端服务器。 这些服务器分别是 backend1.myblogapp.com、backend2.myblogapp.com 和 backend3.myblogapp.com。 默认情况下采用轮询方式进行分发,但可以通过多种指令修改此行为。
必须牢记,管理高流量不仅需要优化应用程序和数据库,还要确保服务器资源充足、监控系统问题等。 您可能还需要考虑使用内容分发网络(CDN)托管静态资源,或通过 Nginx 缓存响应来进一步减轻后端服务器的负载。

负载均衡器

概述
在 Web 应用中,负载均衡器是一种将流量分配到多台服务器的工具,确保没有单台服务器承受过大负载。 这能提高服务器架构的可靠性和效率。 当某台服务器宕机时,负载均衡器会将流量重定向到其他在线服务器。 当有新服务器加入服务器组时,负载均衡器会自动开始向其分配流量。
Nginx 除了作为 Web 服务器和反向代理服务器外,还可充当负载均衡器。 它能使用多种算法在后端服务器之间分配传入流量:
● 轮询(Round Robin)—— 请求按顺序分配到服务器组中的各个服务器。
● 最少连接(Least Connections)—— 新请求会被发送到当前客户端连接数最少的服务器。
● IP 哈希(IP Hash)—— 使用客户端的 IP 地址来决定由哪个服务器接收请求。
负载均衡器设置
在我们的博客应用场景中,若您在多台服务器上运行了多个应用实例,可使用 Nginx 在这些实例间实现负载均衡。 以下示例配置展示了如何采用轮询(Round Robin)方式设置 Nginx 作为负载均衡器:
http {
   upstream backend {
       server backend1.myblogapp.com;
       server backend2.myblogapp.com;
       server backend3.myblogapp.com;
   }
   server {
       listen 80;
       location / {
           proxy_pass http://backend;
       }
   }
}
此配置中,backend1.myblogapp.com、backend2.myblogapp.com 和 backend3.myblogapp.com 是运行博客应用的服务器。upstream 指令定义了后端服务器组。 在 server 块中,location 块指示 Nginx 将所有传入请求代理到后端组中定义的某台服务器。 服务器选择采用轮询方式。
如需使用最少连接(least connections)方法,可在 upstream 块中添加 least_conn 指令,如下所
http {
   upstream backend {
       least_conn;
       server backend1.myblogapp.com;
       server backend2.myblogapp.com;
       server backend3.myblogapp.com;
   }
   server {
       listen 80;
       location / {
           proxy_pass http://backend;
       }
   }
}
如果你想使用 IP 哈希方法,需要添加 ip_hash;指令:
http {
   upstream backend {
       ip_hash;
       server backend1.myblogapp.com;
       server backend2.myblogapp.com;
       server backend3.myblogapp.com;
   }
   server {
       listen 80;
       location / {
           proxy_pass http://backend;
       }
   }
}

SSL 配置

安全套接层(SSL)及其继任者传输层安全(TLS),是用于保护互联网数据传输安全的协议。 它们使用加密算法确保数据完整性和隐私性。SSL 证书为客户端(网页浏览器)提供验证服务器身份和建立安全连接的方式。
使用 Nginx 配置 SSL
为 Nginx 配置 SSL 可使服务器向客户端提供安全内容,增强用户对您博客应用的信任和隐私保护。
以下是配置 Nginx SSL 的一般步骤:

 

图 8.4 使用 Nginx 配置 SSL
获取 SSL 证书
您需要从证书颁发机构(CA)获取 SSL 证书。 许多 CA 提供免费证书,例如 Let's Encrypt。 如需更全面的解决方案,您可能需要从可信提供商处购买证书。
安装证书
获取 SSL 证书后,通常会包含.crt(或.pem)和.key 文件。 您需要将这些文件上传至服务器。 通常它们存储在/etc/ssl/目录下。
配置 Nginx 使用证书
证书安装完成后,需配置 Nginx 使用该证书。 打开 Nginx 配置文件(通常位于/etc/nginx/nginx.conf 或/etc/nginx/sites-available/default),在服务您站点的 server 块中添加以下内容:
server {
   listen 443 ssl;
   server_name myblogapp.com;
   ssl_certificate /etc/ssl/your_domain_name.pem; # or .crt
   ssl_certificate_key /etc/ssl/your_domain_name.key;
   location / {
       proxy_pass http://localhost:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }
}
将 ssl_certificate 和 ssl_certificate_key 中的路径替换为您的 SSL 证书和密钥文件的实际路径。
重启 Nginx
更新配置后,保存更改并退出文本编辑器。 测试配置以验证是否存在语法错误:
sudo nginx -t

如果测试成功,请重启 Nginx 以应用更改:

sudo systemctl restart nginx

配置 Nginx 使用 SSL 后,您可以通过访问网站并确认 URL 以"https://"开头来验证一切是否正常运行。 这表明您的站点正在使用 HTTPS 协议,意味着 SSL 已启用。

此外,当您访问启用 SSL 的网站时,大多数现代网页浏览器会在地址栏显示锁形图标。 点击此锁形图标通常会显示有关 SSL 证书的更多信息,包括颁发机构和证书签发的域名。
在设置 SSL 之前,请确保您的域名已正确指向服务器的公网 IP 地址。SSL 证书是针对特定域名颁发的。 如果域名与证书颁发时指定的不匹配,证书将无法正常工作,用户访问您的网站时会看到安全警告。

管理静态与动态资源

Nginx 可以成为博客应用中提供动态内容和资源的非常有效的工具。 其设计能够以低内存占用处理大量并发连接,这使其特别适合提供 CSS、JavaScript 和图像文件等静态资源。 但借助代理功能,它同样能高效地提供动态内容。
提供静态内容
在典型 Web 应用中,图像、CSS 和 JavaScript 文件等静态内容通常从应用结构的特定目录提供。Nginx 作为强大而灵活的 Web 服务器,可配置为高效地提供这些静态文件。
要在 Nginx 中提供静态内容服务,您需要在 Nginx 配置文件中定义一个 location 块。 该代码块告知 Nginx,任何匹配特定模式的资源请求都应从服务器上的指定目录提供服务。
以下是一个配置示例:
server {
   listen 80;
   server_name myblogapp.com;
   location /static/ {
       alias /path/to/your/static/files/;
   }
   location / {
       proxy_pass http://localhost:8080;
   }
}
在上述示例中,任何以 http://myblogapp.com/static/开头的请求都将由 Nginx 直接从 alias 指令指定的目录(/path/to/your/static/files/)提供。 这可以显著提升应用程序的加载速度,因为 Nginx 在处理静态文件方面非常高效。
动态内容服务
对于动态内容交付,Nginx 可配置为反向代理。 这意味着 Nginx 会将客户端请求转发至能够处理这些请求的实际服务器(您的应用程序),然后将响应回传给客户端。 当您的应用服务器运行在特定端口(例如 8080 端口),而您希望通过标准 HTTP 或 HTTPS 端口(80 或 443)访问时,这项功能特别有用。
以下是 Nginx 为运行在 8080 端口的 Web 应用程序执行反向代理功能的一种可能配置示例:
server {
   listen 80;
   server_name myblogapp.com;
   location / {
       proxy_pass http://localhost:8080;
       proxy_set_header Host $host;
       proxy_set_header X-Real-IP $remote_addr;
       proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
       proxy_set_header X-Forwarded-Proto $scheme;
   }
}
以上配置旨在将所有传入的 HTTP 请求路由到运行在 localhost:8080 的后端应用程序。 在此设置中,Nginx 充当中介,将请求转发给应用程序,等待应用程序生成响应,然后将该响应返回给客户端。 此过程称为代理。
需要注意的是,对 Nginx 配置文件所做的任何修改都需要进行语法检查并重启 Nginx 服务才能使更改生效。 您可以使用命令 sudo nginx -t 检查配置文件的语法。 如果语法正确,您可以使用 sudo systemctl restart nginx 重启 Nginx。

总结

本章重点探讨 Nginx,通过它我们深入理解了 Web 服务器在全栈应用架构中的关键作用。 这款多功能开源软件既可用作 Web 服务器,也能充当反向代理、负载均衡器和 HTTP 缓存。Nginx 功能十分强大。 其高性能、稳定性、丰富功能集、简洁配置方式及高效资源利用特性广受赞誉。 我们逐步分解并详细说明了在 C++开发环境中安装配置 Nginx 的完整流程。
我们深入探讨了如何利用 Nginx 为博客应用配置反向代理的细节。 反向代理是一种位于 Web 服务器前端的服务器类型,它将客户端请求转发至其后端的 Web 服务器。 这能实现对流量更精细的控制,从而提供更强的安全性、负载均衡能力,以及动态添加、移除或升级服务器的灵活性。 我们还熟悉了使用 Nginx 管理高流量和 HTTPS 连接的技巧,这揭示了该服务器在仅消耗少量内存的情况下,仍能出色地处理大量并发连接的能力。
本章后半部分主要聚焦于 Nginx 的 SSL 配置与负载均衡设置。 负载均衡是大型应用的核心组件,它能将网络流量最优分配到多台服务器,避免单台服务器成为性能瓶颈导致整体应用延迟。 使用 Nginx 可以更简单高效地实现负载均衡。 此外还探讨了 SSL 配置流程,详述了建立安全数据传输连接的必要步骤。 最后我们演示了如何在博客应用中运用 Nginx 提供动态内容/资源服务,展现了 Nginx 管理静态与动态内容的多功能性。 这是本章讨论的最后一个主题。 凭借诸多实用功能,Nginx 堪称后端开发的绝佳选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

akluse

失业老程序员求打赏,求买包子钱

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值