使用LXD搭建Web网站

news/2024/4/29 16:24:44/文章来源:https://blog.csdn.net/weixin_34160277/article/details/88763845

欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~

本文由独木桥先生 发表于云+社区专栏

介绍

Linux的容器是Linux的一组进程,通过使用Linux内核功能与系统隔离。它是一个类似于虚拟机的构造,但它的更轻量级。您可以在同一台服务器上轻松创建多个容器。使用Linux容器,您可以在同一服务器上运行多个实例,或者将应用程序及其依赖项捆绑到容器中,而不会影响系统的其余部分。

假设您有一台服务器,并且已为您的客户设置了多项服务,按照Web应用来说,每个Web站点都是Apache或NginxWeb服务器的同一实例的虚拟主机。但是对于Linux容器,每个网站都在其自己的容器中配置,并具有自己的Web服务器。我们可以使用LXD来创建和管理这些容器。LXD提供管生命周期的容器管理。

在本教程中,您将使用LXD在同一服务器上安装两个基于Nginx的网站,每个网站都限制在自己的容器中。然后,您将在第三个容器中安装HAProxy,该容器将充当反向代理。然后,您将网站路由到HAProxy容器,以便从Internet访问这两个网站。

准备

要完成本教程,您需要以下内容:

  • 一台已经设置好可以使用sudo命令的非root账号的Ubuntu服务器,并且已开启防火墙。没有服务器的同学可以在这里购买,不过我个人更推荐您使用免费的腾讯云开发者实验室进行试验,学会安装后在购买服务器。
  • 两个域名,如果你没有域名,建议您先去这里注册一个域名,您需要将域名解析到您的服务器,您可以使用腾讯云云解析进行快速设置。
  • 20GB以上存储空间,建议您使用腾讯云的云硬盘进行扩容。

第一步 - 将您的用户添加到lxd组

使用非root用户帐户登录服务器。我们将使用此帐户执行所有容器管理任务。为此,您必须先将此用户添加到lxd组。使用以下命令执行此操作:

sudo usermod --append --groups lxd sammy

注销服务器并重新登录,以便使用新的组成员身份更新新的SSH会话。登录后,您可以开始配置LXD。

第二步 - 配置LXD

需要先配置LXD才能使用,最重要的配置取决于存储容器的后端类型。LXD的推荐存储后端是ZFS文件系统,请安装zfsutils-linux包:

sudo apt-get update
sudo apt-get install zfsutils-linux

安装完成后,您就可以初始化LXD了。在初始化期间,系统将提示您指定ZFS存储后端。接下来有两个部分,具体取决于您是要使用预分配文件还是块存储。按照适合您情况的步骤进行操作。指定存储机制后,您将为容器配置网络选项。

使用预分配的文件

请按照以下步骤配置LXD以使用预分配的文件来存储容器。首先,执行以下命令以启动LXD初始化:

sudo lxd init

系统将提示您提供信息,如以下输出所示。我们将选择默认值,包括预分配文件的建议大小。

Name of the storage backend to use (dir or zfs) [default=zfs]: zfs
Create a new ZFS pool (yes/no) [default=yes]? yes
Name of the new ZFS pool [default=lxd]: lxd
Would you like to use an existing block device (yes/no) [default=no]? no
Size in GB of the new loop device (1GB minimum) [default=15]: 15
Would you like LXD to be available over the network (yes/no) [default=no]? no
Do you want to configure the LXD bridge (yes/no) [default=yes]? yes
Warning: Stopping lxd.service, but it can still be activated by:lxd.socket
LXD has been successfully configured.

建议的大小将根据服务器的可用磁盘空间自动计算。配置设备后,您将配置网络设置。

配置网络

初始化过程将为我们提供一个GUI,如下图所示,让我们为容器配置网络桥接,以便它们可以获取私有IP地址,相互通信以及访问网络。

img

使用每个选项的默认值,但当被问及IPv6网络时,请选择,因为国内环境暂时不允许。

完成网络配置后,您就可以创建容器了。

第三步 - 创建容器

我们已成功配置LXD。我们指定了存储后端的位置,并为任何新创建的容器配置了默认网络。我们将准备创建和管理一些容器,我们将使用lxc命令。

让我们尝试我们的第一个命令,它列出了可用的已安装容器:

lxc list

您将看到以下输出:

Generating a client certificate. This may take a minute...
If this is your first time using LXD, you should also run: sudo lxd init
To start your first container, try: lxc launch ubuntu:16.04+------+-------+------+------+------+-----------+
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
+------+-------+------+------+------+-----------+

由于这是lxc命令第一次与LXD管理程序通信,因此输出让我们知道该命令会自动创建客户端证书与LXD进行安全通信。然后,它显示了有关如何启动容器的一些信息。最后,该命令显示了一个空的容器列表,这很正常,我们尚未创建任何容器。

让我们来创建三个容器。我们将创建两个web容器,并为反向代理创建第三个容器。反向代理的目的是将来自网络的传入连接定向到容器中的正确Web服务器。

我们将使用lxc launch命令创建并启动名为web1的Ubuntu 16.04(ubuntu:x)容器。ubuntu:x是预先配置的LXD镜像存储库的标识符

注意:您可以通过运行lxc image list images:来运行镜像, lxc image list ubuntu:命令找到所有可用Ubuntu映像的完整列表。

执行以下命令以创建容器:

lxc launch ubuntu:x web1
lxc launch ubuntu:x web2
lxc launch ubuntu:x haproxy

因为这是我们第一次创建容器,所以第一个命令从网络下载容器映像。接下来的两个容器创建速度要快得多。

在这里,您可以看到创建容器web1的示例输出结果。

Creating web1
Retrieving image: 100%
Starting web1

现在我们已经创建了三个空的vanilla容器,让我们使用lxc list命令来显示有关它们的信息:

lxc list

输出结果显示为一个表,其中包含每个容器的名称,其当前状态,IP地址,类型以及是否存在快照。

+---------+---------+-----------------------+------+------------+-----------+
|  NAME   |  STATE  |         IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
+---------+---------+-----------------------+------+------------+-----------+
| haproxy | RUNNING | 10.10.10.10 (eth0)    |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web1    | RUNNING | 10.10.10.100 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+
| web2    | RUNNING | 10.10.10.200 (eth0)   |      | PERSISTENT | 0         |
+---------+---------+-----------------------+------+------------+-----------+

记下容器名称及其对应的IPv4地址。您需要它们来配置您的服务。

第四步 - 配置Nginx容器

让我们连接到web1容器并配置第一个Web服务器。

要进行连接,我们使用 lxc exec命令,该命令需要容器的名称和要执行的命令。执行以下命令以连接到容器:

lxc exec web1 -- sudo --login --user ubuntu

--字符串表示该命令参数lxc应该停在那里,如在容器内将要执行的命令的行的其余部分将被传递。该命令是sudo --login --user ubuntu,它为容器内的预配置帐户ubuntu提供登录shell 。

注意:如果需要以root身份连接到容器,则可以使用lxc exec web1 --/bin/bash命令。

进入容器后,我们的shell提示现在如下所示。

ubuntu@web1:~$

容器中的这个ubuntu用户具有sudo访问权限,并且可以在不提供密码的情况下运行sudo命令。这个shell限制在容器的范围内。我们在此shell中运行的任何内容都保留在容器中,无法转义到主机服务器。

让我们更新容器内Ubuntu实例的包列表并安装Nginx:

sudo apt-get update
sudo apt-get install nginx

让我们编辑此站点的默认网页,并添加一些文本,清楚地表明该站点是在web1容器中托管的。打开文件/var/www/html/index.nginx-debian.html

sudo nano /var/www/html/index.nginx-debian.html

对文件进行以下更改:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web1!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx on LXD container web1!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

我们在两个地方编辑了文件,并在on LXD container web1上专门添加了文本。保存文件并退出编辑器。

现在注销容器并返回主机服务器:

logout

web2容器重复此步骤。登录,安装Nginx,然后编辑文件/var/www/html/index.nginx-debian.html以及使用web2。然后退出web2容器。

让我们使用curl来测试容器中的Web服务器是否正常工作。我们需要先前显示的Web容器的IP地址。

curl http://10.10.10.100/

输出结果应该是:

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web1!</title>
<style>body {width: 35em;margin: 0 auto;font-family: Tahoma, Verdana, Arial, sans-serif;}
</style>
</head>
<body>
<h1>Welcome to nginx on LXD container web1!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
...

同样测试第二个容器,使用curl命令及其IP地址验证它是否也正确设置。配置好两个容器后,我们可以继续设置HAProxy。

第五步 - 配置HAProxy容器

我们将使用HAProxy设置这些容器的代理。根据我们使用的域名将流量引导至每个容器。我们将在后面的配置示例中使用example.com。我们将在主机名example.comwww.example.com上提供第一个网站。第二个网站使用www2.example.com。或用您自己的域名代替这些域名。

登录haproxy容器:

lxc exec haproxy -- sudo --login --user ubuntu

更新安装包列表并安装HAProxy:

sudo apt-get update
sudo apt-get install haproxy

安装完成后,我们需要配置HAProxy。HAProxy的配置文件位于/etc/haproxy/haproxy.cfg中。使用您喜欢的文本编辑器打开文件。

sudo nano /etc/haproxy/haproxy.cfg

首先,我们将对defaults部分进行一些修改。我们将添加forwardfor选项,以便保留Web客户端的真实源IP,并且我们将添加http-server-close选项,从而实现会话重用和更低的延迟。

global
...
defaultslog globalmode    httpoption  httplogoption  dontlognulloption   forwardforoption   http-server-closetimeout connect 5000timeout client  50000timeout server  50000
...

接下来,我们将配置前端指向我们的两个后端容器。添加一个新的frontend部分名为www_frontend,如下所示:

frontend www_frontendbind *:80     # Bind to port 80 (www) on the container# It matches if the HTTP Host: field mentions any of the hostnames (after the '-i').acl host_web1 hdr(host) -i example.com www.example.comacl host_web2 hdr(host) -i web2.example.com# Redirect the connection to the proper server cluster, depending on the match.use_backend web1_cluster if host_web1use_backend web2_cluster if host_web2

使用acl命令与Web服务器的主机名匹配,并将请求重定向到相应的backend部分。

然后我们定义两个新的backend部分,每个部分分别用于每个Web服务器,分别命名它们为web1_clusterweb2_cluster。将以下代码添加到文件中以定义backend:

backend web1_clusterbalance leastconn# We set the X-Client-IP HTTP header. This is useful if we want the web server to know the real client IP.http-request set-header X-Client-IP %[src]# This backend, named here "web1", directs to container "web1.lxd" (hostname).server web1 web1.lxd:80 checkbackend web2_clusterbalance leastconnhttp-request set-header X-Client-IP %[src]server web2 web2.lxd:80 check

balance选项表示负载均衡策略。在这种情况下,我们选择最少数量的连接。http-request选项使用真实Web客户端IP设置HTTP标头。如果我们没有设置此标头,则Web服务器会将HAProxy IP地址记录为所有连接的源IP,从而使分析流量来源的位置。server选项指定server(web1)的任意名称,并跟着服务器的主机名和端口。

LXD为容器提供DNS服务器,因此 web1.lxd解析为与web1容器关联的IP。其他容器有自己的主机名,例如 web2.lxdhaproxy.lxd

check参数告诉HAPRoxy在Web服务器上执行运行状况。要测试配置是否有效,请运行以下命令:

/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c

输出结果应该是

Configuration file is valid

让我们重新加载HAProxy,以便它读取新配置。

sudo systemctl reload haproxy

现在注销容器以便返回主机。

logout

我们已将HAProxy配置为充当反向代理,将其在80端口上接收的任何连接转发到其他两个容器中的相应Web服务器。让我们测试haproxy将请求转发到正确的Web容器。请执行以下命令:

curl --verbose --header 'Host: web2.example.com' http://10.10.10.10

这会向HAProxy发出请求并设置HTTP host标头,HAProxy应使用该标头将连接重定向到相应的Web服务器。

输出结果应该是

...
> GET / HTTP/1.1
> Host: web2.example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
...
< 
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web2!</title>
<style>
...

HAProxy正确转发请求并将其转发给web2容器。Web服务器提供了我们之前编辑的默认索引页面。现在让我们将外部请求路由到HAProxy,可以让全世界访问我们的网站。

第六步 - 将传入连接转发到HAProxy容器中

最后一个难题是将反向代理连接到网络。我们需要设置我们的服务器以将它从80端口上的网络接收的任何连接转发到haproxy容器中。

HAProxy安装在容器中,无法从Internet访问。为了解决这个问题,我们将创建一个iptables转发连接的规则。

iptables命令需要两个IP地址:服务器的公共IP地址(your_server_ip)和haproxy容器的私有IP地址(your_haproxy_ip),您可以使用lxc list命令获取该地址。

执行此命令以创建规则:

sudo iptables -t nat -I PREROUTING -i eth0 -p TCP -d your_server_ip/32 --dport 80 -j DNAT --to-destination your_haproxy_ip:80

这是命令分解的方式:

  • -t nat指定我们正在使用该nat表。
  • -I PREROUTING 指定我们将规则添加到PREROUTING链。
  • -i eth0指定接口eth0,它是Droplets上的默认公共接口。
  • -p TCP表明我们正在使用TCP协议。
  • -d your_server_ip/32 指定规则的目标IP地址。
  • --dport 80:指定目标端口。
  • -j DNAT 表明我们想要跳转到目标NAT(DNAT)。
  • --to-destination your_haproxy_ip:80表明我们希望请求使用HAProxy转到容器的IP地址。

最后,要保存iptables命令以便在重新启动后重新应用它,我们将安装iptables-persistent软件包:

sudo apt-get install iptables-persistent

安装软件包时,系统将提示您保存所有当前iptables规则。如果您已设置了两个FQDN,那么您应该能够使用Web浏览器连接到每个网站。

要测试两个Web服务器是否实际可以从Internet访问,请使用以下curl命令从本地计算机访问每个Web服务器:

curl --verbose --header 'Host: example.com' 'http://your_server_ip'
curl --verbose --header 'Host: web2.example.com' 'http://your_server_ip'

这些命令使HTTP连接到服务器的公共IP地址,并添加一个HTTP头字段,--header其中包含HAProxy将用于处理请求的选项。

这是第一个curl命令的输出结果:

*   Trying your_server_ip...
* Connected to your_server_ip (your_server_ip) port 80 (#0)
> GET / HTTP/1.1
> Host: example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web1!</title>
<style>body {
...

这是第二个curl命令的输出结果:

*   Trying your_server_ip...
* Connected to your_server_ip (your_server_ip) port 80 (#0)
> GET / HTTP/1.1
> Host: web2.example.com
> User-Agent: curl/7.47.0
> Accept: */*
> 
< HTTP/1.1 200 OK
< Server: nginx/1.10.0 (Ubuntu)
...
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx on LXD container web2!</title>
<style>body {
...

在这两种情况下,都会显示正确的网站。

结论

您已经设置了两个网站,每个网站都在自己的容器中,并使用HAProxy重定向流量。您可以复制此过程以配置更多网站,每个网站都限制在自己的容器中。

您还可以在新容器中添加MySQL,然后安装像WordPress这样的CMS来运行每个网站。您还可以使用此过程来支持旧版本的软件。最后,LXD提供了对容器的完整状态进行快照的功能,这使得以后可以轻松地创建备份和回滚容器。此外,如果我们在两个不同的服务器上安装LXD,则可以通过Internet连接它们并在服务器之间迁移容器。更多Linux教程请前往腾讯云+社区学习更多知识。


参考文献:《How to Host Multiple Web Sites with Nginx and HAProxy Using LXD on Ubuntu 16.04》

问答

如何使用Kubernetes?

相关阅读

安全报告 | 2018上半年互联网恶意爬虫分析:从全景视角看爬虫与反爬虫

安全报告 | SSH 暴力破解趋势:从云平台向物联网设备迁移

给你的CVM安装一个面板吧!

此文已由作者授权腾讯云+社区发布,原文链接:https://cloud.tencent.com/dev...

欢迎大家前往腾讯云+社区或关注云加社区微信公众号(QcloudCommunity),第一时间获取更多海量技术实践干货哦~

海量技术实践经验,尽在云加社区!

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

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

相关文章

Varnish缓存服务器实现网站负载均衡、动静分离

varnish 缓存是 web 应用加速器&#xff0c;同时也作为 http 反向缓存代理。你可以安装 varnish 在任何http 的前端&#xff0c;同时配置它缓存内容。与传统的 squid 相比&#xff0c;varnish 具有性能更高、速度更快、管理更加方便等诸多优点。案例1 使用Varnish实现负载均衡…

日800万访客、20万RPS网站的5个9可用性架构

【编者按】AOL.com&#xff0c;American Online&#xff08;美国在线&#xff09;&#xff0c;美国著名的新闻聚合网站&#xff0c;也是美国最大的互联网服务提供商之一。当下&#xff0c;AOL.com的天访问人次已超过800万&#xff0c;月PV更达10亿之巨。近日&#xff0c;Lead S…

App会取代网站吗?

http://blog.csdn.net/happydeer/article/details/17389467 自1999年以来&#xff0c;不管是作为买家还是卖家&#xff0c;我一直是eBay的热心用户。这么多年下来&#xff0c;eBay已经从原先一个极客们买卖破旧激光笔的地方&#xff0c;演变成了一个商家可以向客户销售任何东西…

【web标准设计】学习、提高、欣赏网站推荐

【web标准设计】学习、提高、欣赏网站推荐 (转&#xff09;文章包含的一些粗俗、庸俗、恶心的言语可能造成您阅读后的不适感&#xff0c;请谨慎选择是否阅读。如你自愿阅读本文&#xff0c;因粗俗、庸俗、恶心的言语给您所造成的任何后果&#xff0c;本文作者不负任何责任。 华…

想成为程序猿?28个在线学习网站让你变身齐天大圣!

http://www.gbtags.com/gb/share/3045.htm 无论是考虑换工作成为一个全职的程序猿&#xff0c;还是试图搭建一个网站&#xff0c;亦或是想要掌握更多的技能&#xff0c;总之现在越来越多的人都开始学习如何编程。虽然编程不一定适合所有人&#xff0c;但是对相关的知识多深入了…

编程要趁早 BI推荐8个编程学习网站

最近一个热门话题是雅虎以3000万美元收购了移动阅读应用Summly&#xff0c;真正让人吃惊的不是3000万美元的价格值不值&#xff0c;而是Summly的开发者--只有17岁的尼克达洛伊西奥。他12岁开始学习编程&#xff0c;2011年&#xff08;15岁时&#xff09;因Summly从李嘉诚基金获…

知名互联网公司网站架构图

引言 近段时间以来&#xff0c;通过接触有关海量数据处理和搜索引擎的诸多技术&#xff0c;常常见识到不少精妙绝伦的架构图。除了每每感叹于每幅图表面上的绘制的精细之外&#xff0c;更为架构图背后所隐藏的设计思想所叹服。个人这两天一直在搜集各大型网站的架构设计图&…

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

ASP.NET网站防止SQL注入攻击

目的: 对输入的字串长度,范围,格式和类型进行约束. 在开发 ASP.NET 程序时使用请求验证防止注入攻击. 使用 ASP.NET 验证控件进行输入验证. 对不安全的输出编码. 使用命令参数集模式防止注入攻击. 防止错误的详细信息被返回到客户端. 概述 : 你应该在程序中验证所有的不信任输入…

aws s3 静态网站_如何使用AWS S3构建React静态网站

aws s3 静态网站There are a number of ways you can build a website with React such as Java with React, NodeJS with React, NGINX serving React, etc. For the single-page applications, all you need to do is to load the initial index.html. Once you load the ind…

大型网站技术架构(五)网站高可用架构

2019独角兽企业重金招聘Python工程师标准>>> 网站的可用性&#xff08;Avaliability&#xff09;描述网站可有效访问的特性。 1、网站可用性的度量与考核 网站不可用时间&#xff08;故障时间&#xff09;故障修复时间点-故障发现&#xff08;报告&#xff09;时间点…

大型网站技术架构(六)网站的伸缩性架构

2019独角兽企业重金招聘Python工程师标准>>> 网站系统的伸缩性架构最重要的技术手段就是使用服务器集群功能&#xff0c;通过不断地向集群中添加服务器来增强整个集群的处理能力。“伸”即网站的规模和服务器的规模总是在不断扩大。 1、网站架构的伸缩性设计 网站的…

大型网站技术架构(三)架构核心要素

2019独角兽企业重金招聘Python工程师标准>>> 所谓架构&#xff0c;一种通俗的说法就是“最高层次的规划&#xff0c;难以改变的决定”&#xff0c;这些规划和决定奠定了事物未来发展的方向和最终的蓝图。 而软件架构即“有关软件整体结构与组件的抽象描述&#xff0…

一键seo提交收录_关于SEO行业中的某些信息,你究竟应该相信谁?又或者谁都不要信!...

「阿北SEO」是阿北最近才创建的网站和微信公众号&#xff0c;但本人并非SEO行业新手&#xff0c;也不敢妄称所谓SEO高手&#xff0c;1998年触网&#xff0c;一直低调&#xff0c;从传统网站到新媒体&#xff0c;从内容编辑、产品经理、COO&#xff0c;再到后来自己创业&#xf…

创立网站管理系统,关于新闻文章内无法添加附件的修改

论坛里晒了好长时间的bug&#xff0c;被俺用笨方法改好了............. 『清雨小竹』 0:10:59在吗&#xff0c;那个问题&#xff0c;我想了一个笨的方法解决了。原因是在网页编辑框内添加附件之后&#xff0c;超链接是<img border0 src"/Editor/Images/file/doc.gif&q…

在相关网站首页加载到手机上浏览网页

学了一段时间的IOS相信大家一定非常的想编写一个软件使自己的手机能够访问你指定的网站。其实呢这个实现起来非常的简单&#xff0c;下面我会为大家分享一下代码&#xff0c;另外还要实现网络的状态&#xff0c;就是那个白色的菊花&#xff0c;由于第一个实在是太简单了&#x…

优化网站设计(四):对资源启用压缩

前言 网站设计的优化是一个很大的话题,有一些通用的原则,也有针对不同开发平台的一些建议。这方面的研究一直没有停止过&#xff0c;我在不同的场合也分享过这样的话题。 作为通用的原则&#xff0c;雅虎的工程师团队曾经给出过35个最佳实践。这个列表请参考 Best Practices fo…

JiaSale 购物按钮 WordPress 插件:让你博客瞬间变成电商网站

什么是 JiaSale 长期关注我爱水煮鱼的读者可能知道我还有一个专门销售 WordPress 插件和主题的站点&#xff1a;WPJAM 应用商城&#xff0c;通过支付宝购买&#xff0c;成功之后就可以直接附件了&#xff0c;全程无需人工介入&#xff0c;我只在后面收钱即可&#xff0c; 。 …

规划以主机命名的网站集 (Windows SharePoint Services)

摘自MSDN&#xff1a;http://technet.microsoft.com/zh-cn/library/cc288637.aspx Windows SharePoint Services 3.0 既支持以主机命名的网站集&#xff0c;也支持基于路径的网站集。以主机命名的网站集提供可缩放的宿主解决方案&#xff0c;其中每个网站集都有不同的主机名。这…

android 清华镜像,清华镜像网站下载android源码并编译

8种机械键盘轴体对比本人程序员&#xff0c;要买一个写代码的键盘&#xff0c;请问红轴和茶轴怎么选&#xff1f;下载android源码方法&#xff1a;我的系统是ubuntu 18.04&#xff0c;主要参考了blog通过清华大学镜像下载Android源码并编译源码&#xff0c;通过国内镜像网站下载…