从源码编译安装nginx

Nginx官网下载源码,并解压

其中,configure为可执行文件,是编译安装前的预备执行文件

1
2
3
4
# 设定Nginx的安装目录,并生成make文件
./configure --prefix=/home/username/nginx

make && make install

关于configure的具体参数,官网有给出详细文档

如果执行make时出现错误make: *** No rule to make target 'build', needed by 'default'. Stop.,则是因为缺少依赖。安装以下依赖后重新生成Makefile

安装完成后,Nginx的二进制文件在./sbin/目录下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 查看Nginx版本
./nginx -v

# 查看编译安装时的参数
./nginx -V

# 启动Nginx
./nginx

# 快速关闭
./nginx -s stop

# 优雅地关闭(官网原话:Graceful shutdown)
./nginx -s quit

# 重新加载配置文件
./nginx -s reload

# 重新打开日志文件
./nginx -s reopen

# 测试配置文件nginx.conf
./nginx -t

Nginx启动时,可能会报错
nginx: [emerg] bind() to 0.0.0.0:80 failed (13: Permission denied)

这是因为Nginx默认端口号是80,在Linux里,低于1024的端口(0~1024)被视为特权端口,只有root用户才被允许使用。所以以普通用户身份启动Nginx时,Nginx会尝试在80端口开启Web服务,但由于用户权限不够,出现Permission denied

所以,可以将nginx监听的80端口改成1024以上的端口

1
2
3
4
server {
#默认为80
listen 8080;
}

即可通过localhost:8080访问Nginx页面

但这个方法访问的URL必须使用端口号,不太方便。根据问题的原因,还有一种解决方法就是用root权限启动Nginx服务。但当我使用sudo ./nginx时,虽然Nginx服务启动了,用浏览器访问Nginx页面,却显示403 Forbidden,原因不明,只能另寻方法,赋予Nginx执行文件CAP_NET_BIND_SERVICE权限

1
2
# 后接路径为Nginx二进制文件路径
sudo setcap cap_net_bind_service=+ep /home/username/nginx/sbin/nginx

GCC——GNU编译器集合

GCC可以使用默认包管理器的仓库(repositories)来安装,包管理器的选择依赖于你使用的Linux发布版本,包管理器有不同的实现:yum是基于Red Hat的发布版本;apt用于Debian和Ubuntu

RedHat中安装GCC:yum install gcc

Ubuntu中安装GCC:apt-get install gcc

PCRE库

Nginx编译需要PCRE(Perl Compatible Regular Expression),因为Nginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法。这里需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码,这正是我们需要的理由

RedHat中安装PCRE:yum install pcre pcre-devel

Ubuntu中安装PCRE:apt-get install libpcre3 libpcre3-dev

zlib库

zlib库提供了开发人员的压缩算法,在Nginx的各种模块中需要使用gzip压缩。如同安装PCRE一样,同样需要安装库和它的源代码:zlib和zlib-devel

RedHat中安装zlib:yum install zlib zlib-devel

Ubuntu中安装zlib:apt-get install zlib1g zlib1g-dev

OpenSSL库

在Nginx中,如果服务器提供安全网页时则会用到OpenSSL库,我们需要安装库文件和它的开发安装包(openssl和openssl-devel)

RedHat中安装OpenSSL:yum install openssl openssl-devel

Ubuntu中安装OpenSSL:apt-get install openssl openssl-dev(注:Ubuntu14.04的仓库中没有发现openssl-dev)