Web运维架构设计与实现之apache篇

Posted zhufuzhong

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Web运维架构设计与实现之apache篇相关的知识,希望对你有一定的参考价值。

系统环境:(关闭selinux)

Lamp架构之apache依赖安装及所需依赖包如下:

apr-1.4.5

apr-util-1.3.12

pcre-8.10.zip

libxml2-2.7.6

libmcrypt-2.5.8

zlib-1.2.3

libpng-1.2.31

jpegsrc.v6b.tar.gz

freetype-2.3.5

autoconf-2.68

libgd-2.1.1 

httpd-2.4.18

mysql-boost-5.7.17.tar.gz

php-5.6.18

 

安装步骤如下:

yum -y install gcc gcc-c++ ncurses bison libgcrypt  ncurses-devel cmake libtool expat-devel  libjpeg-devel openssl perl make libXpm-devel autoconf

tar -xf apr-1.4.5.tar.gz

cd apr-1.4.5

./configure --prefix=/usr/local/apr

make & make install

如果报错:运行make clean再./configure --prefix=/usr/local/apr

make & make install

 

tar xf apr-util-1.3.12.tar.gz

cd apr-util-1.3.12

./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr/bin/apr-1-config

make && make install

tar xf pcre-8.10.tar.gz

cd pcre-8.10

./configure --prefix=/usr/local/pcre

make && make install

tar xf libxml2-2.7.6.tar.gz

cd libxml2-2.7.6

./configure --prefix=/usr/local/libxml2

(如编译错误提示:/bin/rm: cannot remove `libtoolT‘: No such file or directory

Done configuring)在configure里面把RM=‘$RM‘改为RM=‘$RM  -f‘再执行上一步操作

make && make install

tar -xf libmcrypt-2.5.8.tar.bz2

cd libmcrypt-2.5.8

./configure --prefix=/usr/local/libmcrypt

make && make install

tar -xf zlib-1.2.3.tar.bz2

cd zlib-1.2.3

./configure

vi Makefile

把CFLAGS=-O3 -DUSE_MMAP修改成CFLAGS=-O3 -DUSE_MMAP -fPIC

make && make install

 

tar -xf libpng-1.2.31.tar

cd libpng-1.2.31

./configure --prefix=/usr/local/libpng

make && make install

 

安装jpeg6

这个软件包安装有些特殊,其它软件包安装时如果目录不存在,会自动创建,但这个软件包安装时需要手动创建

mkdir  /usr/local/jpeg6

mkdir /usr/local/jpeg6/bin

mkdir /usr/local/jpeg6/lib

mkdir /usr/local/jpeg6/include

mkdir -p /usr/local/jpeg6/man/man1

 

tar xf jpegsrc.v6b.tar.gz

cd jpeg-6b/

./configure --prefix=/usr/local/jpeg6/ --enable-shared--enable-static

make && make install

出错make: ./libtool: Command not found

wget:http://ftp.gnu.org/gnu/libtool/libtool-2.2.6a.tar.gz

./configure

 make && make install

cd /usr/local/jpeg6/

cp /usr/share/libtool/config/config.sub .

cp /usr/share/libtool/config/config.guess .

然后再执行

tar xf jpegsrc.v6b.tar.gz

cd jpeg-6b/

./configure --prefix=/usr/local/jpeg6/ --enable-shared--enable-static

make && make install

tar -xf freetype-2.3.5.tar.bz2

cd freetype-2.3.5/builds/unix

./configure --prefix=/usr/local/freetype --enable-shared

make && make install

tar xf autoconf-2.68.tar.gz

cd autoconf-2.68

 ./configure

 make && make install

tar xf libgd-2.1.1.tar.gz  

cd libgd-2.1.1

./configure --prefix=/usr/local/gd2 --enable-m4_pattern_allow --with-zlib=/usr/local/zlib --with-jpeg=/usr/local/jpeg6 --with-png=/usr/local/libpng --with-freetype=/usr/local/freetype

make && make install

如果报错回头重装freetype-2.3.5.tar.bz2

 

tar xf httpd-2.4.18.tar.gz

cd httpd-2.4.18

./configure --prefix=/usr/local/apache2 --enable-mods-shared=all --enable-so --enable-proxy-ajp --enable-rewrite --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util --with-pcre=/usr/local/pcre

make && make install

ln  -s  /usr/local/apache2/bin/apachectl  /sbin/httpd

vim /usr/local/apache2/conf/httpd.conf

打开注释,修改ServerName后面内容 localhost.com:80

httpd start

ps -ef | grep httpd

vim /etc/sysconfig/iptables 加上如下

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT(永久)

iptables -I INPUT -p tcp --dport 80 -j ACCEPT临时

service iptables restart

apache 作为linux启动就运行服务程序

cp /usr/local/apache2/bin/apachectl /etc/rc.d/init.d/httpd

vi /etc/rc.d/init.d/httpd

在#!/bin/sh 下面加上

#chkconfig: 2345 10 90

#description: Activates/Deactivates Apache Web Server

 

chkconfig --add httpd

chkconfig --list httpd

chkconfig httpd on

安装mysql之前先检查rpm -qa | grep -i mysql

有就用yum remove +包名  卸载

groupadd mysql

useradd -r -g mysql -s /bin/false -M mysql

tar zxvf mysql-boost-5.7.17.tar.gz

cd mysql-5.7.17/

mkdir -p /usr/local/mysql/{data,logs,pids}

chown -R mysql:mysql /usr/local/mysql

cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/usr/local/mysql/data -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DENABLE_DOWNLOADS=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=/usr/local/boost

make -j 4

make install

vi /etc/profile

在文件最末尾添加export PATH=/usr/local/mysql/bin:/usr/local/mysql/lib:$PATH

source /etc/profile

mysqld --initialize-insecure --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data

cp support-files/mysql.server /etc/init.d/mysqld

chmod a+x /etc/init.d/mysqld

chkconfig --add mysqld

chkconfig mysqld on

chkconfig --list | grep mysqld

vi /etc/my.cnf修改如下:

[mysqld]

datadir=/usr/local/mysql/data

socket=/usr/local/mysql/mysql.sock

user=mysql

symbolic-links=0

 

[mysqld_safe]

log-error=/usr/local/mysql/logs/mysqld.log

pid-file=/usr/local/mysql/pids/mysqld.pid

symbolic-links=0

 

[client]

default-character-set=utf8

socket=/usr/local/mysql/mysql.sock

 

[mysql]

default-character-set=utf8

socket=/usr/local/mysql/mysql.sock

service mysqld start

touch /usr/local/mysql/logs/mysqld.log

touch /usr/local/mysql/pids/mysqld.pid

chown mysql.mysql -R /usr/local/mysql/

service mysqld start

service mysqld status

mysql

如出现出现:

mysqldump:unknown variable ‘sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES /etc/my.cnf 中,把

sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 删掉或者注释掉,发现问题解决了

mysql

use mysql

update user set authentication_string=password(‘123456‘) where user=‘root‘;

service mysqld restart

mysql -p123456

 

tar -xf php-5.6.18.tar.gz

cd php-5.6.18

./configure --prefix=/usr/local/php --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=mysqlnd  --with-libxml-dir=/usr/local/libxml2/ --with-png-dir=/usr/local/libpng/ --with-jpeg-dir=/usr/local/jpeg6/ --with-freetype-dir=/usr/local/freetype --with-gd=/usr/local/gd2/ --with-zlib-dir=/usr/local/zlib/ --with-mcrypt=/usr/local/libmcrypt/ --with-xpm-dir=/usr/lib64/ --enable-soap --enable-mbstring=all --enable-sockets --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --with-config-file-path=/usr/local/php/etc

make && make install

httpd.conf文件中检查有没有开启LoadModulephp5_module        modules/libphp5.so

没有则添加

在<IfModule mime_module>里面

AddType application/x-httpd-php .php

AddType application/x-httpd-php-source .phps

 

新增一个PHP模块:  cd /root/php-5.6.18/ext/mbstring

(假设php安装在/usr/local/php目录下)

/usr/local/php/bin/phpize

./configure --with-php-config=/usr/local/php/bin/php-config

make && make install

 

 

cd php-5.6.18

cp  php.ini-production /usr/local/php/etc/php.ini

vim /usr/local/php/etc/php.ini

在; http://php.net/extension-dir

加上:

extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20131226"

extension = pdo_mysql.so

extension = ftp.so

cd /usr/local/apache2/htdocs/

vim info.php

加入:

<?php

phpinfo();

?>

service httpd restart

浏览器访问:ip/info.php

 

创建脚本 测试php连接数据库:

vim /usr/local/apache2/htdocs/mysql.php

<?php

$link=mysql_connect(‘localhost‘,‘root‘,‘123456‘);

if(!$link) echo "失败!";

else echo "成功!";

mysql_close();

?>

 

连接不成功修改思路:

进数据库mysql   -p123456  

输入命令: STATUS, 查找 UNIX socket 值(连接路径)

进入php.ini

vim /usr/local/php/etc/php.ini查看

pdo_mysql.default_socket= 写上连接路径
mysql.default_socket=  写上连接路径
mysqli.default_socket=写上连接路径
 
论坛部署
unzip Discuz_X3.1_SC_UTF8.zip

mkdir -p /usr/local/apache2/htdocs/bbs

cd /usr/local/apache2/htdocs/bbs/

mv upload/* /usr/local/apache2/htdocs/bbs/

vim /usr/local/apache2/conf/httpd.conf

<IfModule dir_module>

    DirectoryIndex index.html 后面加上index.php

</IfModule>

httpd restart

cd  /usr/local/apache2/htdocs

chmod -R 777 bbs/

浏览器输入ip/bbs出现论坛安装界面

 

php.ini优化

PHP上传文件时需要关注如下几个参数:

post_max_size= 128M

upload_max_filesize= 128M

#这两个设置一样即可,可以更大但要注意超时

max_execution_time= 30

max_input_time= 600

memory_limit= 32M

禁用php危险函数

禁用方法如下: 
打开/etc/php.ini文件, 
查找到 disable_functions ,添加需禁用的函数名,如下: 

phpinfo,eval,passthru,exec,system,chroot,scandir,chgrp,chown,shell_exec,proc_open,proc_get_status,ini_alter,ini_alter,ini_restore,dl,pfsockopen,openlog,syslog,readlink,symlink,popepassthru,stream_socket_server,fsocket,fsockopen

eval禁用不了,需要借助:php Suhosin

tar xf suhosin-0.9.37.tgz

cd suhosin-0.9.37

/usr/local/php/bin/phpize

./configure -with-php-config=/usr/local/php/bin/php-config

make && make install

echo "extension = suhosin.so" >> /usr/local/php/etc/php.ini

httpd restart

apache的配置文件讲解:

/usr/local/apache2/conf/httpd.conf(apache主要配置文件)

/usr/local/apache2/bin/apachectl(apache启动/关闭程序)

/usr/local/apache2/bin/httpd(httpd是一个启动apache的二进制文件)

/usr/local/apache2/modules(编译的模块存放目录)

/usr/local/apache2/logs/access_log(apache访问日志)

/usr/local/apache2/logs/error_log(apache错误日志)

ServerRoot"/usr/local/apache2"(ServerRoot用于指定守护进程httpd的运行目录)

Listen 80(apache的监听端口)

LoadModulejk_modulemodules/mod_jk.so(加载mod_jk模块)

动态使用LoadModule来加载,然后再配置Userdaemon   Group daemon

<ifmodule>.....</ifmodule>(静态的模块)

[email protected](指定的是网站管理员的邮件地址)

ServerNamewww.example.com:80(是指定系统的主机名)

<Directory />

AllowOverridenone

Require all denied

</Directory>  #这里的“/”是相对路径,表示DocumentRoot指定的目录

通常利用Apache的rewrite模块对URL进行重写的时候,rewrite规则会写

在.htaccess文件里。但要使apache能够正常的读取.htaccess文件的内容,就必须对.htaccess所在目录进行配置。从安全性考虑,根目录的AllowOverride属性一般都配置成不允许任何Override

AllowOverride常用的选项有两个:All:表示可以读取.htaccess文件的内容,修改原来的访问权限。None:表示不读取.htaccess文件,权限统一控制

在AllowOverride设置为None时,.htaccess文件将被完全忽略。当此指令设置为All时,所有具有".htaccess"作用域的指令都允许出现在.htaccess文件中

Require all granted

表示允许所有请求访问资源

Require all denied

表示拒绝所有请求访问资源

DocumentRoot"/usr/local/apache2/htdocs"(放置网页的路径)

 

<Directory "/usr/local/apache2/htdocs">

Options IndexesFollowSymLinks

AllowOverrideNone

Require all granted

</Directory>

(DocumentRoot指定目录的权限设定)

Options表示在这个目录内能够执行的操作

Indexes:如果在DocumentRoot指定目录下找不到以index打头的文件时,就将此目录下所有文件列出来,很不安全,不建议使用这个参数

FollowSymLinks:表示在DocumentRoot指定目录下允许符号链接到其它目录

ExecCGI:表示允许在DocumentRoot指定的目录下执行cgi操作

DirectoryIndexindex.html index.htmindex.php(对apache打开网站默认首页的设定, 设置apache依次寻找能打开网站首页的顺序)

ErrorLoglogs/error_log  指定错误日志文件的位置

CustomLoglogs/access_logcommon指定apache访问日志文件的位置和记录日志的模式。

ScriptAlias/cgi-bin/ "/usr/local/apache2/cgi-bin/"是设置cgi脚本的执行权限而已,apache默认在/usr/local/apache2/cgi-bin目录下具有cgi脚本执行权AddTypeapplication/x-compress .Z

AddTypeapplication/x-compress .Z 指定httpd可解析的文件类型

AddTypeapplication/x-gzip.gz.tgz  指定httpd可解析的文件类型。

Addtypeapplication/x-httpd-php.php.phtml指定httpd可解析的文件类型。

 

静态解析功能

DocumentRoot"/usr/local/apache2/htdocs"ScriptAlias/cgi-bin/ "/usr/local/apache2/cgi-bin/"Alias /www/ "/var/www/html/www"

<Directory "/usr/local/apache2/cgi-bin">

AllowOverrideNone

Options None

Orderallow,deny

Allow from all

</Directory>

 

虚拟主机功能

vim /usr/local/apache2/conf/httpd.conf

打开注释开启调用虚拟主机功能#Include conf/extra/httpd-vhosts.conf

vim /usr/local/apache2/conf/extra/httpd-vhosts.conf 修改如下

<VirtualHost *:80>

 <VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot "/usr/local/apache2/web1"

    ServerName www.web1.com

    ServerAlias web1

    ErrorLog "logs/web1-error_log"

CustomLog "logs/web1-access_log" common

  <Directory "/usr/local/apache2/web1">

   Options Indexes FollowSymLinks

   AllowOverride None

   Require all granted

   </Directory>

</VirtualHost>

<VirtualHost *:80>

    ServerAdmin [email protected]

    DocumentRoot "/usr/local/apache2"

    ServerName www.web2.com

    ErrorLog "logs/www.web2-error_log"

CustomLog "logs/web2-access_log" common

<Directory "/usr/local/apache2/web2">

Options Indexes FollowSymLinks

AllowOverride None

Require all granted

</Directory>

</VirtualHost>

mkdir /usr/local/apache2/web1

mkdir /usr/local/apache2/web2

 

vim /usr/local/apache2/web1/index.html

写网页访问内容

vim /usr/local/apache2/web2/index.html

写网页访问内容

httpd restart

vim /etc/hosts

192.168.1.50 www.web1.com

192.168.1.50 www.web2.com

curl www.web1.com

curl www.web2.com

正向代理:客户端访问远端服务器(客户端要想访问国外网站,通过代理服务器去访问国外的网站服务器再返回代理服务器和客户端)

反向代理:客户端通过internet通过反向代理服务器访问内网的web服务器

apache的proxy功能由其proxy模块实现,实现方法如下:

<VirtualHost*:80>

[email protected]

ServerName www.a.org

Proxy Requests Off

<Proxy *>

Order deny,allow

Allow from all

</Proxy>

ProxyPass/ http://192.168.1.10:9000(另启一台装有apache的电脑并开启9000注意:

vim /etc/hosts)

ProxyPassReverse/ http://192.168.1.10:9000(另启一台装有apache的电脑并开启9000注意:vim /etc/hosts)

</VirtualHost>

vim /usr/local/apache2/conf/httpd.conf

LoadModule proxy_module modules/mod_proxy.so

LoadModule proxy_http_module modules/mod_proxy_http.so

service httpd restart

curl www.a.org 

apache的两种应用模式:work、prefork

/usr/local/apache2/bin/httpd–l来确定当前apache运行在哪种模式

如果指定“--with-mpm=MPM”参数,那么apache默认运行在prefork模式下,如果指定的是“--with-mpm=worker”参数,那么默认运行在worker模式下。如果没有做任何模式指定,那么apache默认也运行在prefork模式下。

 

prefork采用预派生子进程方式,用单独的子进程来处理不同的请求,进程之间彼此独立

prefork模式配置

vim /usr/local/apache2/conf/extra/httpd-mpm.conf

下面这段是prefork模式下的配置参数:

<IfModulempm_prefork_module>

ServerLimit 20000设置更大的值

StartServers 5服务器启动时建立的子进程数量

MinSpareServers 5设置空闲子进程的最大数量

MaxSpareServers 10空闲子进程的最小数量,不要设的太大

MaxClients 256单个进程并发线程数

MaxRequestsPerChild 0每个子进程在其生存期内允许伺服的最大请求数量

</IfModule>

 

worker模式

worker的工作原理是,由主控制进程生成“StartServers”个子进程,每个子进程中包含固定的ThreadsPerChild线程数,各个线程独立地处理请求

<IfModulempm_worker_module>

StartServers 2服务器启动时建立的子进程数

MaxClients 150允许同时连接的最大接入请求数量(最大线程数量)

MinSpareThreads 25 最小空闲线程数

MaxSpareThreads 75设置最大空闲线程数

ThreadsPerChild 25每个子进程建立的常驻的执行线程数

MaxRequestsPerChild 0设置每个子进程在其生存期内允许服务的最大请求数量,置成非零值防止(偶然的)内存泄漏无限进行,从而耗尽内存

</IfModule>

默认为prefork模式,主要是考虑到稳定性的原因。

要切换到worker模式,则需要登录到linux上,进行如下操作:

进入/usr/sbin目录

cd /usr/sbin

将当前的prefork模式启动文件改名

mv httpd httpd.prefork

将worker模式的启动文件改名

mv httpd.worker httpd

修改配置文件vi /etc/httpd/conf/httpd.conf

Apache+tomcat整合模式:Apache+mod_jk模式

tar xzvf tomcat-connectors-1.2.40-src.tar.gz

cd tomcat-connectors-1.2.40-src/native

chmod 755 buildconf.sh

./buildconf.sh

./configure --with-apxs=/usr/local/apache2/bin/apxs

make && make install

mod_jk.so文件生成到/usr/local/apache2/modules目录下

增加workers.properties文件

vi /usr/local/apache2/conf/workers.properties

worker.list=tomcat1

worker.tomcat1.port=8009

worker.tomcat1.host=localhost

worker.tomcat1.type=ajp13

worker.tomcat1.lbfactor=1

设置worker属性的格式为:

worker.worker名字.属性=

这里只说明ajp13协议支持的几个常用属性:

Host:监听ajp13请求的tomcat worker主机地址

Port:tomcat worker主机监听的端口。默认情况下tomcat在ajp13协议中使用的端口为8009

lbfactor:当tomcat用作负载均衡时,此属性被使用,表示此tomcatworker节点的负载均衡权值。映射文件

增加uriworkermap.properties文件

vi  /usr/local/apache2/conf/uriworkermap.properties

/*=tomcat1

/admin*=tomcat1

!/*.jpg=tomcat1

!/*.gif=tomcat1

!/*.png=tomcat1

!/*.bmp=tomcat1

!/*.html=tomcat1

!/*.htm=tomcat1

!/*.swf=tomcat1

!/*.css= tomcat1

!/*.js= tomcat1

在上面的配置文件中,“/*=tomcat1”表示将所有的请求都交给tomcat1来处理,而这个

“tomcat1”就是我们在workers.properties文件中由worker.list指定的。这里的“/”是个相对路径,表示存放网页的根目录,这里是上面假定的/webdata/www目录。

“!/*.jpg=tomcat1”则表示在根目录下,以“*.jpg”结尾的文件都不由JK进行处理,其它设置含义类似,也就是让apache处理图片、js文件、css文件以及静态html网页文件。

特别注意,这里有个先后顺序的问题,JK模块在处理网页根目录文件的时候,会首先过滤掉不让自己处理的设定,剩下的设定自己全部处理。

配置apache

vim /usr/local/apache2/conf/httpd.conf

添加LoadModule jk_module modules/mod_jk.so

然后添加如下内容到httpd.conf最下面

JkWorkersFile /usr/local/apache2/conf/workers.properties

JkMountFile /usr/local/apache2/conf/uriworkermap.properties

JkLogFile /usr/local/apache2/logs/mod_jk.log

JkLogLevelinfo

JkLogStampformat"[%a %b %d %H:%M:%S %Y]"

service httpd restart

上面这5行是对JK连接器属性的设定

第一、二行指定Tomcat workers配置文件以及对网页的过滤规则,第三行指定JK模块的日志输出文件,第四行指定日志输出级别,最后一行指定日志输出格式。

tar -xf tomcat-connectors-1.2.43-src.tar.gz

cd apache-tomcat-8.5.32

mkdir /usr/local/tomcat236/

cp -rp  * /usr/local/tomcat236/

启动Tomcat需要安装jdk如下

mkdir -p  /app/lamt/

tar xf jdk-8u181-linux-x64.tar.gz -C /app/lamt/

cd /app/lamt/jdk1.8.0_181/

vim  /etc/profile

export JAVA_HOME=/app/lamt/jdk1.8.0_181

export PATH=$JAVA_HOME/bin:$PATH

source /etc/profile

java –version

cd /usr/local/tomcat236/bin

./startup.sh

cd /usr/local/tomcat236/conf/server.xml (tomcat主配置文件)

<Host name="localhost"  appBase="webapps"(网页访问目录)

 unpackWARs="true" autoDeploy="true">

 unpackWARs="true"  自动解压

autoDeploy="true"   自动部署

<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />

默认开启8009端口

 <Connector port="8080" protocol="HTTP/1.1"

               connectionTimeout="20000"

               redirectPort="8443" />

默认开启8080

vim /etc/sysconfig/iptables

-A INPUT -m state --state NEW -m tcp -p tcp --dport 8080 -j ACCEPT

/etc/init.d/iptables restart

访问浏览器:ip:8080

浏览器访问:ip/index.jsp

cd /usr/local/tomcat236/webapps/ROOT/

 cp * /usr/local/apache2/htdocs/

cd /usr/local/apache2/htdocs/

chmod 777 *

浏览器访问:ip/index.jsp

tail -f /usr/local/apache2/logs/access_log(查看访问日志)





以上是关于Web运维架构设计与实现之apache篇的主要内容,如果未能解决你的问题,请参考以下文章

Java架构师成长之道之RabbitMQ开发与运维-基础篇(CSDN版)

自动化运维Saltstack系列之中型Web网站架构设计

Linux系统运维与架构设计之文件管理

迅速教你掌握Web运维技能

Linux系统运维与架构设计之Linux概述

运维学python之爬虫中级篇基础爬虫