一个决策树项目中的数据处理

因为要使用决策树,没法对非数值进行处理,所以需要把dataframe中的一些数据转换成数值,使用了如下code

from sklearn.preprocessing import LabelEncoder
from collections import defaultdict
d = defaultdict(LabelEncoder)

X_trans = X.apply(lambda x: d[x.name].fit_transform(x))
X_trans.head()

ChatGPT4解释如下

The expression lambda x: d[x.name].fit_transform(x) is a compact way of applying a function to each column of a pandas DataFrame. Let’s dissect this expression further to understand how it works in the context of transforming categorical data into numerical format using LabelEncoder in a Python environment.

The lambda Function

A lambda function in Python is a small anonymous function defined with the keyword lambda. The syntax is:

lambda arguments: expression

In this case, the lambda function has one argument x (representing a column of the DataFrame) and the expression involves applying the fit_transform method from a LabelEncoder instance to x.

How the lambda Function is Applied

  • x: Within the context of the apply() method, x represents each column in the DataFrame one at a time. For instance, if the DataFrame has columns "Color" and "Size", x will be the "Color" column data in one iteration and the "Size" column data in the next.

Usage of d[x.name]

  • d: This is a defaultdict containing instances of LabelEncoder. The use of defaultdict ensures that if a LabelEncoder for a particular column name does not exist, it will automatically create a new LabelEncoder instance without raising an error.

  • x.name: This attribute fetches the name of the column currently being processed (like "Color" or "Size").

  • d[x.name]: This retrieves the LabelEncoder instance for the column named x.name. If it’s the first time this column is being accessed, defaultdict initializes a new LabelEncoder for this key.

The fit_transform Method

  • fit_transform(): This method is part of LabelEncoder and serves a dual purpose:
    • fit: It learns the mapping from the labels in the column to integers. For example, for a column with labels ["Red", "Blue", "Green"], it might learn the mapping Red -> 0, Blue -> 1, Green -> 2.
    • transform: It then transforms the labels into these integers based on the mapping it has learned.

Putting It All Together

When you call X.apply(lambda x: d[x.name].fit_transform(x)), it performs the following steps for each column in DataFrame X:

  • Accesses each column as x.
  • Fetches the LabelEncoder for that column by x.name.
  • Applies fit_transform to the column, converting text labels into integers.
  • Returns a new DataFrame where each text label has been replaced by an integer.

This method is particularly useful when preparing data for machine learning models, which generally require numeric input features rather than text labels. The transformation is done in-place and efficiently for each column, utilizing the flexibility of defaultdict and the functionality of LabelEncoder.

ChatGPT4 对比服务器性能差异

CPU服务器

对比这两组服务器的规格,我们可以从性能、功能和适用场景等角度进行分析:

CPU性能
第一组服务器:
CPU设计为单一Die,有助于降低内部延迟,提高处理效率。
每颗CPU拥有至少28核心,主频达到2.6GHz,缓存容量至少42MB。
支持AVX512指令集,适合进行高强度的计算任务,如科学计算和工程模拟。
国产设备:
每颗CPU核心数至少32核,主频2.2GHz,缓存容量至少64MB,高于第一组服务器。
支持8个DDR4内存通道,相当于第一组服务器。
分析:国产设备的CPU在核心数量和缓存容量上优于第一组服务器,但主频略低,可能影响单核任务的执行效率。

内存配置
第一组服务器:
至少4条内存,每条32GB,频率3200MHz,支持ECC校验。
国产设备:
至少8条内存,同样的容量和频率,支持ECC校验。
分析:国产设备在内存数量上更具优势,这可能对运行大规模数据库或内存密集型应用更有利。

存储配置
第一组服务器:
系统盘:≥960GB SSD,SATA接口。
数据盘:PCIe 4.0接口,≥3.84TB SSD,连续读取速率≥6500MB/s。
国产设备:
系统盘:≥480GB SSD,SATA接口。
数据盘:SATA接口,≥1.92TB SSD。
分析:第一组服务器的数据盘具有更高的存储容量和显著更快的读取速率,更适合需求高速数据处理的场景,如高性能计算和大数据分析。

网络和阵列卡
两组服务器在网络配置相同:均配备双光口万兆网卡,支持bond0,适合高速网络环境。
阵列卡:
第一组服务器阵列卡缓存1G以上。
国产设备阵列卡缓存2G以上,更有利于大规模数据处理和缓冲。
适用场景:

第一组服务器:适合需要高计算性能和高速数据访问的应用,如科学研究、图形渲染和金融模型计算。
国产设备:由于其更多的内存和更大的阵列卡缓存,更适合数据密集型任务和大规模多任务处理,例如云服务和大型企业级应用。
综合来看,两组服务器各有优势,具体选择应根据实际需求和预算考虑。国产设备在内存和缓存方面的优势可能为特定用途提供了更好的性价比。

GPU服务器

继续对比这两组服务器的规格,我们可以深入分析它们的性能、功能以及潜在的适用场景:

CPU性能
第一组服务器与第二组服务器在CPU规格上基本一致:
都配备了两颗CPU,每颗CPU核心数至少24核,主频至少2.2GHz,缓存至少64MB。
这种配置提供了均衡的多核和单核处理能力,适合广泛的应用。
内存配置
内存规格完全一致:
两组服务器都配置有8条32GB DDR4内存,频率3200MHz,支持ECC校验。
这样的内存配置可以有效支持大规模数据处理和复杂的计算需求。
GPU配置
第一组服务器:
搭载8张H800 GPU,但未详述其性能规格。
第二组服务器:
明确要求整机算力不低于768 TFlops的半精度算力,显存总量不低于128GB,显存带宽不低于800GB/s,支持高带宽的卡间互连(不低于192GB/s)。
这样的GPU配置非常适合于高性能计算、深度学习和复杂的图形处理。
存储配置
系统盘和数据盘:
两组服务器在系统盘和数据盘的配置上几乎相同,均为SATA接口SSD,系统盘≥480GB,数据盘容量≥1.92TB。
网络和阵列卡
网络配置相同:
均配备双光口万兆网卡,支持bond0,确保高速稳定的网络连接。
阵列卡配置略有差异:
第一组服务器阵列卡缓存1G以上。
第二组服务器阵列卡缓存2G以上,对于需要高速数据写入和读取的应用来说,更大的缓存可以提供更好的性能。
适用场景
第一组服务器:
由于未详细描述GPU性能,这组服务器可能适合通用的数据中心应用,如虚拟化、数据库管理和中等规模的计算需求。
第二组服务器:
明确的高性能GPU配置使其非常适合于AI训练、科学计算和任何需要大规模并行处理的场景。
综上,第二组服务器在GPU性能上明显优于第一组,特别是在处理高负载的计算密集型任务时。这种配置的机器特别适用于需要高度计算资源的专业领域,例如人工智能、模拟和高性能计算(HPC)领域。

奇怪的问题

chatGPT4 付费版本,似乎没法通过网络搜索获得H800这个阉割版的具体数据,而kimi则展现了灵活务实的一面,给出下面的回答
来自kimi的回答

根据搜索结果中的信息,H800 GPU 的具体半精度算力(FP16)没有直接给出。然而,从搜索结果中我们可以推断一些相关信息。在该搜索结果中提到,H800 的算力水平约等于 A100 的 50% 和 H100 的 15%。由于 H100 GPU 在 FP16 精度下的算力是 4 petaflops,我们可以据此推算 H800 GPU 的大致半精度算力。

如果 H800 的算力是 H100 的 15%,那么 H800 的 FP16 算力将是:

\[ 4 \text{ petaflops} \times 0.15 = 0.6 \text{ petaflops} \]

即 H800 GPU 的半精度算力大约是 0.6 petaflops。请注意,这是一个基于现有信息推算的结果,并非直接从搜索结果中得到的具体数值。

nim意欲何为

为了了解nim意欲何为,我从下面几篇文章里摘录了感兴趣的观点,首先是我在gtc线上会议拍摄的照片

英伟达利用nim加速生成式AI

Nvidia Looks to Accelerate GenAI Adoption with NIM

kimi的答复:

如果您只是在单机或者边缘设备上使用Nvidia Inference Microservice(NIM),您可能不需要Helm。Helm是一个Kubernetes的包管理工具,它主要用于自动化Kubernetes环境中的应用程序部署。当您在单机或边缘设备上使用NIM时,您的环境可能不依赖于Kubernetes,因此也就不需要Helm来进行部署和管理。

在这种情况下,您可以直接部署NIM作为一个容器化的微服务,或者将其集成到您现有的基础设施中。NIM的设计允许它灵活地适应不同的部署场景,包括但不限于Kubernetes集群、云环境、虚拟机或物理机。这样,无论您是在数据中心、私有云还是边缘计算环境中,都可以利用NIM来加速AI推理任务。

此外,NIM的容器化特性意味着它可以轻松地在不同的环境中迁移和运行,而不需要对底层基础设施进行大量的修改。这种灵活性使得NIM成为在多种计算环境中部署AI模型的理想选择。

总之,如果您的使用场景不涉及Kubernetes集群,那么您不需要Helm。您可以直接部署和运行NIM,或者将其集成到您的单机或边缘设备环境中,以实现高效的AI推理。

从“推理服务”到“推理微服务”

What’s a NIM? Nvidia Inference Microservices is new approach to gen AI model deployment that could change the industry

  • Nvidia Inference Microservices (NIM),
    which packages optimized inference engines, industry-standard APIs and support for AI models into containers for easy deployment。While NIM provides prebuilt models, it also allows organizations to bring their own proprietary data and will support and help to accelerate Retrieval Augmented Generation (RAG) deployment.
What exactly is Nvidia NIM?

At the most basic level, a NIM is a container full of microservices. 

The container can include any type of model, ranging from open to proprietary models, that can run anywhere there is an Nvidia GPU — be that in the cloud, or even just in a laptop. In turn, that container can be deployed anywhere a container can run, 
* which could be a Kubernetes deployment in the cloud, 
* a Linux server or 
* even a serverless Function-as-a-Service model. Nvidia will have the serverless function approach on its new ai.nvidia.com website, where developers can go to begin working with NIM prior to deployment.

To be clear, a NIM isn’t a replacement for any prior approach to model delivery from Nvidia. It’s a container that includes a highly optimized model for Nvidia GPUs along with the necessary technologies to improve inference.
  • 更好支持RAG
The RAG approach will benefit from the integration of NVIDIA NeMo Retriever microservices inside of NIM deployments. NeMo Retriever is a technology that Nvidia announced in November 2023 as an approach to help enable RAG with an optimized approach for data retrieval.

除了langchain,llamaindex,现在又冒出一家应用框架公司deepset

英伟达nim网站
https://www.nvidia.com/en-us/ai/

https://build.nvidia.com/mistralai/mixtral-8x7b-instruct

GCP的免费金和免费服务的区别

CGP的spot vm,不支持使用free tair credits,吓我一跳

实际是庸人自扰,因为我把free tier和free credits混淆在了一起。

  • free tier指用户可以免费、限量、限品种的使用部分google的服务,例如地图、计算资源等
  • free credits指用户可以在注册成功后的90天内,免费获得300美金来购买google的各项服务。

重新创建GCP instance并安装

夭折的GCP instance

  • 因为不知道什么原因,我在google cloud上的第一个instance(20240215,春节期间申请)被停机了,无法重启,官方给出的说明如下:
  • 分析:是在设置vpn network的firewall rule时,按照eve安装文档要求,新增了定制的egress流量(outband),其中tcp协议是全部端口(0-65535),来源ip是所有范围(ipv4,0.0.0.0/0),所以造成instance运行没两天,就被强制停机。
  • 没办法,我一方面发邮件给google cloud的support发了邮件,同时也思考解决方案。邮件很快有回复
    这并没有什么卵用,我除了礼貌感谢外,没有其他办法。
  • 还好这是云啊,直接删除instance,重新安装部署(可怜短短几天,85加币就没有了)

重新创建GCP的instance

  • 按照eve要求,重新创建具有vmx功能的虚拟机,也就是nested套娃虚拟机;
  • 这次特地选择了vm是spot vm,是所有vm中的丐中丐,价格据说off 60%,代价是随时会被停机,下面是介绍
This page describes Spot VMs: virtual machine (VM) instances that are excess Compute Engine capacity. Spot VMs have significant discounts, but Compute Engine might preemptively stop or delete (preempt) Spot VMs to reclaim the capacity at any time. Spot VMs are the latest version of preemptible VMs.

The provisioning model of a VM affects its discounts and availability; Compute Engine VMs can use either the standard provisioning model (standard VMs) (default) or the spot provisioning model (Spot VMs). In contrast to standard VMs, Spot VMs are available at much lower prices but have lower availability because they are subject to preemption. Use Spot VMs to reduce costs for fault-tolerant workloads.

To learn more about Compute Engine VMs in general, read the Virtual machine instances documentation. To learn how to create Spot VMs, read Create and use Spot VMs.

What are Spot VMs?

Spot VMs are available at much lower prices—60-91% discounts for most machine types and GPUs as well as smaller discounts for local SSDs and A3 VMs—compared to the on-demand price for standard VMs. However, Compute Engine might preempt Spot VMs at any time, such as when it needs the resources for other tasks. At this uncertain preemption time, Compute Engine either stops (default) or deletes your Spot VMs depending on your specified termination action for each Spot VM. Spot VMs are excess Compute Engine capacity, so their availability varies based on Compute Engine usage. Spot VMs do not have a minimum or maximum runtime unless you specifically limit the runtime.

If your workloads are fault-tolerant and can withstand possible VM preemption, Spot VMs can reduce your Compute Engine costs significantly. For example, batch processing jobs can run on Spot VMs. If some of those VMs stop during processing, the job slows but does not completely stop. Spot VMs complete your batch processing tasks without placing additional load on your existing VMs and without requiring you to pay full price for additional standard VMs.

  • 我们可以看到,在spot模式下,google vm可以便宜到0.01美元每小时
    *

  • 下面是我的选择

  • 还可以更加丧心病狂,因为spot停机后是不收费的(硬盘和静态ip需要收费),那么我们再来一个定期停机,一切就完美了。
    当完成定期计划来启停机器时,会出现如下告警

Compute Engine System service account service-111462968063@compute-system.iam.gserviceaccount.com needs to have [compute.instances.start] permissions applied in order to perform this operation.

参考下面的方案就能解决
Solution:

  • Login to the Google Cloud Console
  • To to IAM & Admin
  • Select IAM in the left panel
  • Click the box Include Google-provided role grants on the right side of the window. This enables showing Google-managed service accounts.
  • Locate the service account. Press CTRL-F5 to open a search box. Enter the text compute-system.
  • Click the pencil icon to edit the service account.
  • Click ADD ANOTHER ROLE
  • In the role filter enter Compute. Select Compute Instance Admin (v1).
  • Click SAVE

Wait a few minutes before trying to use the new permissions.

  • 完成后上传交换机的os文件(见下面章节)
  • 安装eve,并启动
  • eve界面启动后,添加node,启动switch都正常,但是telnet无法工作(ssh正常)
    • firewall rule添加ingress,tcp 23,无效
    • firewall rule添加egress,tcp 23,无效
    • firewall rule添加ingress,tcp 0-65535,ip 0.0.0.0/0,telnet成功!

上传交换机和路由器的系统文件

  1. Cisco的iol/ios镜像文件

    1. 把iol文件,后缀是bin,上传到目录:/opt/unetlab/addons/iol/bin/
    2. 使用如下命令来修改权限(切记)
    /opt/unetlab/wrappers/unl_wrapper -a fixpermissions
    
    1. 运行授权文件No need to fix the permission of the license file as we will run this file using the python program. Run command
    python3     CiscoIOUKeygen3f.py
    
    1. 使用如下命令来测试iou/ios文件是否安装成功
    cd /opt/unetlab/addons/iol/bin
    touch NETMAP
    LD_LIBRARY_PATH=/opt/unetlab/addons/iol/lib /opt/unetlab/addons/iol/bin/<iosname.bin> 1
    
    ***************************************************************
    IOS On Unix - Cisco Systems confidential, internal use only
    Under no circumstances is this software to be provided to any
    non Cisco staff or customers.  To do so is likely to result
    in disciplinary action. Please refer to the IOU Usage policy at
    wwwin-iou.cisco.com for more information.
    ***************************************************************
    
                  Restricted Rights Legend
    
    Use, duplication, or disclosure by the Government is
    subject to restrictions as set forth in subparagraph
    (c) of the Commercial Computer Software - Restricted
    Rights clause at FAR sec. 52.227-19 and subparagraph
    (c) (1) (ii) of the Rights in Technical Data and Computer
    Software clause at DFARS sec. 252.227-7013.
    
               cisco Systems, Inc.
               170 West Tasman Drive
               San Jose, California 95134-1706
    
  2. Cisco的其他镜像文件
    1.

  3. 华为的镜像文件
    1.

  4. 华三的镜像文件
    1.

oracle cloud and google cloud

春节在家,一直到初五都没闲着,这几天主要是在折腾eve-ng,装了2台mac电脑,还有一个google cloud,用下来还是gcp给力,毕竟300美金不是闹着玩的。

oracle cloud

说google cloud的之前,得先唠叨下我去年申请的oracle cloud,号称永久免费的云,虽然配置不怎么地,胜在免费,用下来挺不错,唯一不爽的是一直要登录oracle的shell,今天突然发现,使用token的方式,与ssh密码登录是不矛盾的,只能怪自己学艺不精吧

vi /etc/ssh/sshd.conf

在上面的配置文件里,修改两个地方

  • PasswordAuthentication yes
  • Passwordlogin yes

然后重新启动ssh服务

systemctl restart sshd

就可以实现ssh登录了

google cloud

为什么要折腾google cloud呢?按理说我自己的目标是在aws找一个网工的职业,在苦寒之地可以不用洗盘子和在超市搬货。所以在我寻找eve-ng这个软件的部署方式时,突然发现原来是可以在云主机上部署的,唯一的特殊要求是,需要支持nested,也就是在虚拟机套娃(在一台虚拟机里,再安装一台虚拟机),这个时候就要用到一个比较特殊的技术,vmx,也就是允许虚拟机把硬件资源开放出来,让套娃虚拟机继续使用,和我们搞gpu的passthrough很类似,很可惜,国内的阿里云是不支持这样做的,目测下来只有google cloud支持的比较好。

所以早晨抓紧时间,利用目前google的优惠政策,申请了一台3个月的免费主机,算下来,3个月我也能在网络技术方面小有所成了。

下面是这次的几个心得

  1. 申请ecs的时候,选4个vcpu,16g内存,因为eve可能要支持100个node,每个node也许就要部署一个1G的镜像包 ,性能太差就玩不起来;
  2. 硬盘可以选的差一点,我直接用了standard,而不是ssd,每个月50G可以省7美金,用下来觉得自己真是会精打细算;
  3. cpu架构一定要选intel的cascade或skylake,一方面便宜,另外对vmx支持比较好
  4. 3个月biling大概350加币,马上就要突破300美金了,有一点点紧迫的感觉
  5. 云主机创建完成,会发现ssh的环境和cloud shell的环境不同,ssh上的是ubuntu20的环境,这就是套娃虚拟机的系统,是用eve官网给的命令安装的;而google cloud的环境是debian的系统,内核版本很高,关于这两个环境不不同的原因我还没有搞的很清楚,毕竟整个ecs创建的过程中,没有让我选择os啊?

20G disk space is not mounted!

今天打算在阿里云上安装eve-ng,感觉磁盘空间可能不足,打开控制台,发现还有一个20G的数据盘,觉得勉强够用,就直接在终端上通过lsblk查看

[MDaliyun ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0    7:0    0 63.5M  1 loop /snap/core20/2015
loop2    7:2    0 40.4M  1 loop /snap/snapd/20671
loop3    7:3    0 11.9M  1 loop /snap/kubectl/3164
loop4    7:4    0 63.9M  1 loop /snap/core20/2105
loop5    7:5    0 40.9M  1 loop /snap/snapd/20290
loop6    7:6    0 11.9M  1 loop /snap/kubectl/3149
vda    252:0    0   40G  0 disk 
└─vda1 252:1    0   40G  0 part /
vdb    252:16   0   20G  0 disk 

好家伙,这一看不要紧,发现vdb这块盘虽然启动2年了,但是一直没有挂载,就这么白白浪费了2年!
马上格式化,挂载,把它用起来,为了省事,直接让chatgpt出马:

The output /dev/vdb: data from the file -s /dev/vdb command indicates that the /dev/vdb block device does not have a recognizable filesystem or partition table. This typically means that the disk is either unformatted or contains raw data that is not structured in a manner recognized by the file command.

Given this situation, if you intend to use /dev/vdb for storage, the next steps would involve creating a filesystem on it. Here's how you can do it:

Create a Filesystem on /dev/vdb
Choose a Filesystem Type: Decide on the type of filesystem you want to create. Common choices include ext4 for general use, xfs for high-performance environments, and btrfs for systems requiring advanced features like snapshotting.
Create the Filesystem: Use the mkfs command to create a filesystem. For example, to create an ext4 filesystem on /dev/vdb, you would use:
bash
Copy code
mkfs.ext4 /dev/vdb
Replace ext4 with your filesystem of choice if different.
Mount the Filesystem
After creating the filesystem, you can mount it to make the storage available for use:

Create a Mount Point: This is the directory where the disk's contents will be accessible. For example, to create a mount point at /mnt/data, use:
bash
Copy code
mkdir /mnt/data
Mount the Disk: Mount the newly formatted disk to the mount point:
bash
Copy code
mount /dev/vdb /mnt/data
Ensure Persistent Mounting Across Reboots
To automatically mount the disk after a reboot, you'll need to add an entry to the /etc/fstab file:

Find the UUID of /dev/vdb: The UUID is a unique identifier for the disk, which is preferable to use in the /etc/fstab file instead of the device name (/dev/vdb) since it won't change between reboots.
bash
Copy code
blkid /dev/vdb
Edit /etc/fstab: Add a line to this file with the disk's UUID and mount information. Open the file in a text editor (like nano or vi), and add a line similar to:
plaintext
Copy code
UUID=<your-uuid> /mnt/data ext4 defaults 0 2
Replace <your-uuid> with the actual UUID you obtained from the blkid command.

使用mkfs.ext4这个命令,作为通用存储,结果如下:

[MDaliyun ~]# mkfs.ext4 /dev/vdb
mke2fs 1.45.5 (07-Jan-2020)
Creating filesystem with 5242880 4k blocks and 1310720 inodes
Filesystem UUID: 811e4057-5c8b-45e2-8fb9-40e023ec72cc
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done   

然后挂在在data下面:

[MDaliyun /]# mkdir /mnt/data
/
[MDaliyun /]# file -s /dev/vdb  
/dev/vdb: Linux rev 1.0 ext4 filesystem data, UUID=811e4057-5c8b-45e2-8fb9-40e023ec72cc (extents) (64bit) (large files) (huge files)
[MDaliyun /]# mount /dev/vdb /mnt/data
[MDaliyun /]# blkid /dev/vdb
/dev/vdb: UUID="811e4057-5c8b-45e2-8fb9-40e023ec72cc" TYPE="ext4"

再使用lsblk看看,成功了

不过正事还没有完,eve-ng是虚拟机,没法在已经虚拟化的机器上安装(阿里云不支持vmx,也就是硬件已经使用了一次kvm的vmx,虚拟机里就无法支持二次的vmx了),但是我的本地电脑也没有空间继续安装vmware,如何是好?

https://zhuanlan.zhihu.com/p/548997684
我们知道,在Intel处理器上,KVM使用Intel的vmx(virtul machine eXtensions)来提高虚拟机性能, 即硬件辅助虚拟化技术, 现在如果我们需要测试一个openstack集群,又或者单纯的需要多台具备"vmx"支持的主机, 但是又没有太多物理服务器可使用, 如果我们的虚拟机能够和物理机一样支持"vmx",那么问题就解决了,而正常情况下,一台虚拟机无法使自己成为一个hypervisors并在其上再次安装虚拟机,因为这些虚拟机并不支持"vmx"

嵌套式虚拟nested是一个可通过内核参数来启用的功能。它能够使一台虚拟机具有物理机CPU特性,支持vmx或者svm(AMD)硬件虚拟化。

untitled

The curly brackets {} in Python have different meanings depending on the context. Here are some common uses of {} in Python:

Dictionary literals:

A dictionary is a data structure that stores key-value pairs. You can create a dictionary by using curly brackets and separating the keys and values by colons. For example, person = {"name": "Alice", "age": 25} creates a dictionary with two keys: “name” and “age”, and their corresponding values: “Alice” and 25.

Set literals:

A set is a data structure that stores unique and unordered elements. You can create a set by using curly brackets and separating the elements by commas. For example, colors = {"red", "green", "blue"} creates a set with three elements: “red”, “green”, and “blue”.

String formatting:

You can use curly brackets as placeholders for variables or expressions in a string. You can then use the format() method to replace the placeholders with the desired values. For example, print("Hello, {}!".format("world")) prints “Hello, world!” to the console. You can also use numbers or keywords inside the curly brackets to specify the order or name of the arguments. For example, print("The area of a circle with radius {r} is {a:.2f}".format(r=5, a=3.14*5**2)) prints “The area of a circle with radius 5 is 78.50” to the console.

Nginx反向代理服务器配置

Nginx 可以作为非常强大的反向代理服务器,下面是一个简单的 Nginx 反向代理的配置示例以及对应的详细解释:

nginx
Copy code
http {
    upstream backend {
        server backend1.example.com;
        server backend2.example.com;
    }

    server {
        listen 80;
        server_name www.example.com;

        location / {
            proxy_pass http://backend;
            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 块:

这是 Nginx 配置中的顶级块,用于包含 HTTP 服务器的配置。
upstream backend 块:
这个块定义了一个名为 backend 的服务器组,可以包含一个或多个服务器。
server backend1.example.com; 和 server backend2.example.com; 行指定了组成这个服务器组的后端服务器的地址。这些服务器可以是其他 Nginx 服务器,也可以是任何能够处理 HTTP 请求的服务器。

server 块:

这个块定义了一个虚拟服务器,用于处理进入的 HTTP 请求。
listen 80; 行告诉 Nginx 在端口 80 上监听请求,这是 HTTP 的默认端口。
server_name www.example.com; 行定义了服务器的域名。

location / 块:

location 块用于定义当请求匹配特定模式时应如何处理这些请求。在这个例子中,/ 指的是匹配所有请求。
proxy_pass http://backend; 行指定将请求转发到名为 backend 的上游服务器组。这意味着所有到达此 Nginx 服务器的 HTTP 请求都会被转发到 backend1.example.com 或 backend2.example.com。

proxy_set_header 指令:

这些指令用于修改或添加传递给后端服务器的 HTTP 请求头。
Host $host; 将请求头中的 Host 设置为客户端请求中的 Host 值。
X-Real-IP $remote_addr; 添加了一个自定义请求头,包含客户端的 IP 地址。
X-Forwarded-For $proxy_add_x_forwarded_for; 添加了一个请求头,包含原始请求的 IP 地址链。这对于在后端服务器上记录正确的客户端 IP 地址很重要。
X-Forwarded-Proto $scheme; 添加了一个请求头,标明了客户端是使用 HTTP 还是 HTTPS 协议。

通过上述配置,Nginx 会将所有到达 www.example.com 的请求转发到两个后端服务器之一,并保持客户端的原始 IP 地址和其它相关信息,使得后端服务器能够获取到正确的客户端信息。