Deep learning content about Nginx

不言
Release: 2023-03-25 13:28:02
Original
1256 people have browsed it

This article mainly introduces the deep learning content of Nginx, which has certain reference value. Now I share it with everyone. Friends in need can refer to it

1. Separation of dynamic and static

Separate dynamic requests and static requests through middleware.
Reason: Separate resources to reduce unnecessary request consumption and reduce request delay.

Dynamic and static request legend:
Deep learning content about Nginx

  • ##Basic configuration

  • upstream php_api{
        server 127.0.0.1:8080;
    }
    server {
        root filePath;
        location ~ \.php$ {
            proxy_pass http://php_api;
            index index.html index.htm;
        }
        location ~ \.(jpg|png|gif) {
            expires 1h;
            gzip on;
        }
    }
    Copy after login
2. Rewrite rules

1. Scenario:

  • URL access jump, support development and design (page jump, compatibility support, Display effect, etc.)

  • SEO optimization

  • Maintenance (backend maintenance, traffic forwarding, etc.)

  • Security

2. Configuration syntax

rewrite

  • Configuration syntax: rewrite regex replacement [flag];

  • Default: None

  • Context: server, location, if

Example: rewrite ^(.*)$ /pages/main.html break;

    ##regex (regular)
  1. The
pcregrep
command in Linux can be used to test regular expressions. | Metacharacters|Meaning|
##. Matches any character except newline characters?Repeat 0 or 1 timesRepeat 1 or more timesdMatch numbers*Greedy mode, match as many as there are^Match the beginning$Match the end{n}Repeat n Times{n,}Repeat n times or more[c]Match a single character c[a-z]Match any one of the lowercase letters a-z\Transfer characters( ) is used to match the content between (), called by ,
$1$2
flag
##flag MeaninglastStop rewrite detectionStop rewrite Detection returns 302 temporary redirection, and the address bar will display the redirected addressReturn to 301 permanent redirection, the address bar will display the redirected address
break
redirect
permanent
  • 301永久重定向:除非用户清理缓存,否则下次请求还是会请求到重定向

  • 302临时重定向:用户下次请求还会经过服务端重定向

  • last 和 break的区别:last会新建一个连接,往下继续进行匹配。break会直接停留在那一级。

  • redirect:关闭nginx后,重定向会失效。

  • permanent:关闭nginx,也会重定向到新的地址。

实例:
location / {
    # 文件不存在,直接访问4399
    if (!-f $request_filename) {
        rewrite ^/(.*)$ http://www.4399.com;
    }
}
Copy after login
  1. 优先级

    1. 执行server块的rewrite指令

    2. 执行location匹配

    3. 执行选中的location中的rewrite

三、Nginx的高级模块

1. secure_link_module模块

(1)制定并允许检查请求的链接的真实性以及保护资源免遭未经授权的访问
(2)限制链接生效周期

图例:
Deep learning content about Nginx

  • 配置语法

    • 配置语法:secure_link_md5 expression;

    • 默认:无

    • Context:http,server,location

    • 配置语法:secure_link expression;

    • 默认:无

    • Context:http,server,location

    • secure_link

    • secure_link_md5

简单配置实例:

root /opt/app/code;

location / {
    secure_link $arg_md5,$arg_expires;
    secure_link_md5 "$secure_link_expires$uri 自定义字符串";

    if ($secure_link = "") {
        return 403;
    }
    if ($secure_link = "0") {
        return 410;
    }
}
Copy after login

生成url的脚本:

#!/bin/bash

servername="你的servername"
download_file="/download/test.img"
time_num=$(date -d "2018-10-18 00:00:00" +%s)
secure_num="自定义字符串"

res=$(echo -n "${time_num}${download_file} ${secure_num}"|openssl md5 -binary | open
ssl base64 | tr +/ -_ | tr -d =)

echo "http://${servername}${download_file}?md5=${res}&expires=${time_num}"
Copy after login
注意:1、生成脚本中自定义字符串和配置中的自定义字符串要保持一致。2、验证规则保持一致。3、如果没有openssl,可以yum安装。

2. geoip_module模块

基于IP地址匹配MaxMine GeoIP二进制文件,读取IP所在地域信息。
默认安装的Nginx是没有安装geoip这个模块的,安装命令:
yum install nginx-module-geoip
  • 使用场景:

    • 区别国内外做HTTP访问规则

    • 区别国内城市地域做HTTP访问规则

  • 使用步骤:

    • wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz

    • wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz

    • load_module "modules/ngx_http_geoip_module.so";

    • load_module "modules/ngx_stream_geoip_module.so";

    1. 安装geoip:yum install nginx-module-geoip,安装完成查看/etc/nginx/module目录下,如果有对应的so文件,则说明安装成功

    2. 在/etc/nginx/nginx.conf配置文件开头加入

    3. 下载地域分区文件:

    4. 使用gunzip命令解压下载下来的文件

配置示例

geoip_country /etc/nginx/geoip/GeoIP.dat;
geoip_city /etc/nginx/geoip/GeoLiteCity.dat;
server{
    location /myip {
        default_type text/plain;
        return 200 "$remote_addr $geoip_country_name $geoip_country_code $geoip_city";
    }
}
Copy after login

四、基于Nginx的HTTPS服务

1、为什么需要HTTPS

  • 原因:HTTP不安全

    1. 传输数据被中间人盗用、信息泄露

    2. 数据内容劫持、篡改

2、HTTPS协议的实现

对传输内容进行加密以及身份验证
  • 对称加密和非对称加密

  • HTTPS加密协议原理

  • 客户端在使用HTTPS方式与Web服务器通信的步骤

    1. 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接

    2. Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端

    3. 客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级

    4. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站

    5. Web服务器利用自己的私钥解密出会话密钥

    6. Web服务器利用会话密钥加密与客户端之间的通信

通信原理图:
Deep learning content about Nginx

3、证书签名生成

准备步骤:

  1. 确认openssl有无安装,openssl version

  2. nginx有无编译http-ssl-module,nginx -V

生成自签证书步骤:

  1. 生成key密钥

    • openssl genrsa -idea -out ronaldo.key 1024

  2. 生成证书签名请求文件(csr文件)

    • openssl req -new -key ronaldo.key -out ronaldo.csr

    • 当提示输入 A challenge password时,表示ca文件需要更改的另外一个密码,直接回车即可。

打包上面两个步骤生成的文件发送给签名机构即可完成证书签名
  1. 生成证书签名文件(CA文件)

    • openssl x509 -req -days 3650 -in ronaldo.csr -signkey ronaldo.key -out ronaldo.crt

配置语法:

  • ssl

    • 配置语法:ssl on | off;

    • 默认:ssl off;

    • Context:http,server

  • ssl_certificate(crt文件所在位置)

    • 配置语法:ssl_certificate file;

    • 默认:无

    • Context:http,server

  • ssl_certificate_key(key文件所在位置)

    • 配置语法:ssl_certificate_key file;

    • 默认:无

    • Context:http,server

简单示例:

server {
    listen 443;
    server_name locahost;
    ssl on;
    ssl_certificate /etc/nginx/ssl_key/ronaldo.crt;
    ssl_certificate_key /etc/nginx/ssl_key/ronaldo.key;

    index index.html index.htm;
    location / {
        root /opt/app/code;
    }
}
Copy after login

配置完成后:

  1. 停止Nginx:nginx -s stop -c /etc/nginx/nginx.conf,会要求你输入ronaldo.key的密码。

  2. 启动Nginx:nginx -c /etc/nginx/nginx.conf,也会要求你输入密码。

  3. 查看是否启用了443端口:netstat -luntp | grep 443

4、配置苹果要求的证书

  1. 服务器所有的连接使用TLS1.2以上的版本(openssl 1.0.2)

    • 版本:openssl version

    • 自签证书加密签名算法类型以及公钥位数:openssl x509 -noout -text -in ./ronaldo.crt

    • 升级openssl的脚本

#!/bin/bash
cd /opt/download
wget https://www.openssl.org/source/openssl-1.0.2k.tar.gz
tar zxf openssl-1.0.2k.tar.gz
cd openssl-1.0.2k
./config --prefix=/usr/local/openssl
make && make install
mv /usr/bin/openssl /usr/bin/openssl.OFF
mv /usr/include/openssl /usr/include/openssl.OFF
ln -s /usr/local/openssl/bin/openssl /usr/bin/openssl
ln -s /usr/local/openssl/include/openssl /usr/include/openssl
echo "/usr/local/openssl/lib" >> /etc/ld.so.conf
ldconfig -v
openssl version -a
Copy after login
  1. HTTPS证书必须使用SHA256以上哈希算法签名

  2. HTTPS证书必须使用RSA 2048位或ECC 256位以上公钥算法

  3. 使用向前加密技术

通过自签方式、符合苹果要求、通过key文件直接生成crt文件:
  • openssl req -days 36500 -x509 -sha256 -nodes -newkey rsa:2048 -keyout ronaldo.key -out ronaldo_apple.crt

  • -keyout参数会同时再生成一个key文件(没有保护码),reload Nginx就不用再次输入密码。

  • 生成crt文件后,只需要修改配置文件即可

  • 直接生成没有保护码的key:openssl rsa -in ./ronaldoold.key -out ./ronaldonew.key

5、HTTPS服务优化

  1. 激活keepalive长链接

    • 在配置文件写入:keepalive_timeout 100

  2. 设置ssl session缓存

    • 在配置文件写入:ssl_session_cache shared:SSL:10m

五、Nginx与Lua的开发

Nginx+Lua优势:
充分的结合Nginx的并发处理epoll优势和Lua的轻量实现简单的功能且高并发的场景。

1、Lua

是一个简洁、轻量、可扩展的脚本语言
  1. 安装:yum install lua

  2. 运行:

    • lua命令进入交互界面,输入:print("Hello World")即可

    • 执行lua脚本:

#!/usr/bin/lua
print("Hello world")
Copy after login
  1. 注释

    • - - 行注释

    • - -[[块注释- -]]

  2. 变量

    • a = 'alon123"'

    • a = "alon123""

    • a = '97lo1004923"'

    • a = [[alo

    • 123"]]

    • 上述是同一个意思,第三点用的是ASCII表

注意:
Lua数值类型只有double类型
Lua布尔类型只有nil和false是false,数字0、空字符串都是true
Lua中的变量如果没有特殊说明,全是全局变量;如果希望是局部变量,签名加个local
Lua没有++或是+=这样的操作
~=:不等于
..:字符串拼接
io库的分别从stdin和stdout读写的read和write函数
  1. while循环语句

sum = 0
num = 1
while num <= 100 do
    sum = sum + num
    num = num + 1
end
print("sum =", sum)
Copy after login
  1. for循环语句

sum = 0
for i = 1,100 do
    sum = sum + i
end
Copy after login
  1. if-else判断语句

if age == 40 and sex == "Male" then
    print("大于40岁的男人")
elseif age>60 and sex ~= "Female" then
    print("非女人而且大于60")
else
    local age = io.read()
    print("Your age is"..age)
end
Copy after login

2、Nginx + Lua环境

  1. 所需下载以及安装:

    1. LuaJIT

    2. ngx_devel_kit和lua-nginx-module

    3. 重新编译Nginx

    4. 详细的下载和安装步骤参见:

3、Nginx调用lua模块指令

Nginx的可插拔模块化加载执行,共11个处理阶段
指令 含义
set_by_lua,set_by_lua_file 设置nginx变量,可以实现复杂的赋值逻辑
access_by_lua,access_by_lua_file 请求访问阶段处理,用于访问控制
content_by_lua,content_by_lua_file 内容处理器,接收请求处理并输出响应

4、Nginx Lua API

API 含义
ngx.var nginx变量
ngx.req.get_headers 获取请求头
ngx.req.get_uri_args 获取url请求参数
ngx.redirect 重定向
ngx.print 输出响应内容体
ngx.say 同nginx.print,但是会回车
ngx.header 输出响应头
...

5、灰度发布

按照一定的关系区别,分不分的代码进行上线,使代码的发布能平滑过渡上线。
  • 根据用户的信息cookie等信息区别

  • 根据用户的ip地址

实现灰度发布示意图:
Deep learning content about Nginx

相关推荐:

Nginx的场景实践

关于Nginx的基础内容

The above is the detailed content of Deep learning content about Nginx. For more information, please follow other related articles on the PHP Chinese website!

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template