¶一、简介
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。
在高连接并发的情况下,Nginx是Apache服务器不错的替代品。
¶二、yum安装
¶1. 安装yum源
1 | sudo yum install yum-utils |
设置官方yum源以能够使用最新版本
1 | vim /etc/yum.repos.d/nginx.repo |
1 | [nginx-stable] |
¶2. 安装nginx
1 | yum install nginx |
¶3. 查看nginx安装信息
1 | #查看已经安装nginx包(如:nginx-1.16.0-1.el7.ngx.x86_64) |
yum安装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
35
36
37
38
39
40
41
42
43 Nginx主配置文件
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
Cgi、Fastcgi、Uwcgi配置文件
/etc/nginx/fastcgi_params
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
Nginx编码转换映射配置文件
/etc/nginx/win-utf
/etc/nginx/koi-utf
/etc/nginx/koi-win
http协议的Content-Type与扩展名配置文件
/etc/nginx/mime.types
系统守护进程管理器配置文件
/usr/lib/systemd/system/nginx.service
Nginx⽇志轮询,⽇志切割配置文件
/etc/logrotate.d/nginx
Nginx终端管理命令
/usr/sbin/nginx
/usr/sbin/nginx-debug
Nginx模块⽬录
/etc/nginx/modules
/usr/lib64/nginx
/usr/lib64/nginx/modules
Nginx默认站点⽬录
/usr/share/nginx/html
#Nginx的缓存⽬录
/usr/share/doc/nginx-1.12.2
/usr/share/man/man8/nginx.8.gz
Nginx的⽇志⽬录
/var/log/nginxyum安装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 程序安装⽬录和路径
--prefix=/etc/nginx
--sbin-path=/usr/sbin/nginx
--modules-path=/usr/lib64/nginx/modules
--conf-path=/etc/nginx/nginx.conf
--error-log-path=/var/log/nginx/error.log
--http-log-path=/var/log/nginx/access.log
--pid-path=/var/run/nginx.pid
--lock-path=/var/run/nginx.lock
临时缓存⽂件
--http-client-body-temp-path=/var/cache/nginx/client_temp
--http-proxy-temp-path=/var/cache/nginx/proxy_temp
--http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
--http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
--http-scgi-temp-path=/var/cache/nginx/scgi_temp
设定Nginx进程启动⽤户和组(安全)
--user=nginx
--group=nginx
设置额外的参数将被添加到CFLAGS变量
--with-cc-opt
设置附加的参数, 链接系统库
--with-ld-opt
¶二、编译安装
官方下载地址:http://nginx.org/en/download.html
版本号是双数的是稳定版,而单数则是开发版。
以下以编译安装来讲述。为什么选择编译安装而不选择yum或者apt包管理器安装呢?因为yum或者apt安装的是已经编译好的二进制文件,而已经编译好就说明扩展模块已经固定,很难去添加或者修改自定义的扩展模块,这里选择编译安装就是为了解决这个问题。
¶1. 准备活动
1 | #下载 |
¶2. 安装编译依赖包
1 | yum -y install make zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel |
¶3. 简单编译安装
1 | #进入解压好的源码目录 |
安装目录结构如下:
1 | /usr/local/nginx |
¶4. 常用编译参数说明
1 | --prefix=绝对路径 #定义nginx安装目录。默认为usr/local/nginx目录。注意:这个目标的设置会影响其他参数中的相对路径目录。(例如:--sbin-path==sbin/nginx,那么实际上可执行文件nginx的安装存放路径为/usr/local/nginx/sbin/nginx。) |
如果想强制禁用某个模块,只需要将
--with
改成--without
。比如禁用select多路复用器模块,则参数为:--without-select_module
¶5. 常规编译安装
1 | ##下载 |
¶三、常用命令
1 | #进入nginx命令所在的安装目录(如果是编译安装) |
关于
nginx -V
查看编译参数的说明:注意执行
nginx -V
只是列出在编译时执行./configure
的显式设置参数,而不代表真实编译进nginx的配置,比如有很多的编译参数是默认启用的,编译时也被编译进nginx了,但是通过nginx -V
命令却不能看到对应的参数。如在执行./configure
时即使没有显式地设置--with-pcre
这个编译参数,但是编译好的nginx还是能够使用正则匹配功能。
¶五、内置变量
http核⼼模块的内置变量
http请求变量
Nginx内置变量
⾃定义变量
1 | $uri: 当前请求的uri,不带参数 |
¶六、自定义配置文件
只需在 nginx 主配置文件 nginx.conf
的 http
节点中导入 conf/conf.d
目录(如果没有自行创建该目录)的所有配置文件,即可在 conf/conf.d
目录下自定义配置文件。如下:
1 | http { |
¶七、配置http服务
1 | vim conf.d/http.conf |
1 | # 第一个虚拟主机配置(静态资源服务器) |
¶八、负载均衡
1 | vim conf.d/load_balance.conf |
1 | upstream ops_load { |
¶九、动静分离
¶1. 环境准备(A主机和B主机)
这里的静态资源用图片来表示,而动态资源用jsp来表示。
上游服务主机(A主机)
ip:101.132.45.132
作用:提供静态资源和动态资源服务
(nginx提供静态资源资源+tomcat提供动态资源)
代理主机(B主机)
ip:198.23.188.200:
作用:承担反向代理的角色(nginx实现反向代理)
¶2. A主机环境搭建
¶(1)动态资源的准备
tomcat安装很傻瓜式,解压即用,这里就不详细介绍。
添加jsp到tomcat web根目录里
1 | vim /usr/local/apache-tomcat-8.5.31/webapps/ROOT/java_test.jsp |
1 | <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%> |
运行tomcat
1 | sh /usr/local/apache-tomcat-8.5.31/bin/startup.sh |
¶(2)静态资源的准备
编辑nginx配置文件配置静态资源访问控制
1 | vim conf.d/static.conf |
1 | server { |
在/usr/share/nginx/resource/img
目录里放一张logo.jpg的图片做测试,并且确保有访问权限
重新加载nginx配置
1 | nginx -s reload |
¶3. B主机环境搭建
配置反向代理调度策略
1 | vim conf.d/dynamic_static_proxy.conf |
1 | #配置静态资源请求的地址和端口 |
创建并配置代理参数文件
1 | vim /etc/nginx/proxy_params |
1 | #代理到tomcat等服务器时注意要设置请求参数,如果后端服务器设置有类似防盗链或者根据http请求头中的host字段来进行路由或判断功能的话,如果反向代理层的nginx不重写请求头中的host字段,将会导致请求失败,报400错误。故至少要包含proxy_set_header Host $http_host;为了方便,以下配置了跟多的请求参数。 |
重新加载nginx配置
1 | nginx -s reload |
¶4. 访问测试
在代理主机B主机上编写动静分离的页面做测试
1 | vim /usr/share/nginx/html/dynamic_static.html |
1 | <html lang="en"> |
访问代理主机B主机的测试页面
到这里nginx配置动静分类的应用服务就完成了。
¶十、配置ssl证书以使用https
使用 https 就需要配置 ssl 证书。一般地,获取 ssl 证书有两种方式:自签名和购买 CA 颁发的 ssl 证书。自签名的证书可能会被浏览器拦截并提示不受信任,因此建议采用比较可靠的商业颁发机构购买(如 Comodo、Symantec 等)或者免费的 Let’s Encrypt 签发的证书。可以使用 certbot 工具来申请得到免费 Let’ s Encrypt SSL 证书。具体操作可参考《通过certbot工具生成ssl证书》。假设这里已经申请得到了 Let’ s Encrypt SSL 证书,下文将介绍如何在 nginx 中配置 ssl 证书以使用 https 。
¶1. 创建一个自定义的nginx配置文件
1 | vi /opt/nginx/conf/conf.d/test.conf |
1 | server { |
nginx SSL证书配置说明:
ssl_certificate
:SSL证书路径。(可配置为服务端证书或全链证书)
ssl_certificate_key
:私钥文件路径。
ssl_trusted_certificate
:可信任的证书链文件路径。(可配置为中间证书或全链证书)如果
ssl_certificate
配置的证书为服务端证书而不包含中间证书,则应该配置ssl_trusted_certificate
来指定可信任的证书链文件,以便客户端能够正确验证服务端证书的真实性。但由于目前主流CA服务商(包括 Let’s Encrypt )的根证书和中间证书都已经被大多数客户端(如:主流的浏览器)的证书信任列表所接受,所以服务端配置中即使缺少中间证书和根证书,客户端仍然可以正确地验证服务器证书的真实性,也就是说ssl_certificate
配置 主流CA签发的 SSL 证书时,即使不是全链证书也能被大多数主流的客户端信任。关于证书链的说明:
- 客户端验证服务器证书的真实性是通过证书链来实现的。如果证书链中最顶层的证书(即CA根证书)在客户端的信任列表里,客户端会从上往下按序验证每层证书的真实性,每一层都使用上一层证书的公钥来验证下一层证书的签名,直到验证到服务器证书为止。如果证书链缺少中间证书,则客户端无法验证该证书链的完整性,也就无法验证服务端证书的真实性。因此,必须包括所有中间证书以及根证书才能构建完整的证书链。只有在证书链完整且验证成功的情况下,客户端才能信任服务器证书并与其建立安全连接。
- 客户端的信任列表一般包括有根证书、中间证书以及其他可信任的证书等。
¶2. 重载配置
1 | #重载配置(重新加载 nginx 配置以使得 SSL 证书生效) |
¶3. 测试
创建一个待测试的html静态资源文件,如下:
1 | mkdir -p /opt/test/web |
¶十一、配置nginx进程和其执行用户
¶1. nginx进程
在 Nginx 的主进程启动后,会创建多个子进程来处理客户端请求和其他任务。这些子进程通常由 Nginx 主进程负责管理、调度和监控。
Nginx 子进程通常分为以下几种类型:
master process
(主进程):Nginx 的主进程,负责管理所有子进程,接收和处理来自命令行的信号,并启动整个 Nginx 服务。worker process
(工作进程):Nginx 的工作进程,负责处理客户端请求和其他任务,每个工作进程都是一个独立的进程,可以同时处理多个请求。cache loader process
(缓存加载进程):用于加载和预热缓存数据的进程,只有在开启缓存功能时才会启动。cache manager process
(缓存管理进程):用于管理缓存数据和处理缓存清理的进程,只有在开启缓存功能时才会启动。
通常配置工作进程以满足业务需求。
1 | #指定启动的工作进程数量(默认值为:auto,表示以CPU核心数决定工作进程数量) |
¶2. nginx进程执行用户
默认情况下,Nginx 启动后会创建一个主进程和多个工作进程,其中主进程为运行nginx服务的linux用户(通常是 root 用户),而每个工作进程都是以指定用户身份来执行的,默认情况下是以 nobody
用户身份运行。可以通过修改配置文件中的 user
指令来改变工作进程的执行用户。具体操作如下:
(1) 创建nginx工作进程的执行用户
1 | #创建nginx工作进程的执行用户 |
(2) 修改 nginx 主配置文件nginx.conf
,如下:
1 | vi nginx.conf |
修改如下:
1 | #修改user指令即可 |
¶十二、配置日志
随着 nginx 长时间运行,日志文件也会变得越来越多,甚至几个月就达到了几个 GB 的大小,这会导致在排查日志时会由于内容太多而不好定位。为了解决这个问题,可以配置 nginx 记录日志时按照日期记录到不同的文件里,从而实现日志切割的效果。如下:
1 | log_format custom '$remote_addr - $remote_user [$time_local] "$request" ' |
设 logs 目录路径为:/opt/nginx/logs
,则需要给该目录赋予 worker 进程的用户权限和操作权限。
1 | chown nginx:nginx /opt/nginx/logs |
1 | #重载配置 |