【Nginx】Nginx教程文档

笔记更新日期:2020年10月29日

0. 有用的链接

官方下载地址

官方文档地址(英文)

1. 安装及简介

1.1 nginx 版本说明

Mainline version 主线版本

Stable version 稳定版本

Legacy versions 旧版本

  • feature 新增加的特性
  • bugfix 已修复的bug
  • change 重构

1.2 下载安装

操作系统版本: CentOS 7.8

Nginx 版本:nginx-1.18.0 (2020年10月12日)

# 创建存放目录
mkdir /opt/soft
# 下载软件包
wget -P /opt/soft https://nginx.org/download/nginx-1.18.0.tar.gz
# 解压
tar -zxvf /opt/soft/nginx-1.18.0.tar.gz 
# 进入目录
cd /opt/soft/nginx-1.18.0
# 配置vim下nginx.conf文件语法高亮,如果root目录下没有.vim文件夹,创建一个即可
cp -r /opt/soft/nginx-1.18.0/contrib/vim/* ~/.vim
# 指定安装路径,/usr/local/nginx是默认路径,无需指定,这里只是作为示范
./configure --prefix=/usr/local/nginx
# 编译安装
make && make install
# 进入安装目录 启动nginx
cd /usr/local/nginx/sbin
./nginx 
# 查看进程信息
ps -ef |grep nginx
root     11653     1  0 23:25 ?        00:00:00 nginx: master process ./nginx
nobody   11654 11653  0 23:25 ?        00:00:00 nginx: worker process

编译安装的详细说明文档

安装错误信息收集:

Q1:error: the HTTP gzip module requires the zlib library.
A: yum install -y zlib-devel

Q2:error: the HTTP rewrite module requires the PCRE library.
A: yum install -y pcre-devel

Q3:error: the HTTP cache module requires md5 functions
A: yum -y install openssl openssl-devel

1.3 配置文件语法规则

截图来自极客时间

image-20201024231118951

image-20201024231425036

1.4 Nginx 命令

image-20201024231537310

-?,-h         : this help
-v            : show version and exit
-V            : show version and configure options then exit
-t            : test configuration and exit
-T            : test configuration, dump it and exit
-q            : suppress non-error messages during configuration testing
-s signal     : send signal to a master process: stop, quit, reopen, reload
-p prefix     : set prefix path (default: /usr/local/nginx/)
-c filename   : set configuration file (default: conf/nginx.conf)
-g directives : set global directives out of configuration file

1.5 直接使用Nginx命令

当需要执行Nginx命令时,需要进入到 sbin 目录下执行 Nginx命令,添加环境变量后则不需要那么做,可以像使用自带命令那样操作。

# 将命令路径插入环境变量配置文件
echo "export PATH=/usr/local/nginx/sbin:$PATH" >> /etc/profile
# 重载配置文件
source /etc/profile

# 或者使用软链接
ln -s /usr/local/nginx/sbin/nginx /usr/bin/nginx

1.6 使用 systemctl 管理Nginx服务

# 编辑配置文件
vim /usr/lib/systemd/system/nginx.service
# 将以下内容复制到该文件中
    [Unit]
    Description=nginx
    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
# 查看状态并设置开机自启
systemctl status nginx
systemctl enable nginx
    
# 配置文件解释
    [Unit]
    服务的说明
    
    Description
    描述服务
    
    After
    描述服务类别
    
    [Service]
    服务运行参数的设置
    
    Type=forking
    是后台运行的形式
    
    ExecStart
    为服务的具体运行命令
    
    ExecReload
    为重启命令
    
    ExecStop
    为停止命令
    
    PrivateTmp=True
    表示给服务分配独立的临时空间
    
    [Install]
    运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3

2.平滑升级 Nginx

平滑升级的意思是,Nginx正在运行,在不关闭Nginx服务的情况下,进行升级操作。

Nginx默认工作在多进程模式下,即主进程(master process)启动后完成配置加载和端口绑定等动作,fork出指定数量的工作进程(worker process),这些子进程会持有监听端口的文件描述符(fd),并通过在该描述符上添加监听事件来接受连接(accept)

主进程支持的信号
	TERM, INT: 立刻退出
	QUIT: 等待工作进程结束后再退出
	KILL: 强制终止进程
	HUP: 重新加载配置文件,使用新的配置启动工作进程,并逐步关闭旧进程。
	USR1: 重新打开日志文件
	USR2: 启动新的主进程,实现热升级
	WINCH: 逐步关闭工作进程
工作进程支持的信号
	TERM, INT: 立刻退出
	QUIT: 等待请求处理结束后再退出
	USR1: 重新打开日志文件
# 查看 Nginx 版本号
/usr/local/nginx/sbin/nginx -V

# 升级只需要替换二进制文件
# 备份
cp /usr/local/nginx/sbin/nginx nginx.old

# 将新编译完成的Nginx,复制到该目录下
cp -r /opt/soft/nginx-1.18.0/objs/nginx /usr/local/nginx/sbin/ -f
cp: overwrite ‘/usr/local/nginx/sbin/nginx’? y

# 启动新的主进程
# 查看进程号
ps -ef |grep nginx
# 向主进程(master)发送USR2信号,Nginx会启动一个新版本的master进程和对应工作进程,和旧版一起处理请求
kill -USR2 11910 
# 可以看到如图所示的进程信息,新进程已经启动

image-20201024235123867

# 关闭旧版Nginx worker进程
kill -WATCH 11910  

image-20201024235615623

旧版Nginx主进程 11910 还存在,但是所有的工作节点进程以及切换到新的Nginx进程 11914。这是因为如果新版本出现问题,可以重新将Nginx旧版的进程拉起

如果这时需要回退继续使用旧版本,可向旧的Nginx主进程发送HUP信号,它会重新启动工作进程, 仍使用旧版配置文件。然后可以将新版Nginx进程杀死(使用QUIT、TERM、或者KILL)

kill -HUP 11910

升级完毕,可向旧的Nginx主进程(master)发送(QUIT、TERM、或者KILL)信号,使旧的主进程退出

kill -QUIT 11910
ps aux | grep nginx

image-20201025000344491

8.验证 Nginx 版本号,并访问测试

/usr/local/nginx/sbin/nginx -v

3.重载配置文件

当修改Nginx配置文件后,在不停止Nginx服务下,重新加载Nginx配置文件

 ./nginx -s reload

4. 日志分割

为了日志的可读性,方便查找,通常需要将日志文件做日期分割,例如按照每天或者每周作为日志的分割点。

#!/bin/bash
#
#********************************************************************
#[Author]:       NPC
#[Date]:         2020-10-25
#[Description]:  Nginx Logs split
#********************************************************************
LOGS_PATH=/usr/local/nginx/logs
HISTORY_PATH=/usr/local/nginx/logs/history
YESTERDAY=$(date -d "yesterday" +%Y-%m-%d)

# 按照日期分割访问日志文件
mv "${LOGS_PATH}/access.log" "${HISTORY_PATH}/access_${YESTERDAY}.log"
# 按照日期分割错误日志文件
mv "${LOGS_PATH}/error.log" "${HISTORY_PATH}/error_${YESTERDAY}.log"
# 重新打开日志文件
kill -USR1 $(cat /usr/local/nginx/logs/nginx.pid)

添加定时任务

# 将脚本文件放在 /usr/local/nginx/sbin 目录下
# 赋予执行权限
chmod +x /usr/local/nginx/sbin/nginx_log_split.sh
# 设置定时任务,每天执行一次
# 添加定时任务 
crontab -e
0 0 1 * * /usr/local/nginx/sbin/nginx_log_split.sh
# 查看定时任务 
crontab -l

5. Nginx 静态Web服务器

5.1 部署一个静态网站

下载一个静态网站模板,我这里使用的是

https://templatemo.com/tm-520-highway

# 创建静态网站存放目录
mkdir /usr/local/nginx/site
# 将模板文件解压上传到该路径下
# 修改配置文件
vim /usr/local/nginx/conf/nginx.conf
 server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            #root   html;
            # 添加路径地址,root指定的路径是上级路径,alias指定的路径是当前路径
            alias  site/;
            index  index.html index.htm;
        }
# 重载配置文件
nginx -s reload

image-20201025041944484

5.2 配置一个可下载的文件目录

ngx_http_autoindex_modul模块说明

这里是利用 ngx_http_autoindex_module模块的特性,模块处理以斜杠字符结尾的请求,并生成目录列表。通常,当模块无法找到索引文件时ngx_http_index_module请求传递到此模块。ngx_http_autoindex_module``/``ngx_http_autoindex_module

# 编辑nginx配置文件
vim /usr/local/nginx/conf/nginx.conf

        location / {
            alias site/;
            # 启用目录列表输出
            autoindex on;
            # 显示文件大小,开启显示确切的文件大小,关闭则四舍五入以K、M或者G为单位
            autoindex_exact_size off;  
            # 指定目录列表中的时间应在本地时区或 UTC 中输出
            autoindex_localtime on;  
            # 设置目录列表的格式,可以是html、xml、json、jsonp
            #autoindex_format html;
            index  index.html index.htm;
        }
# 重载配置文件
nginx -s reload

注意,这里访问的目录列表不是根目录,是根目录下存在的文件路径

image-20201025094554895

例如,我现在的文件目录下有 img 文件夹,我的访问地址是 10.10.2.67/img/

image-20201025094744584

5.3 压缩网页内容

ngx_http_gzip_module

该模块是使用"gzip"方法压缩响应的筛选器。这通常有助于将传输数据的大小减少一半甚至更多。但使用 SSL/TLS 协议时,压缩响应可能会受到BREACH攻击。

# 编辑nginx配置文件
vim /usr/local/nginx/conf/nginx.conf
# 可在http或者server location下填写如下信息
	# 开启压缩功能
	gzip  on;
	# 最小压缩字节,表示大于20字节开始压缩
    gzip_min_length 20;
    # 压缩率,压缩率分为1-9个等级,等级越高压缩比率越高,一些测试文章说等级4比较合适,高于4压缩效果不明显
    gzip_comp_level 4;
    # 压缩文件类型
    gzip_types text/plain application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    # 重载配置文件
nginx -s reload

5.4 设置网页访问流量限制

这里使用的是ngx_http_core_module中的 limit_rate,设置此变量可以限制访问网站的速度,例如

# 编辑nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
# 在server下或者location下设置访问速度为4k
    location / {
                #root   html;
                alias site/;
                set $limit_rate 4k;
# 重载配置
nginx -s reload

image-20201027041346518

对于一些特殊的资源可以进一步设置限制访问,例如网站上有视频资源

location /flv/ {
    flv;
    limit_rate_after 500k;
    limit_rate       50k;
}

5.6 日志文件

日志的格式,log_format定义了日志格式,使用很多的变量来规范格式,例如$remote_addr定义了客户端IP地址

log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
                      
# 这是一条日志信息,记录了访问portfolio_item_8.png文件的一个请求。
10.10.2.144 - - [27/Oct/2020:04:25:09 +0800] "GET /img/portfolio_item_8.png HTTP/1.1" 200 323988 "http://10.10.2.67/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.111 Safari/537.36 Edg/86.0.622.51" "-"

6.Nginx 反向代理

ngx_http_proxy_module

当Nginx作为一个Web服务器时,它不仅需要处理Web业务,还需要处理各种Web请求,由于Web业务更注重的是开发效率,所以Nginx的性能是比较低下的。我们可以使用Nginx的反向代理功能,一台处理Web业务(上游服务器),一台处理Web请求(代理服务器)。这样做不仅解决了性能问题,还可以平滑扩展上游服务器,保证服务器的高可用。

6.1 配置Nginx反向代理

# 编辑nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
# 只监听本机端口
server {
		# 只使用本地监听,修改后需要重启Nginx
        listen       127.0.0.1:80;
        server_name  localhost;
# 配置代理服务器
# upstream 上游服务器地址,可以多个,local是名称,可以任意
upstream local {
	server 127.0.0.1:80;
}
server{
	servername localhost;
	listen 8080;
	
	location / {
	# 引入代理Nginx会出现变量问题,比如浏览器访问Proxy是一条线,Proxy访问上游服务器是一条线,所以需要定义header
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_pass http://local;
	}
}
# 重启Nginx服务
systemctl restart nginx

6.2 使用OpenResty

这里可以使用OpenResty作为反向代理服务器,OpenResty 是一个基于 Nginx与 Lua 的高性能 Web 平台

# 安装OpenResty
cd /etc/yum.repos.d/
wget https://openresty.org/package/centos/openresty.repo
yum check-update
yum install -y openresty openresty-resty

# 停用之前安装的Nginx
systemctl stop nginx

# 修改配置文件
vim /usr/local/openresty/nginx/conf/nginx.conf
     server {
            listen       8080;
            server_name  localhost;

            #charset koi8-r;

            #access_log  logs/host.access.log  main;

            location / {
                #root   html;
                alias /usr/local/nginx/site/;
                index  index.html index.htm;
            }
     include vhost/*.conf;
        upstream local {
            server 127.0.0.1:8080;
        }
        server{
            server_name localhost;
            listen 80;

            location / {
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_pass http://local;
                    }
            }
# 启动openResty
/usr/local/openresty/nginx/sbin/nginx

image-20201027062414917

6.4 使用缓存

对于访问静态内容或者一段时间不发生变化的内容,为了减少上游服务器的消耗,可以将这部分内容缓存到代理服务器上,这里使用的是代理服务器的cache特性。

这里还是使用二进制安装的Nginx,不使用OpenResty。

proxy_cache_path

proxy_cache_key

# 编辑nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf
# 在http下添加缓存路径
proxy_cache_path /tmp/nginxcache levels=1:2 keys_zone=my_cache:10m max_size=10g 
			inactive=60m use_temp_path=off;
			
# 在proxy server下添加
 server{
            server_name localhost;
            listen 80;

            location / {
                    proxy_set_header Host $host;
                    proxy_set_header X-Real-IP $remote_addr;
                    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                    proxy_cache my_cache;
                    proxy_cache_key $host$uri$is_args$args;
                    proxy_cache_valid 200 304 302 1d;
                    proxy_pass http://local;
                    }

7. 使用GoAccess监控访问日志

GoAccess是一个开源的实时Web 日志分析仪和交互式查看器,可以帮我们处理监控访问日志。

7.1 安装

# 安装epel源
rpm -Uvh https://mirrors.tuna.tsinghua.edu.cn/epel/7/x86_64/Packages/e/epel-release-7-12.noarch.rpm
# 安装GoAccess
yum install -y goaccess

7.2 格式化日志

# 进入日志文件目录
cd /usr/local/nginx/logs
# 格式化日志
goaccess access.log -o /var/www/html/report.html --log-format=COMBINED --real-time-html --time-format='%H:%M:%S' --date-format='%d/%b/%Y'

7.3 配置Nginx访问

# 编辑nginx.conf配置文件
vim /usr/local/nginx/conf/nginx.conf

# 添加一个location,指向report.html文件
    location /report.html{
                alias /var/www/html/report.html; 
    }
# 重载
nginx -s reload

image-20201027081710104

8.TLS/SSL 安全访问

SSL(Secure Socket Layer)是 TLS(Transport Layer Security)的前身。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯,位于TCP协议中的网络层和应用层之间。TLS用于两个应用程序之间提供保密性和数据完整性。都拥有各自的记录协议和握手协议。

SSL/TLS 主要的目的包括:

  • 认证网站,确保数据确实发送到正确的网站,而非假冒的钓鱼网站。
  • 建立加密连线,以防止数据中途被窃取。
  • 确保数据的完整性,确保数据在传输过程中不会被改变。

image-20201027081955613

image-20201027082017642

在客户端和服务器开始交换受 TLS 保护的信息之前,他们必须安全地交换或商定加密密钥和加密数据时使用的密码。用于密钥交换/协议的方法包括:使用 RSA 生成的公钥和私钥(在TLS握手协议中表示 TLS_RSA)、迪皮-赫尔曼(TLS_DH)、临时迪菲-赫尔曼 (TLS_DHE)、椭圆曲线迪菲-赫尔曼(TLS_ECDH),临时椭圆曲线迪菲-赫尔曼(TLS_ECDHE),匿名迪菲赫尔曼(TLS_DH_anon),预共享密钥(TLS_PSK)和安全远程密码(TLS_SRP)。较为安全的密钥交换方式是ECDHE和DHE

8.1 对称加密和非对称加密

image-20201027093245789

image-20201027093300141

异或的数学符号为“⊕”,计算机符号为“xor”。其运算法则为:

a⊕b = (¬a ∧ b) ∨ (a ∧¬b)

如果a、b两个值不相同,则异或结果为1。如果a、b两个值相同,异或结果为0。

对称加密通过密钥和密文即可解密为明文,其最大的有点是,性能非常好,只需通过遍历即可解密。

image-20201027095415477

非对称加密会同时生成两个密钥,公钥和私钥,当文件用私钥加密时,只能使用对应的公钥解密。反之则需要使用对应的私钥解密。

8.2 证书的公信力是如何保证的

在网络通信当中,不仅需要对信息加密,还需要对信息的发送者或接受者进行身份验证。这就需要引入证书,支持TLS的网页服务器必须安装「SSL凭证」,SSL 凭证由受信任的数字证书认证机构(Certificate Authority,CA)核发。

image-20201027100004312

image-20201027100203060

image-20201027101510686

8.3 TLS 通讯过程

image-20201027100902631

在TLS通讯过程中,主要做两件事,交换密钥和加密,这也是最消耗性能的两件事

image-20201027102325367

image-20201027102307585

image-20201027102355270

9.使用HTTPS访问网站

9.1 云服务器

云服务器已经做了域名解析可以采用 Let's Encrypt申请免费证书。

Cerbot 官方文档

这里使用的是Cerbot证书管理机器人,Certbot 直接在 Web 服务器上运行,运行环境基于 Python 2.7 或 3.5+。

# 安装 nginx certbot
yum install certbot python2-certbot-nginx
# 使用cerbot签发证书
certbot --nginx  --nginx-server-root=/usr/local/nginx/conf/ -d 域名
--nginx 指定使用nginx
--nginx-server-root 指定nginx配置文件
-d 指定域名

image-20201028171212457

如果选择1,不做重定向,使用http也可以访问,如果选择2,使用重定向,在客户端使用http访问时会重定向至https

9.2 本地自签证书(关于cfssl的使用还有些问题)

内网如果需要HTTPS访问,没有申请自己的域名,可以采用CFSSL自签证书,内网自行管理。如果使用虚假的域名还需要搭建本地的DNS服务器或者采用写入HOSTS文件的方式,为虚拟的域名做解析。DNS服务器可以采用BIND9

# 安装go运行环境
wget https://golang.org/dl/go1.15.3.linux-amd64.tar.gz
tar -C /usr/local/ -xzf go1.15.3.linux-amd64.tar.gz 
export PATH=$PATH:/usr/local/go/bin
go version

# 下载cfssl包编译
wget https://github.com/cloudflare/cfssl/archive/master.zip
unzip mastet.zip
cd  cfssl-master/
make

# 安装cfssl
go get -u github.com/cloudflare/cfssl/cmd/cfssl
go get -u github.com/cloudflare/cfssl/cmd/cfssljson
# 或者安装全部工具
go get -u github.com/cloudflare/cfssl/cmd/...
# 软链接
ln -s /root/go/bin/* /usr/local/bin/
# 创建文件夹存放证书
mkdir /opt/certs
# 编辑ca证书生成文件
vim /opt/certs/ca-csr.json
{
    "CN": "npc.io",
    "hosts": [
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Shanghai",
            "L": "Shanghai",
            "O": "npc",
            "OU": "npc"
        }
    ],
    "ca": {
        "expiry": "175200h"
    }
}

CN: Common Name,浏览器使用该字段验证网站是否合法,一般写的是域名。非常重要。浏览器使用该字段验证网站是否合法
key:生成证书的算法
hosts:表示哪些主机名(域名)或者IP可以使用此csr申请的证书,为空或者""表示所有的都可以使用(本例中没有hosts字段)
names:一些其它的属性
C: Country, 国家
ST: State,州或者是省份
L: Locality Name,地区,城市
O: Organization Name,组织名称,公司名称(在k8s中常用于指定Group,进行RBAC绑定)
OU: Organization Unit Name,组织单位名称,公司部门
expiry: 过期时间
# 生成根证书
cd /opt/certs
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
ll
    total 16
    -rw-r--r-- 1 root root 1041 Oct 28 23:50 ca.csr
    -rw-r--r-- 1 root root  329 Oct 28 23:45 ca-csr.json
    -rw------- 1 root root 1675 Oct 28 23:50 ca-key.pem
    -rw-r--r-- 1 root root 1298 Oct 28 23:50 ca.pem
# 该命令会生成运行CA所必需的文件ca-key.pem(私钥)和ca.pem(证书),还会生成ca.csr(证书签名请求),用于交叉签名或重新签名

# 创建ca证书配置文件
vim /opt/certs/ca-config.json
//server 表示服务端连接客户端时携带的证书,用于客户端验证服务端身份
//client 表示客户端连接服务端时携带的证书,用于服务端验证客户端身份
//peer 表示相互之间连接时使用的证书,如nginx各个节点之间验证

{
    "signing": {
        "default": {
            "expiry": "175200h"
        },
        "profiles": {
            "server": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth"
                ]
            },
            "client": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "client auth"
                ]
            },
            "peer": {
                "expiry": "175200h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}

# 创建Nginx证书生成文件
vim /opt/certs/nginx-csr.json
{
    "CN": "npc.io",
    "hosts": [
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Shanghai",
            "L": "Shanghai",
            "O": "npc",
            "OU": "npc"
        }
    ]
}
# 生成证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client nginx_67_client.json |cfssljson -bare nginx_67
    2020/10/29 00:31:34 [INFO] generate received request
    2020/10/29 00:31:34 [INFO] received CSR
    2020/10/29 00:31:34 [INFO] generating key: rsa-2048
    2020/10/29 00:31:35 [INFO] encoded CSR
    2020/10/29 00:31:35 [INFO] signed certificate with serial number 388925350134114890594396862913181723256750474421
    2020/10/29 00:31:35 [WARNING] This certificate lacks a "hosts" field. This makes it unsuitable for
    websites. For more information see the Baseline Requirements for the Issuance and Management
    of Publicly-Trusted Certificates, v.1.1.6, from the CA/Browser Forum (https://cabforum.org);
    specifically, section 10.2.3 ("Information Requirements").
ll nginx_67*
    -rw-r--r-- 1 root root  281 Oct 29 00:31 nginx_67_client.json
    -rw-r--r-- 1 root root  993 Oct 29 00:34 nginx_67.csr
    -rw------- 1 root root 1675 Oct 29 00:34 nginx_67-key.pem
    -rw-r--r-- 1 root root 1322 Oct 29 00:34 nginx_67.pem
# 配置Nginx
vim /usr/local/nginx/

http {
    include       mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
                      
    access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    keepalive_timeout  65;

    #gzip  on;

    server {
        listen       80;
        server_name  npc.io;
        # 重定向至https
        rewrite ^(.*) https://$server_name$1 permanent;

        #charset koi8-r;
        #access_log  logs/host.access.log  main;

   }
   server {
      listen  443 ssl;
      server_name  npc.io;
      charset  utf-8;

      ssl_certificate /opt/certs/nginx_67.pem;
      ssl_certificate_key /opt/certs/nginx_67-key.pem;
      ssl_session_timeout 5m;
      ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
      ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
      ssl_prefer_server_ciphers on;
	
      location / {
            alias /var/www/site/;
            index  index.html index.htm;
        }

10.使用Openresty实现一些基本功能

下载安装参考6.2节

使用Nginx调用lua模块,获取用户浏览器相关的信息

vim /usr/local/openresty/nginx/conf/nginx.conf

    location /lua{
    	default_type text/html;
   		content_by_lua 'ngx.say("User-Agent: ", ngx.req.get_headers()["User-Agent"])';
    }

image-20201029022351027

11. Nginx 架构基础

Nginx处于企业网络的边缘,处理的流量是应用服务器的数倍,了解Nginx的请求处理流程是非常有必要的。

image-20201029022919318

12. Nginx 进程结构

单进程:不适合生产环境,开发调试用,为保障Nginx的健壮,多核心处理

多进程:

image-20201029023325173

work节点数量配置数量与cpu核数一样并绑定对应的cpu核

13. 进程结构演示

nginx -s reload 重载配置文件后,worker进程将会关闭后重启新的进程

或者

kill -SIGUP 进程号

kill -SIGTERM 进程号 向work进程发送关闭信号后,master节点会重新启动一个新的进程来接管关闭的进程

14. 使用信号管理进程

image-20201029024848054

红色只能通过kill命令

15. reload流程

image-20201029025255822

image-20201029025320543

16. 热升级的完整流程

posted @ 2020-10-27 04:34  apnpc  阅读(285)  评论(0编辑  收藏  举报