在一次安装Apache2源码的过程中,遇到过很多坑,也翻了很多博客,其中还把虚拟机搞炸掉了一次,弄了很久才解决,所以自己想总结一篇博客,用来记录一次这个过程,给以后自己再次安装的时候节省时间,同时可以给跟我一样踩坑的人解决问题,节省时间。
跟着步骤一步步来,应该不会遇到什么问题。
为什么要使用源码安装Apache2或Nginx呢?直接sudo apt install apache2
或sudo apt install nginx
它不香吗。源码安装的好处就在于它可以卸载得很干净,我们只需要删掉Apache2或者Nginx所在位置的整个文件夹就好了,比如说我的Apache2安装在/usr/local/apach2
目录下,我只需要执行sudo rm -rf /usr/local/apache2
的命令,就可以彻彻底底把Apache2给卸载干净了。
1、apt
安装依赖包
sudo apt -y install gcc g++ make libexpat1-dev
gcc
是C语言编译器g++
是C++编译器make
是执行Makefile文件libexpat1-dev
是一个解析XML的C语言库libexpat1-dev
安装过程可能会出现报错,原因是依赖包版本不符合,把依赖包版本安装为对应的版本就可以解决了。举个栗子:
执行shell命令:sudo apt install libexpat1=2.2.5-3ubuntu0.2
2、创建文件夹
sudo mkdir /usr/local/apache2
sudo mkdir /usr/local/pcre
3、下载源码包和依赖包
# 源码包通常放在这个目录下
cd /usr/local/src
# 下载apache2源码包
sudo wget https://dlcdn.apache.org//httpd/httpd-2.4.51.tar.gz
# 下载apache2依赖包
sudo wget https://dlcdn.apache.org//apr/apr-1.7.0.tar.gz
sudo wget https://dlcdn.apache.org//apr/apr-util-1.6.1.tar.gz
# pcre也可以用这个网址:https://nchc.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
sudo wget https://sourceforge.net/projects/pcre/files/pcre/8.45/pcre-8.45.tar.gz/download -O pcre-8.45.tar.gz
# 解压apache2源码包
sudo tar -zxvf httpd-2.4.51.tar.gz
# 解压依赖包
sudo tar -zxvf apr-1.7.0.tar.gz
sudo tar -zxvf apr-util-1.6.1.tar.gz
sudo tar -zxvf pcre-8.45.tar.gz
# 删除压缩包
sudo rm *.tar.gz
# 把apr和apr-util依赖包复制到srclib下,并且复制的时候把版本号去掉
sudo cp -a /usr/local/src/apr-1.7.0 /usr/local/src/httpd-2.4.51/srclib/apr
sudo cp -a /usr/local/src/apr-util-1.6.1 /usr/local/src/httpd-2.4.51/srclib/apr-util
# apr和apr-util不用安装,只安装pcre
# 在httpd-2.4.51目录下,可以使用./configure --help | grep pcre
# 可以看到pcre是要求安装的,同样可以使用./configure --help | grep apr来查看apr的相关信息
cd /usr/local/src/pcre-8.45
sudo ./configure --prefix=/usr/local/pcre
# 编译
sudo make
# 执行安装pcre
sudo make install
# 删除make产生的文件
sudo make clean
--prefix=...
,是指定安装目录wget URL -O name
,可以下载下来的文件重命名。tar
命令中,z
是对gzip
文件操作,x
是解压文件(c
是压缩文件),v
是显示操作过程,f
是指定需要解压的文件名,对于解压*.tar.gz
的习惯用法是-zxvf
,当然这个-
可有可无;压缩成*.tar.gz
类型的文件可使用-zcvf
,栗子:tar -zcvf hello.tar.gzip hello.txt
。cp
命令中,-a
相当于 -d
、-p
、-r
选项的集合。-d
:如果源文件为软链接(对硬链接无效),则复制出的目标文件也为软链接;-p
:复制后目标文件保留源文件的属性(包括所有者、所属组、权限和时间);-r
:递归复制,用于复制目录。4、安装Apache2
# 进入apache源码包
cd /usr/local/src/httpd-2.4.51
sudo ./configure --prefix=/usr/local/apache2 --with-pcre=/usr/local/pcre --with-included-apr
# 编译
sudo make
# 运行安装
sudo make install
# 清除编译产生的文件
sudo make clean
--prefix=/usr/local/apache2
,将apache2安装在/usr/local/apache2
文件夹下--with-pcre=/usr/local/pcre
,/usr/local/pcre
是依赖包pcre已经安装的位置--with-included-apr
,使用/usr/local/src/httpd-2.4.51/srclib
下的apr
和apr-uitl
如果使用make
过程中出现错误了,先使用make clean
清除文件之后,再重新make
5、运行Apache2
# 修改配置文件,修改为本地运行
sudo vim /usr/local/apache2/conf/httpd.conf
# 找到ServerName
# 进入vim之后直接输入 /ServerName 然后回车就可以直接跳转到ServerName了
# 可以在下面看到有一行注释为 ServerName www.example.com:80
# 在这一行的下面添加 ServerName localhost:80
ServerName localhost:80
# 当然可以用sed命令来进行替换,,-i是直接替换源文件
sudo sed -i 's/com:80/com:80\nServerName localhost:80/' /usr/local/apache2/conf/httpd.conf
# 启动Apache2
sudo /usr/local/apache2/bin/apachectl -k start
# 停止Apache2
sudo /usr/local/apache2/bin/apachectl -k stop
# 重启Apache2
sudo /usr/local/apache2/bin/apachectl -k restart
1)、如果启动Apache2成功,访问http://localhost
,网页会出现It works!
2)、如果启动Apache2报错了,可能是由于80端口被占用的原因,类似于下面的报错
(98)Address already in use: AH00072: make_sock: could not bind to address [::]:80
(98)Address already in use: AH00072: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
AH00015: Unable to open logs
以下是我的一种解决方案
# 安装Linux的网络工具集
sudo apt install net-tools
# 查看80端口是否被占用
sudo lsof -i :80
如果80端口有被占用会出现类似一下图片的内容
我们只需要把这些pid都杀死就好了
# sudo kill -9 pid
sudo kill -9 61468 61469 ...
也可以用awk
命令来解决
sudo lsof -i :80 | tail -n +2 | awk '{if ($9=="*:http") print $2}' | sudo xargs kill -9
xargs
是给命令传递参数的一个过滤器,xargs
的默认命令是echo
,这意味着通过管道传递给xargs
的输入将会包含换行和空白,不过通过xargs
的处理,换行和空白将被空格取代。
1、apt
安装依赖包
sudo apt -y install gcc g++ make
gcc
是C语言编译器g++
是C++编译器make
是执行Makefile文件2、创建文件夹
sudo mkdir /usr/local/nginx
3、下载源码包和依赖包
cd /usr/local/src
# 下载nginx源码包
sudo wget http://nginx.org/download/nginx-1.18.0.tar.gz
# 下载依赖包
sudo wget https://nchc.dl.sourceforge.net/project/pcre/pcre/8.45/pcre-8.45.tar.gz
sudo wget http://www.zlib.net/zlib-1.2.11.tar.gz
sudo wget https://www.openssl.org/source/openssl-1.1.1l.tar.gz
# 解压nginx源码包
sudo tar -zxvf nginx-1.18.0.tar.gz
# 解压依赖包
sudo tar -zxvf pcre-8.45.tar.gz
sudo tar -zxvf zlib-1.2.11.tar.gz
sudo tar -zxvf openssl-1.1.1l.tar.gz
# 删除压缩包
sudo rm *.tar.gz
tar
命令中,z
是对gzip
文件操作,x
是解压文件(c
是压缩文件),v
是显示操作过程,f
是指定需要解压的文件名,对于解压*.tar.gz
的习惯用法是-zxvf
,当然这个-
可有可无;压缩成*.tar.gz
类型的文件可使用-zcvf
,栗子:tar -zcvf hello.tar.gzip hello.txt
。4、安装Nginx
# pcre和zlib都不用安装,直接安装nginx
cd /usr/local/src/nginx-1.18.0
# 注意,这里是直接使用pcre和zlib源码
# 可以使用./configure --help | grep pcre或者./configure --help | grep zlib查看相关帮助
sudo ./configure --prefix=/usr/local/nginx --with-pcre=/usr/local/src/pcre-8.45 --with-zlib=/usr/local/src/zlib-1.2.11 --with-openssl=/usr/local/src/openssl-1.1.1l --with-debug
# 编译
sudo make
# 运行安装
sudo make install
# 清除编译产生的文件
sudo make clean
--prefix=/usr/local/nginx
,将Nginx安装在/usr/local/nginx
文件夹下--with-pcre=/usr/local/src/pcre-8.45
,/usr/local/src/pcre-8.45
是依赖包pcre
源码的位置(没有安装的,Apache才需要安装)--with-zlib=/usr/local/src/zlib-1.2.11
,使用/usr/local/src/zlib-1.2.11
是依赖包zlib
源码的位置,和pcre
一样,不用安装--with-openssl=/usr/local/src/openssl-1.1.1l
,使用/usr/local/src/openssl-1.1.1l
是依赖包openssl
源码的位置,不用安装,openssl
不是必须的依赖包--with-debug
,可以看到Nginx更多的错误信息5、运行Nginx
# 启动Nginx
sudo /usr/local/nginx/sbin/nginx
# 查看帮助
sudo /usr/local/nginx/sbin/nginx -h
# 停止Nginx
sudo /usr/local/nginx/sbin/nginx -s stop
如果出现端口被占用,可以看上面Apache2的处理方法进行处理,效果是一样的。
本次安装Apache2源码和安装Nginx源码的教程就结束了,我们可以发现,安装Nginx要比Apache2快得多,而且简单得多,因为Nginx是轻量的,会占用更少的内存及资源,但是Apache2更稳定,两者各有各自的优势吧。
很荣幸你能看到最后,那说明这篇文章对你有很大帮助,如果还遇到什么问题的话,可以在评论区说说你的问题(最好附上截图)。