VMware虚拟机下的Ubuntu 20.04 源码安装Apache2以及源码安装Nginx,详细安装过程以及避雷

前言

  在一次安装Apache2源码的过程中,遇到过很多坑,也翻了很多博客,其中还把虚拟机搞炸掉了一次,弄了很久才解决,所以自己想总结一篇博客,用来记录一次这个过程,给以后自己再次安装的时候节省时间,同时可以给跟我一样踩坑的人解决问题,节省时间。
  跟着步骤一步步来,应该不会遇到什么问题。

源码安装的优点

  为什么要使用源码安装Apache2或Nginx呢?直接sudo apt install apache2sudo apt install nginx它不香吗。源码安装的好处就在于它可以卸载得很干净,我们只需要删掉Apache2或者Nginx所在位置的整个文件夹就好了,比如说我的Apache2安装在/usr/local/apach2目录下,我只需要执行sudo rm -rf /usr/local/apache2的命令,就可以彻彻底底把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
  • apache2是apache2安装的位置
  • pcre是apache2的依赖包安装位置

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下的aprapr-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的处理,换行和空白将被空格取代。


二、安装Nginx

1、apt安装依赖包

sudo apt -y install gcc g++ make
  • gcc是C语言编译器
  • g++是C++编译器
  • make是执行Makefile文件

2、创建文件夹

sudo mkdir /usr/local/nginx
  • 这个文件夹是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更多的错误信息
  • 除此之外,自己还可以添加一些常用配置,可以参考https://www.runoob.com/w3cnote/nginx-install-and-config.html

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更稳定,两者各有各自的优势吧。
  很荣幸你能看到最后,那说明这篇文章对你有很大帮助,如果还遇到什么问题的话,可以在评论区说说你的问题(最好附上截图)。

你可能感兴趣的:(Linux,ubuntu,linux,apache,nginx)