写在前面

本篇学习如何在CentOS7上安装Nginx,并在此基础上了解Nginx强大的功能模块、目录结构和文件等信息。

Nginx安装

这里以Centos7系统为例,介绍如何在Linux系统上安装Nginx。

第一步,安装相应的依赖。依次执行如下命令:

1
2
yum -y install pcre-devel
yum -y install openssl openssl-devel

第二步,下载Nginx。使用如下命令:

1
wget http://nginx.org/download/nginx-1.17.0.tar.gz

第三步,解压下载的Nginx目录。使用如下所示的命令:

1
tar -zxvf nginx-1.17.0.tar.gz

之后并进入到该解压后的文件中,依次执行如下命令来编译和安装Nginx:

1
2
3
./configure
make
make install

之后使用whereis命令可以发现Nginx默认被安装在/usr/local/nginx目录下。

第四步,启动Nginx。进入到/usr/local/nginx/sbin目录下,执行./nginx命令即可启动nginx。

第五步,检查Nginx是否成功启动并访问首页。开发者可以使用如下命令来检查Nginx是否成功启动:

1
ps -aux|grep nginx

之后打开浏览器,在地址栏中输入服务器的IP地址,即可访问到Nginx的首页:

这样Nginx就安装并启动成功了,如果修改了Nginx的配置,那么可以使用如下命令来重新加载Nginx:

1
./nginx -s reload

注意,如果无法访问首页,请检查系统是否开启了防火墙。开发者可以使用如下命令来查看防火墙的状态和一些操作防火墙的命令:

1
2
3
4
5
6
7
8
9
10
# 使用自带命令查看防火墙状态
firewall-cmd --state
# 重启防火墙
firewall-cmd --reload
# 使用systemctl查看防火墙状态
systemctl status firewalld
# 关闭防火墙
systemctl stop firewalld
#开启防火墙
systemctl start firewalld

第六步,设置全局Nginx命令。开发者可以使用vi ~/.bash_profile命令来打开该文件,并在修改其中的PATH代码为如下所示信息:

1
PATH=$PATH:$HOME/bin:/usr/local/nginx/sbin/

之后保存并退出,使用source ~/.bash_profile命令来让配置立即生效,这样后续就可以全局使用nginx命令,再也不用进入到/usr/local/nginx/sbin目录了。举个例子,查看nginx的版本,此时就可以使用如下的命令:

1
2
[root@envythink ~]# nginx -v
nginx version: nginx/1.17.0

其实上面那种启动Nginx还是比较复杂的,而且当系统重启后需要开发者进入到/usr/local/nginx/sbin目录下手动启动Nginx,因此最好的办法就是将其添加到开机服务中,使其开机自启动。

Nginx设置开机自启动

通过nginx.service文件来开机启动

/etc/systemd/system/目录下新建一个名为nginx.service的文件,注意名称必须以.service结尾,文件中的内容为:

1
2
3
4
5
6
7
8
9
10
11
12
13
[Unit]
Description=Nginx Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

简单介绍一下上述参数的各个含义:
(1)[Unit]是服务的说明;(2)Description描述服务;(3)After描述服务类别;(4)[Service]服务运行参数的设置;(5)Type=forking表示后台运行;(6)ExecStart为服务的具体运行命令;(7)ExecReload为服务的具体重启命令;(8)ExecStop为服务的具体停止命令;(9)PrivateTmp=True表示给服务分配独立的临时空间;(10)[Install]是运行级别下服务安装的相关设置;(11)WantedBy表示多用户,即系统运行级别为3。

请注意对于[Service]中配置的ExecStart、ExecReload、ExecStop等参数都必须使用绝对路径。开发者可以使用find / -name nginx命令来查询Nginx的位置。

完成上述配置之后,接下来就可以使用systemctl enable nginx.service命令来设置Nginx为开机自启动。

当然还可以借助于systemctl这个Linux系统应用管理工具来对这里添加的Nginx服务进行管理,常用的命令如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 启动Nginx
systemctl start nginx
# 停止Nginx
systemctl stop nginx
# 重启Nginx
systemctl restart nginx
# 当修改Nginx配置文件时,重新加载Nginx
systemctl reload nginx
# 设置Nginx开机自启动
systemctl enable nginx
# 关闭Nginx开机自启动
systemctl disable nginx
# 查看Nginx运行状态
systemctl status nginx
# 显示启动失败的服务
systemctl --failed
# 查询Nginx是否已经是开机启动
systemctl is-enabled nginx
通过rc.local文件来开机启动

除了上面的配置nginx.service文件来设置开机启动外,还可以通过rc.local文件来实现。

使用vi /etc/rc.local命令来打开该文件,然后在该文件内添加如下命令:

1
/usr/local/nginx/sbin/nginx start

如果开机后发现自启动脚本没有执行,那么需要确认这个rc.local文件是否具有可执行权限,默认情况下是没有可执行权限的。开发者想要修改rc.local文件的权限,可以使用如下的命令:

1
chmod +x /etc/rc.d/rc.local

请注意,这里的/etc/rc.local/etc/rc.d/rc.local文件的软连接,因此需要赋予权限给源文件:

1
2
[root@envythink ~]# ls -l /etc/rc.local
lrwxrwxrwx. 1 root root 13 10月 10 2019 /etc/rc.local -> rc.d/rc.local

之后重启再次验证,可以发现Nginx开机自启动成功。

尽管上述两种方式都可以设置Nginx的开机自启动,但是在实际工作中笔者更倾向于前者。

Nginx平滑升级

由于前面我们使用的是源码方式来安装Nginx1.17.0,接下来就介绍如何在此基础上进行平滑升级到1.18.0版本,依次使用如下命令进行升级:

1
2
3
4
5
wget  http://nginx.org/download/nginx-1.18.0.tar.gz
tar xf nginx-1.18.0.tar.gz -C /home/envythink/soft/
cd /home/envythink/soft/nginx-1.18.0/
./configure --prefix=/usr/local/nginx118 --with-http_stub_status_module --with-http_ssl_module --user=nginx --group=nginx
make && make install

考虑到后续版本回退的需要,这里将之前的版本进行备份:

1
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak

接着就可以将新版本的Nginx二进制文件替换为已安装的Nginx二进制文件:

1
cp /usr/local/nginx116/sbin/nginx /usr/local/nginx/sbin/nginx -rf

之后进入到/usr/local/nginx/sbin目录,使用如下命令验证是否安装成功:

1
./nginx -v

可以看到页面输出nginx version: nginx/1.18.0,这就说明已经升级成功了。但是还差最后一步,将Nginx旧的主进程进行停止。首先查看Nginx旧的主进程ID号,然后给它发送一个USR2信号,让新主进程和旧进程同时工作:

1
kill -USR2 进程PID

Nginx版本回滚

第一步,使用如下命令将原来的nginx执行脚本进行恢复:

1
cp /usr/local/nginx/sbin/nginx.bak /usr/local/nginx/sbin/nginx -rf

第二步,开发者使用使用如下命令来发送HUP信号来唤醒旧版本:

1
kill -HUP `cat /usr/local/nginx/logs/nginx.pid.oldbin`

第三步,关闭新版本的主进程和worker进程:

1
2
kill -USR2 主进程PID
kill -WINCH 主进程PID

第四步,进入到/usr/local/nginx/sbin目录,使用如下命令验证是否安装成功:

1
./nginx -v

可以看到页面输出nginx version: nginx/1.17.0,这就说明Nginx版本回滚就已经成功了。

Nginx卸载

如果开发者是直接通过yum命令安装的Nginx,那么就可以直接使用yum remove nginx命令进行移除。如果是通过上述编译方式进行安装,那么除了需要删除/usr/local/nginx目录外,还需要删除nginx的开机自启动服务。

Nginx操作常用命令

前面说过,Nginx默认安装在/usr/local目录下,且其启动程序存在于/usr/local/nginx/sbin目录中,因此可以执行一些Nginx相关的命令,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
# 向主进程发送信号,重新加载配置文件(热部署)
nginx -s reload
# 重启Nginx
nginx -s restart
# 快速关闭Nginx
nginx -s stop
# 等待工作进程处理完成后才关闭
nginx -s quit
# 查看当前Nginx最终的配置
nginx -T
# 检查配置是否有问题,注意当配置目录存在,那么命令中就不需要存在`-c`
nginx -t -c <配置路径>

Nginx功能模块介绍

Nginx之所以强大,关键在于它具有很多强大的模块,因此了解和使用这些模块对于提升自己灵活使用Nginx有着非常大的帮助。

Nginx功能模块分为两大类:“核心功能模块”和“标准的HTTP功能模块”。其中“核心功能模块”负责Nginx的全局应用,主要对应于主配置文件中的main区块和events区块,这里面有很多Nginx必须的全局配置参数;“标准的HTTP功能模块”,这些虽然不是Nginx软件必须的,但是很常用,因此默认情况下都会自动安装到Nginx软件中。

其实在企业生产环境中,配置、优化和调整都是根据这些模块的功能来修改相应的参数来实现的。下面列举一下Nginx中常用的HTTP功能模块:

常用的HTTP功能模块 模块说明
ngx_http_core_module 包括一些核心的http参数配置,对应Nginx配置文件的HTTP区块部分
ngx_http_access_module 访问控制模块,用来控制网站用户对nginx的访问
ngx_http_gzip_module 压缩模块,对nginx返回的数据进行压缩,属于优化性能模块
ngx_http_fastcgi_module FastCGI模块,和动态应用相关的模块,例如:PHP
ngx_http_proxy_module proxy代理模块
ngx_http_upstaream_module 负载均衡模块,可以实现网站的负载均衡功能及节点健康检查
ngx_http_rewrite_module URL地址重写模块
ngx_http_limit_conn_module 限制用户并发连接数及请求数模块
ngx_http_limit_req_module 根据定义的key限制nginx的请求速率
ngx_http_log_module 访问日志模块,以指定的格式记录nginx的客户端访问日志
ngx_http_auth_basic_module Web认证模块,设置web用户通过账号,密码访问nginx
ngx_http_ssl_module ssl模块,用于加密http连接
ngx_http_stub_status_module 记录nginx基本访问状态信息

Nginx目录结构

为了更好地学习Nginx,这里有必要对Nginx软件的目录和文件进行一个较为全面的了解,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# 如果提示tree命令找不到,可以使用yum -y install tree
[root@envythink vhost]# tree /usr/local/nginx/
/usr/local/nginx/
├── client_body_temp
├── conf # nginx配置文件目录,非常重要
│   ├── fastcgi.conf # fastcgi相关参数配置文件
│   ├── fastcgi.conf.default # fastcgi.conf文件的原始备份文件,以.default结尾的都是文件的原始备份文件
│   ├── fastcgi_params # fastcgi的参数文件
│   ├── fastcgi_params.default
│   ├── koi-utf
│   ├── koi-win
│   ├── mime.types # 媒体类型
│   ├── mime.types.default
│   ├── nginx.conf # nginx的主配置文件
│   ├── nginx.conf.default
│   ├── scgi_params
│   ├── scgi_params.default
│   ├── uwsgi_params
│   ├── uwsgi_params.default
│   └── win-utf
├── fastcgi_temp # fastcgi临时数据目录
├── html # 编译安装时的默认站点目录
│   ├── 50x.html # 错误页面优雅显示页面,当出现500/502/503/504等错误时会调用该文件
│   └── index.html # 默认的首页文件,这个文件名也是在nginx.conf中定义好的,一般不需要修改
├── logs # 这是nginx日志的默认目录,包括访问日志和错误日志
│   ├── access.log # 访问日志
│   ├── error.log # 错误日志
│   └── nginx.pid # nginx的pid文件,进程启动后会把pid号写到这个文件中
├── proxy_temp # 临时目录
├── sbin # 这是nginx的命令目录
│   └── nginx # nginx的启动命令nginx脚本
├── scgi_temp # scgi的临时文件
└── uwsgi_temp # uwsgi的临时文件
9 directories, 21 files

nginx.conf主配置文件

nginx.conf主配置文件非常重要,后期我们绝大部分的配置都在这个文件中进行。开发者可以使用egrep -v "#|^$" /usr/local/nginx/conf/nginx.conf命令来去掉里面的注释,此时它的基本内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
worker_processes  1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}

关于这一部分的学习,会在后面有专门的文件进行介绍,这里就忽略。

fastcgi.conf配置文件

如果需要Nginx配合动态服务,如PHP等,那么Nginx还会使用到fastcgi相关的配置文件,这个配置是通过在nginx.conf主配置文件中嵌入include命令来实现的,不过前面默认使用了注释,因此不会生效。

fastcgi.conf配置文件中的初始内容如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
fastcgi_param  SCRIPT_FILENAME    $document_root$fastcgi_script_name;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

除此之外,还有一个名为fastcgi_params的默认参数配置文件,其中的代码为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;

fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;
fastcgi_param SERVER_PROTOCOL $server_protocol;
fastcgi_param REQUEST_SCHEME $scheme;
fastcgi_param HTTPS $https if_not_empty;

fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx/$nginx_version;

fastcgi_param REMOTE_ADDR $remote_addr;
fastcgi_param REMOTE_PORT $remote_port;
fastcgi_param SERVER_ADDR $server_addr;
fastcgi_param SERVER_PORT $server_port;
fastcgi_param SERVER_NAME $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param REDIRECT_STATUS 200;

由于fastcgi在实际工作中用的不是很多,因此这里就没有添加中文注释。

好了,那么本篇关于如何在CentOS7上安装Nginx和Nginx功能模块、目录结构和文件的学习就到此为止,后续学习其他的知识。