热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在UbuntuServer12.04.1安装部署CloudStack4.0企业私有云平台

环境介绍OS:UbuntuServer12.04.164-bitServer:10.6.203.10cloudstack-server-1-CloudStackManagementServer-CloudStackAgent-NFSServer-MySQLServer注:CloudStack支持很好的分布式架构,上面-

环境介绍
OS: Ubuntu Server 12.04.1 64-bit
Server:
10.6.203.10 cloudstack-server-1
- CloudStack Management Server
- CloudStack Agent
- NFS Server
- MySQL Server
注:CloudStack支持很好的分布式架构,上面 - 代表的所有角色都可以部署在不同的机器上,但在测试环境中因为条件有限我全部都部署到了一台机器上。

1. 什么是CloudStack
CloudStack是一个开源的具有高可用性及扩展性的云计算平台。
提到开源的云计算平台,相信大家首先想到的可能是OpenStack,目前国内的几家云计算平台如阿里云、盛大云以及新浪SAE貌似都基于OpenStack做了二次开发。
但使用过CloudStack之后,你会发现其实CloudStack更像是一个商业化过后的产品,有着非常好的用户界面,各个模块默认集成的很好,且安装与部署过程也相对容易一些。

事实上,CloudStack的前身是Cloud.com,后来被思杰收购。2011年7月,Citrix收购Cloud.com,将CloudStack 100%开源并交给Apache软件基金会管理。
同时,CloudStack已经有了许多商用客户,包括GoDaddy、英国电信、日本电报电话公司、塔塔集团、韩国电信等。

因此,CloudStack本身其实就是一个商业化过后的产品,然后在面对OpenStack等开源系统的巨大竞争压力的情况下选择了同样的开源。

目前Cloudstack支持管理大部分主流的hypervisors,如KVM,XenServer,VMware,Oracle VM,Xen等。
CloudStack具有商业软件所拥有的完善的用户权限管理,可以让用户构建一个安全的多租户云计算环境。
同时兼容Amazon AWS API 接口,可用来管理AWS的资源。
  
CloudStack的官方网址如下(目前还处于Apache基金会的孵化器中):

http://incubator.apache.org/cloudstack/

以下是CloudStack的系统架构,基本上与其他云计算平台相同:


2. 宿主机的系统需求
由于CloudStack 4.0 限定了libvirt版本 > 0.9.4,并在社区宣称所支持的OS为 CentOS/RHEL 6.2 以上或 Ubuntu Server 12.04。
因此,这里我们选择 Ubuntu Server 12.04.1 作为我们的操作系统。
官方下载地址:http://releases.ubuntu.com/preci ... .1-server-amd64.iso

另外,官方要求硬件至少满足以下条件:
1) 支持硬件虚拟化(Intel-VT 或 AMD-V)
2) 64位的x86 CPU
3) 4G内存
4) 36GB硬盘
5) 1张网卡

3. 配置安装源
配置国内的网易镜像源
$ sudo sed -i s/us.archive.ubuntu.com/mirrors.163.com/g /etc/apt/sources.list
$ sudo sed -i s/security.ubuntu.com/mirrors.163.com/g /etc/apt/sources.list

更新系统的安装源
$ sudo apt-get update

4. 安装Management Server
4.1 准备好操作系统环境

查看主机名
$ hostname --fqdn
cloudstack-server-1

$ sudo vim /etc/hosts
添加以下记录
10.6.203.10 cloudstack-server-1

安装时间服务器
$ sudo apt-get install openntpd

4.2 下载安装 CloudStack Management Server 与 vhd-util
安装CloudStack Management Server
$ sudo apt-get install cloud-client

将用户cloud加入到sudo用户组 //CloudStack默认以cloud用户启动,但默认会通过sudo以root身份管理相关文件与目录
$ sudo adduser cloud sudo

配置sudo用户组免密码切换 //同样是为了解决和上面相同的权限问题
$ sudo visudo
%sudo ALL=(ALL:ALL) NOPASSWD:ALL

初始化root用户密码,如cloudstack //CloudStack默认需要root权限远程SSH连接到Agent
$ sudo -i
# passwd

1 Enter new UNIX password:

2 Retype new UNIX password:

3 passwd: password updated successfully

# chmod 777 /root //为了解决一个bug,即CloudStack默认以cloud用户启动,但却读取的是启动服务的用户的home目录用来存放一些临时文件,从而导致权限问题
$ exit

4.3 安装配置MySQL数据库
$ sudo apt-get install mysql-server
在弹出的界面中输入密码,如: cloudstack

修改MySQL配置文件参数
$ sudo vim /etc/mysql/my.cnf
在[mysqld]模块中加入以下参数

1 innodb_rollback_on_timeout=1

2 innodb_lock_wait_timeout=600


重启MySQL
$ sudo service mysql restart

初始化数据库cloud
$ sudo cloud-setup-databases cloud:cloudstack@localhost --deploy-as=root:cloudstack -e file -m cloudstack -k cloudstack

01 Mysql user name:cloud                                           [ OK ]

02 Mysql user password:cloudstack                                  [ OK ]

03 Mysql server ip:localhost                                       [ OK ]

04 Mysql server port:3306                                          [ OK ]

05 Mysql root user name:root                                       [ OK ]

06 Mysql root user password:cloudstack                             [ OK ]

07 Checking Cloud database files ...                               [ OK ]

08 Checking local machine hostname ...                             [ OK ]

09 Checking SELinux setup ...                                      [ OK ]

10 Detected local IP address as 10.6.203.10,

11 will use as cluster management server node IP                   [ OK ]

12 Preparing /etc/cloud/management/db.properties                   [ OK ]

13 Applying /usr/share/cloud/setup/create-database.sql             [ OK ]

14 Applying /usr/share/cloud/setup/create-schema.sql               [ OK ]

15 Applying /usr/share/cloud/setup/create-database-premium.sql     [ OK ]

16 Applying /usr/share/cloud/setup/create-schema-premium.sql       [ OK ]

17 Applying /usr/share/cloud/setup/server-setup.sql                [ OK ]

18 Applying /usr/share/cloud/setup/templates.sql                   [ OK ]

19 Applying /usr/share/cloud/setup/create-index-fk.sql             [ OK ]

20 Processing encryption ...                                       [ OK ]

21 Finalizing setup ...                                            [ OK ]


23 CloudStack has successfully initialized database,

24 you can check your database configuration in /etc/cloud/management/db.properties

4.4 配置NFS共享
CloudStack 需要一个地方来存放Primar和Secondary Storage,官方推荐使用NFS共享。

安装NFS
$ sudo apt-get install nfs-common nfs-kernel-server

创建目录
$ sudo mkdir -p /export/primary
$ sudo mkdir -p /export/secondary

编辑NFS配置文件
$ sudo vim /etc/exports

1 /export *(rw,async,no_root_squash,no_subtree_check)

刷新配置
$ sudo exportfs -a

挂载测试NFS共享
$ sudo mkdir /mnt/primary
$ sudo mount -t nfs 10.6.203.10:/export/primary /mnt/primary
$ sudo mkdir /mnt/secondary
$ sudo mount -t nfs 10.6.203.10:/export/secondary /mnt/secondary

$ df -h

1 Filesystem                    Size  Used Avail Use% Mounted on


3 10.6.203.10:/export/primary    434G  7.8G  404G   2% /mnt/primary

4 10.6.203.10:/export/secondary  434G  7.8G  404G   2% /mnt/secondary

$ sudo vim /etc/fstab
增加以下内容

1 10.6.203.10:/export/primary /mnt/primary    nfs rw,tcp,intr 0 1

2 10.6.203.10:/export/secondary /mnt/secondary    nfs rw,tcp,intr 0 1

02 Resolving download.cloud.com (download.cloud.com)... 207.171.189.81

03 Connecting to download.cloud.com (download.cloud.com)|207.171.189.81|:80... connected.

04 HTTP request sent, awaiting response... 200 OK

05 Length: 286036668 (273M) [binary/octet-stream]

06 Saving to: `/usr/lib/cloud/common/scripts/storage/secondary/4aae2546-33e1-4784-9e69-09e1ef9d6fb4.qcow2'


08 100%[======================================================================>] 286,036,668  188K/s   in 24m 53s


10 2012-11-12 15:14:13 (187 KB/s) - `/usr/lib/cloud/common/scripts/storage/secondary/4aae2546-33e1-4784-9e69-09e1ef9d6fb4.qcow2' saved [286036668/286036668]


12 Uncompressing to /usr/lib/cloud/common/scripts/storage/secondary/4aae2546-33e1-4784-9e69-09e1ef9d6fb4.qcow2.tmp (type bz2)...could take a long time

13 Moving to /mnt/secondary/template/tmpl/1/3///4aae2546-33e1-4784-9e69-09e1ef9d6fb4.qcow2...could take a while

14 Successfully installed system VM template  to /mnt/secondary/template/tmpl/1/3/

5. 安装配置KVM虚拟化Host主机

5.1 安装配置Agent
$ sudo apt-get install cloud-agent

5.2 安装配置libvirt
$ sudo vim /etc/libvirt/libvirtd.conf
修改以下配置




查看配置
$ cat /etc/libvirt/libvirtd.conf | grep -v '#' | grep -v "^$"





5 unix_sock_group = "libvirtd"

6 unix_sock_rw_perms = "0770"


$ sudo vim /etc/init/libvirt-bin.conf
修改以下参数

1 env libvirtd_opts="-d -l"

# sudo vim /etc/libvirt/qemu.conf
修改以下参数

重启服务
$ sudo service libvirt-bin restart

5.3 配置安全策略
$ sudo dpkg --list "apparmor"

1 Desired=Unknown/Install/Remove/Purge/Hold

2 | Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend

3 |/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)

4 ||/ Name                                Version                             Description

5 +++-===================================-===================================-======================================================================================


7                            2.7.102-0ubuntu3.1                  User-space parser utility for AppArmor

$ sudo ln -s /etc/apparmor.d/usr.sbin.libvirtd /etc/apparmor.d/disable/
$ sudo ln -s /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper /etc/apparmor.d/disable/
$ sudo apparmor_parser -R /etc/apparmor.d/usr.sbin.libvirtd
$ sudo apparmor_parser -R /etc/apparmor.d/usr.lib.libvirt.virt-aa-helper

5.4 配置网桥
需要注意的是,官方文档给出的配置参数会导致网络不可用。
正确的配置是将物理网卡设置为manual,然后在虚拟网卡上设置IP并桥接到物理网卡上。
$ sudo vim /etc/network/interfaces

01 # This file describes the network interfaces available on your system

02 # and how to activate them. For more information, see interfaces(5).


04 # The loopback network interface




08 # The primary network interface






14 iface cloudbr0 inet static

15    address 10.6.203.10

16    netmask 255.255.0.0

17    gateway 10.6.255.1





22    dns-nameservers 10.6.255.253 61.139.2.69




26 iface cloudbr1 inet manual



$ sudo /etc/init.d/networking restart
$ sudo /etc/init.d/networking start

5.5 配置防火墙
$ sudo ufw allow proto tcp from any to any port 22
$ sudo ufw allow proto tcp from any to any port 80
$ sudo ufw allow proto tcp from any to any port 1798
$ sudo ufw allow proto tcp from any to any port 16509
$ sudo ufw allow proto tcp from any to any port 5900:6100
$ sudo ufw allow proto tcp from any to any port 49152:49216

6. 用户界面
禁用系统默认的tomcat服务
$ sudo /etc/init.d/tomcat6 stop

1 * Stopping Tomcat servlet engine tomcat6 [ OK ]

$ sudo update-rc.d -f tomcat6 remove

1 Removing any system startup links for /etc/init.d/tomcat6 ...

2   /etc/rc0.d/K08tomcat6

3   /etc/rc1.d/K08tomcat6

4   /etc/rc2.d/S92tomcat6

5   /etc/rc3.d/S92tomcat6

6   /etc/rc4.d/S92tomcat6

7   /etc/rc5.d/S92tomcat6

8   /etc/rc6.d/K08tomcat6

启动cloud-management
$ cd ~
$ sudo /etc/init.d/cloud-management restart

1 * Starting CloudStack-specific Tomcat servlet engine cloud-management [ OK ]

登陆用户界面

http://10.6.203.10:8080/client/

默认账号密码
admin/password


可以看到如下图所示向导界面

选择左边的按钮"I have used CloudStack before, skip this guide"。
即进入如下图所示用户界面

7. 配置Management Server
整个Management Server的架构如下


接着我们进入到 Infrastructure 界面,可以看到目前没有任何设置,所有数目都是0。

7.2 创建相关配置
在用户界面中通过向导,依次创建
"Zone" - "Add Zone" - "Physical Network" - "Pod" - "Guest Traffic" - "Storage Traffic" -
"Cluster" - "Host" - "Primary Storage" - "Secondary Storage"

如下列图片所示:
选择Basic安装向导

配置Zone

配置Physical Network

配置Pod,此处的网络设置主要用于CloudStack内部的管理通信

配置Guest Traffic,此处的网络设置用于给Instance分配IP

配置Storage Traffic,此处的网络设置用于存储系统

配置Cluster

配置Host,即Agent主机,虚拟机的宿主机,用户名密码与SSH相同

配置主存储空间,我选择了本地mount点,即mount过后的本地路径,分布式部署时可以选择NFS模式

配置附属存储空间,仅支持NFS模式

配置完成,点击"Launch zone"

可以看到整个创建过程,最后创建完成之后提示是否启用Zone,选择Yes

8. 创建Instance类型
默认有Small Instance和Medium Instance
我们再分别创建两个类型:Large 和 xLarge,如下图所示:

创建Large Instance Type

创建xLarge Instance Type

查看xLarge Instance Type属性

9. 创建ISO安装源并创建Instance
在用户界面中配置
Template - Select view: ISO - Redister ISO


2 Description: Ubuntu Server 10.10 64-bit x86




6 OS Type: Ubuntu 10.10 (64-bit)



如下图所示:

然后,等待ISO的Ready状态为Yes的时候,如下图所示

接着,就可以开始使用ISO创建Instance,并在后面跟将其制作成为Template了。

如果想下载的速度快一些,可以通过在主机上搭建一个HTTP Server
但需要登录到Secondary Storage VM内部对防火墙规则进行一些修改,否则无法访问主机的80端口
具体步骤如下
$ sudo apt-get install apache2

$ sudo netstat -lntp | grep -w 80

1 tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      6157/apache2

上传Ubuntu安装ISO到服务器的/var/www/iso,例如ubuntu-10.10-server-amd64.iso

$ sudo mkdir /var/www/iso
$ sudo chown www-data:www-data /var/www/iso
$ sudo chown www-data:www-data /var/www/iso/ubuntu-10.10-server-amd64.iso

获取Secondary Storage VM的IP(169.254.x.x),如下图所示

登录Secondary Storage VM修改防火墙规则
$ sudo -i
# ssh -i .ssh/id_rsa.cloud -p 3922 169.254.1.99
root@s-30-VM:~# iptables -D OUTPUT -o eth1 -p tcp -m state --state NEW -m tcp --dport 80 -j REJECT --reject-with icmp-port-unreachable

10. 创建并定制Template
10.1 创建初始Instance

通过刚刚安装的ISO文件来创建一个Instance
具体步骤如下

选择ISO

选择刚刚创建好的ISO

选择xLarge Instance,这里跟根据需要自己决定

选择硬盘

默认没有安全组,直接下一步

最后给Template命名,并点击"Launch VM"创建

创建过程大概1分钟左右

创建成功以后Instance状态为Running

通过NICs页面可以查看到所绑定的IP地址

点击Details页面的"View console",打开本地终端界面

可以看到操作系统的安装界面,接下来就是常见的系统安装过程了

10.2 通过View console执行操作系统的安装过程
通过在创建好的Instance的属性页面上点击 View console,即通过Web界面操作本地图形终端
执行操作系统的安装过程,安装好操作系统。

10.3 定制Template
操作系统安装完成以后,由于计划以该操作系统来制作Template,所以需要进行如下修改
10.3.1 安装openssh client和server (通过View console)
ubuntu@Template-Instance:~$ sudo apt-get install ssh

后面的步骤就可以通过SSH来完成了。

10.3.2 配置国内的网易镜像源
ubuntu@Template-Instance:~$ sudo sed -i s/us.archive.ubuntu.com/mirrors.163.com/g /etc/apt/sources.list
ubuntu@Template-Instance:~$ sudo sed -i s/security.ubuntu.com/mirrors.163.com/g /etc/apt/sources.list
ubuntu@Template-Instance:~$ sudo apt-get update

10.3.3 配置sudo用户组免密码切换
ubuntu@Template-Instance:~$ sudo visudo
%sudo ALL=(ALL:ALL) NOPASSWD:ALL
%admin ALL=(ALL) NOPASSWD:ALL

10.3.4 安装常用工具
ubuntu@Template-Instance:~$ sudo apt-get install vim lrzsz

10.3.5 去除主机名相关配置
这样做是为了后面利用该Template创建的Instance能够自动生成特有的主机名
ubuntu@Template-Instance:~$ sudo vim /etc/hosts
注释或删除以下内容
#127.0.1.1 Template-Instance.cs1cloud.internal Template-Instance

将/etc/hostname文件更名或删除
ubuntu@Template-Instance:~$ sudo mv /etc/hostname /etc/hostname.template

10.3.6 关闭Instance
ubuntu@Template-Instance:~$ sudo sync
ubuntu@Template-Instance:~$ sudo poweroff

10.4 创建Template
确认Instance已经关闭,如下图所示

然后卸下Instance上之前所挂载的ISO

然后选择Instance对应的Volumes,点击Create Template

Name: Ubuntu-10.10
Description: Ubuntu Server 10.10 64-bit x86 with SSH
OS Type: Ubuntu 10.10 (64-bit)
Public: Yes
Password Enabled: No
Featured: No

init3-15.png

创建完成以后,即可以再Templates页面中查看到

11. 通过定制的Template创建VM Instance
通过刚刚创建好的Template,我们可以快速创建新的Instance

选择Template

选择刚刚创建好的Template

选择xLarge Instance,可以根据需要自己选择

选择硬盘,由于之间创建的Template已经带有20G硬盘
因此此处可以跳过,当然也可以选择硬盘,但会作为从盘附在上面

默认没有安全组,直接下一步

给Instance命名,并点击"Launch VM"创建

创建成功以后Instance状态为Running

通过NICs页面可以查看到所绑定的IP地址

即可通过属性页面上查看到IP地址,直接登录SSH

12. 其它优化设置
CloudStack对已经删除的Instance设置了一个保护时间
时间比较长,等于86400秒即24小时,我们可以将其设置的短一些
如300秒,即五分钟
在Global Settings中搜索expunge并设置,如下图所示

然后重启Management Server使配置生效
$ sudo /etc/init.d/cloud-management restart

修改Security Group安全组策略,允许所有数据通过

13. 结束语
目前,整个CloudStack的安装部署就已经完成了。
但,这仅仅是一个开始,CloudStack的更多功能,比如
1) 多节点分布式部署,将管理节点,Host节点,数据库,NFS存储区域都分开部署;
2) 集成 Amazon EC2;
3) VPC+VPN 网络实现;
4) 多用户权限设计与资源分配等

都有待我们进一步的研究和学习。
相信实际操作该文档之后,对CloudStack的架构与各个模块之间的联系都有了更深的理解,完成以上内容都不是什么难事了。


推荐阅读
  • 搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的详细步骤
    本文详细介绍了搭建Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境的步骤,包括环境说明、相关软件下载的地址以及所需的插件下载地址。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • Oracle优化新常态的五大禁止及其性能隐患
    本文介绍了Oracle优化新常态中的五大禁止措施,包括禁止外键、禁止视图、禁止触发器、禁止存储过程和禁止JOB,并分析了这些禁止措施可能带来的性能隐患。文章还讨论了这些禁止措施在C/S架构和B/S架构中的不同应用情况,并提出了解决方案。 ... [详细]
  • mac php错误日志配置方法及错误级别修改
    本文介绍了在mac环境下配置php错误日志的方法,包括修改php.ini文件和httpd.conf文件的操作步骤。同时还介绍了如何修改错误级别,以及相应的错误级别参考链接。 ... [详细]
  • 一句话解决高并发的核心原则
    本文介绍了解决高并发的核心原则,即将用户访问请求尽量往前推,避免访问CDN、静态服务器、动态服务器、数据库和存储,从而实现高性能、高并发、高可扩展的网站架构。同时提到了Google的成功案例,以及适用于千万级别PV站和亿级PV网站的架构层次。 ... [详细]
  • MySQL语句大全:创建、授权、查询、修改等【MySQL】的使用方法详解
    本文详细介绍了MySQL语句的使用方法,包括创建用户、授权、查询、修改等操作。通过连接MySQL数据库,可以使用命令创建用户,并指定该用户在哪个主机上可以登录。同时,还可以设置用户的登录密码。通过本文,您可以全面了解MySQL语句的使用方法。 ... [详细]
  • 分享css中提升优先级属性!important的用法总结
    web前端|css教程css!importantweb前端-css教程本文分享css中提升优先级属性!important的用法总结微信门店展示源码,vscode如何管理站点,ubu ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了软件测试知识点之数据库压力测试方法小结相关的知识,希望对你有一定的参考价值。 ... [详细]
  • Centos下安装memcached+memcached教程
    本文介绍了在Centos下安装memcached和使用memcached的教程,详细解释了memcached的工作原理,包括缓存数据和对象、减少数据库读取次数、提高网站速度等。同时,还对memcached的快速和高效率进行了解释,与传统的文件型数据库相比,memcached作为一个内存型数据库,具有更高的读取速度。 ... [详细]
  • Python项目实战10.2:MySQL读写分离性能优化
    本文介绍了在Python项目实战中进行MySQL读写分离的性能优化,包括主从同步的配置和Django实现,以及在两台centos 7系统上安装和配置MySQL的步骤。同时还介绍了创建从数据库的用户和权限的方法。摘要长度为176字。 ... [详细]
  • 2021最新总结网易/腾讯/CVTE/字节面经分享(附答案解析)
    本文分享作者在2021年面试网易、腾讯、CVTE和字节等大型互联网企业的经历和问题,包括稳定性设计、数据库优化、分布式锁的设计等内容。同时提供了大厂最新面试真题笔记,并附带答案解析。 ... [详细]
  • 面试经验分享:华为面试四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试
    最近有朋友去华为面试,面试经历包括四轮电话面试、一轮笔试、一轮主管视频面试、一轮hr视频面试。80%的人都在第一轮电话面试中失败,因为缺乏基础知识。面试问题涉及 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
author-avatar
小甜甜小小郭
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有