nginx中模块的设置以及反向代理

nginx设置

nginx http 模块的配置文件位于 "/apps/nginx/conf/nginx.conf"(以自己安装时选择的目录为准,若使用yum安装,则在 /etc/nginx/nginx.conf)。在该文件中,需要定义一些常见的配置项,包括:

  1. worker_processes:指定 nginx worker 进程数,建议和 CPU 核心数相同;

  2. error_log:指定错误日志文件路径;

  3. access_log:指定访问日志文件路径;

  4. server_names_hash_bucket_size:配置域名哈希表大小;

  5. server:配置服务器,可以配置多个 server,每个 server 可以配置不同的域名和端口;

  6. location:配置虚拟主机的路径,可以配置多个 location,每个 location 可以配置不同的 URL 和处理方式。

bash 复制代码
worker_processes  4;
error_log  logs/error.log;
pid        logs/nginx.pid;
events {
worker_connections  1024;
}

http {                  #这个就是http模块的起始行
    include       mime.types;
    default_type  application/octet-stream;
    access_log  logs/access.log;
    sendfile        on;
    keepalive_timeout  65;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
    }
}

http 协议配置说明

mime

bash 复制代码
vim  /apps/nginx/mime.types

server块构建虚拟主机

建立独立的配置文件

bash 复制代码
vim /apps/nginx/nginx.conf

include             /apps/nginx/mime.types;
include             /apps/nginx/conf.d/*.conf;
# 在http模块中填写上面两条

建立子配置文件

bash 复制代码
mkdir -p /apps/nginx/conf.d/

cd /apps/nginx/conf.d

vim pc.conf

server {
   listen 80;
   server_name localhost;
   root /data/nginx/html/pc/;
}



vim mobile.conf

server {
   listen 80;
   server_name www.mmm.com;
   root /data/nginx/html/mobile/;
}

构建数据文件夹和文件

bash 复制代码
mkdir /data/nginx/html/pc -pv
mkdir /data/nginx/html/mobile -pv

echo pc > /data/nginx/html/pc/index.html
echo moblie > /data/nginx/html/mobile/index.html

去另一台虚拟机修改配置

bash 复制代码
vim /etc/hosts

www.pc.com 192.168.64.100
m.wqx.com 192.168.64.100

alias 别名

bash 复制代码
 location /study{
        alias /mnt/nginx/sports/;
}

#相当于替换 你访问 study  就是访问/mnt/nginx/sports

location

#语法规则:

location = \| \~ \| \~\* \| \^\~ uri { ... }

=

#用于标准url前,需要请求字串与uri精确匹配,大小敏感,如果匹配成功就停止向下匹配并立即处理请求

^~

#用于标准url前,表示包含正则表达式,并且匹配以指定的正则表达式开头,对URI的最左边部分做匹配检查,不区分字符大小写

~

#用于标准url前,表示包含正则表达式,并且区分大小写

~*

#用于标准url前,表示包含正则表达式,并且不区分大写

不带符号

#匹配起始于此uri的所有的uri

#\

#用于标准url前,表示包含正则表达式并且转义字符。可以将 . * ?等转义为普通符号

#匹配优先级从高到低:

=, ^~, ~/~*, 不带符号

nginx模块

access 模块

匹配了之后就不往下匹配了

deny

自定义 错误页面

我们 可以改变 默认的错误页面,同时也可以用指定的响应状态码进行响应

bash 复制代码
server {
   listen 80;
   server_name www.pc.com;
   root /data/nginx/html/pc;
   error_page 404 /40x.html;
# 如果有错误就去nginx根目录下找44x这个文件

日志位置存放

bash 复制代码
mkdir /data/nginx/logs

listen 80;
server_name www.pc.org;
error_page  500 502 503 504 404 /error.html; 
access_log /apps/nginx/logs/pc_access.log; 
error_log /apps/nginx/logs/pc_error.log; 

mkdir /apps/nginx/logs

nginx -t

nginx -s reload

长连接设置

http 基于 tcp 协议 先要 三次握手然后 再传输数据

一次三次握手 下载多个资源

一次三次握手下载一个资源

bash 复制代码
keepalive_timeout timeout [header_timeout];  
#设定保持连接超时时长,0表示禁止长连接,默认为75s,通常配置在http字段作为站点全局配置
keepalive_requests number;  
#在一次长连接上所允许请求的资源的最大数量,默认为100次,建议适当调大,比如:500
可以加在全局或者 server 

ngx_http_autoindex_module 模块

ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务

bash 复制代码
autoindex on | off;
#自动文件索引功能,默为off
autoindex_exact_size on | off;  
#计算文件确切大小(单位bytes),off 显示大概大小(单位K、M),默认on
autoindex_localtime on | off ; 
#显示本机时间而非GMT(格林威治)时间,默认off
autoindex_format html | xml | json | jsonp; 
#显示索引的页面文件风格,默认html
limit_rate rate; 
#限制响应客户端传输速率(除GET和HEAD以外的所有方法),单位B/s,即bytes/second,默认值0,表示无限制,此指令由ngx_http_core_module提供
set $limit_rate
#变量提供 限制   变量优先级高

用户上传资料

bash 复制代码
client_max_body_size 1m; 
#设置允许客户端上传单个文件的最大值,默认值为1m,上传文件超过此值会出413错误
client_body_buffer_size size; 
#用于接收每个客户端请求报文的body部分的缓冲区大小;默认16k;超出此大小时,其将被暂存到磁盘上的由下面client_body_temp_path指令所定义的位置
client_body_temp_path path [level1 [level2 [level3]]];
#设定存储客户端请求报文的body部分的临时存储路径及子目录结构和数量,目录名为16进制的数字,使用hash之后的值从后往前截取1位、2位、2位作为目录名

太大会报错413

高级配置

网页的状态页

基于nginx 模块 ngx_http_stub_status_module 实现

bash 复制代码
在子配置文件中添加
location /nginx_status {
   stub_status;
}

第三方模块

ehco 模块

yum install git -y

cd /opt

git clone https://github.com/openresty/echo-nginx-module.git

cd /opt/nginx-1.18.0

./configure --prefix=/apps/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module --add-module=/opt/echo-nginx-module-master

make -j 2

make install

systemctl stop nginx

systemctl start nginx

vim /apps/nginx/conf.d/pc.conf

location /hello {

default_type text/html;

echo "hello world ";

}

变量

$remote_addr;

#存放了客户端的地址,注意是客户端的公网IP

$args;

#变量中存放了URL中的参数,例如:http://www.kgc.org/main/index.do?id=20190221\&partner=search

#返回结果为: id=20190221&partner=search 存放的就是这个

select * from table where id=20190221

$document_root;

#保存了针对当前资源的请求的系统根目录,例如:/apps/nginx/html

$document_uri;

#保存了当前请求中不包含参数的URI,注意是不包含请求的指令,比

如:http://www.kgc.org/main/index.do?id=20190221\&partner=search会被定义为/main/index.do

#返回结果为:/main/index.do

$host;

#存放了请求的host名称

limit_rate 10240;

echo $limit_rate;

#如果nginx服务器使用limit_rate配置了显示网络速率,则会显示,如果没有设置, 则显示0

$remote_port;

#客户端请求Nginx服务器时随机打开的端口,这是每个客户端自己的端口

$remote_user;

#已经经过Auth Basic Module验证的用户名

$request_body_file;

#做反向代理时发给后端服务器的本地资源的名称

$request_method;

#请求资源的方式,GET/PUT/DELETE等

$request_filename;

#当前请求的资源文件的磁盘路径,由root或alias指令与URI请求生成的文件绝对路径,

如:/apps/nginx/html/main/index.html

$request_uri; https:// www.baidu.com/main/index.do?id=20190221&partner=search

#包含请求参数的原始URI,不包含主机名,相当于:document_uri?args,例如:/main/index.do?id=20190221&partner=search

$scheme;

#请求的协议,例如:http,https,ftp等

$server_protocol;

#保存了客户端请求资源使用的协议的版本,例如:HTTP/1.0,HTTP/1.1,HTTP/2.0等

$server_addr;

#保存了服务器的IP地址

$server_name;

#请求的服务器的主机名

$server_port; 443 https

#请求的服务器的端口号

$http_<name>

#name为任意请求报文首部字段,表示记录请求报文的首部字段

arbitrary request header field; the last part of a variable name is the field name converted to lower case with dashes replaced by underscores

#用下划线代替横线

#示例: echo $http_User_Agent;

$http_user_agent;

#客户端浏览器的详细信息

$http_cookie;

#客户端的cookie信息

$cookie_<name>

#name为任意请求报文首部字部cookie的key名

$http_<name>

#name为任意请求报文首部字段,表示记录请求报文的首部字段,ame的对应的首部字段名需要为小写,如果有

横线需要替换为下划线

arbitrary request header field; the last part of a variable name is the field

name converted to lower case with dashes replaced by underscores #用下划线代替横线

#示例:

echo $http_user_agent;

echo $http_host;

$sent_http_<name>

#name为响应报文的首部字段,name的对应的首部字段名需要为小写,如果有横线需要替换为下划线,此变量有问题

echo $sent_http_server;

$arg_<name>

#此变量存放了URL中的指定参数,name为请求url中指定的参数

#对比 变量 $arg 是全部, 如果 要id 如下

echo $arg_id;

自定义变量

语法格式:

Syntax: set $variable value;

Default: ---

Context: server, location, if

bash 复制代码
location /test {
        set $name  kgc;
        echo $name;
        set $my_port $server_port;
        echo $my_port;
        }

重写功能

rewrite

Nginx服务器利用 ngx_http_rewrite_module 模块解析和处理rewrite请求,此功能依靠 PCRE(perl compatible regular expression),因此编译之前要安装PCRE库,rewrite是nginx服务器的重要功能之一

ngx_http_rewrite_module模块指令

if指令

用于条件匹配判断,并根据条件判断结果选择不同的Nginx配置,可以配置在server或location块中进行配置,Nginx的if语法仅能使用if做单次判断,不支持使用if else或者if elif这样的多重判断,用法如下:

if (条件匹配) {

action

}

使用正则表达式对变量进行匹配,匹配成功时if指令认为条件为true,否则认为false,变量与表达式之间使用以下符号链接:

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false

!= #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false

~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假

!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假

~* #不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假

!~* #不区分大小字符,判断是否匹配,满足匹配条件为假,不满足匹配条件为真

return

return用于完成对请求的处理,并直接向客户端返回响应状态码,比如:可以指定重定向URL(对于特殊重定向状态码,301/302等) 或者是指定提示文本内容(对于特殊状态码403/500等),处于此指令后的所有配置都将不被执行,return可以在server、if 和 location块进行配置

语法格式

www.kgc.com/test/

404

return code; #返回给客户端指定的HTTP状态码

return code text; #返回给客户端的状态码及响应报文的实体内容,可以调用变量,其中text如果有空格,需要用单或双引号

return code url; #返回给客户端的URL地址

set 指令

指定key并给其定义一个变量,变量可以调用Nginx内置变量赋值给key,另外set定义格式为set $key value,value可以是text, variables和两者的组合。

location /main {

root /data/nginx/html/pc;

index index.html;

default_type text/html;

set $name kgc;

echo $name;

set my_port server_port(nginx 自带的变量 服务端口 一般80);

echo $my_port;

}

break 指令

用于中断当前相同作用域(location)中的其他Nginx配置,与该指令处于同一作用域的Nginx配置中,位于它前面的配置生效,位于后面的 ngx_http_rewrite_module 模块中指令就不再执行,Nginx服务器在根据配置处理请求的过程中遇到该指令的时候,回到上一层作用域继续向下读取配置,该指令可以在server块和locationif块中使用

使用语法如下

if ($slow) {

limit_rate 10k;

break;

}

location /main {

root /data/nginx/html/pc;

index index.html;

default_type text/html;

set $name kgc;

echo $name;

break; #location块中break后面指令还会执行

set my_port server_port;

echo $my_port;

}

rewrite 指令

通过正则表达式的匹配来改变URI,可以同时存在一个或多个指令,按照顺序依次对URI进行匹配,rewrite主要是针对用户请求的URL或者是URI做具体处理

bash 复制代码
location / {
   root /data/nginx/html/pc;
   index index.html;
   rewrite / http://www.pc.com permanent;
 }

防盗链

防盗链基于客户端携带的referer实现,referer是记录打开一个页面之前记录是从哪个页面跳转过来的标记信息,如果别人只链接了自己网站图片或某个单独的资源,而不是打开了网站的整个页面,这就是盗链,referer就是之前的那个网站域名

bash 复制代码
location ~* \.(jpg|gif|swf)$ {            
         root  /data/nginx/pc;
         valid_referers none blocked *.pc.com pc.com;   
         if ( $invalid_referer ) {
           rewrite ^/ http://www.pc.com/error.png;
           }
        }
当访问jpg、gif和swf结尾的文件返回error.png

反向代理

反向代理:reverse proxy,指的是代理外网用户的请求到内部的指定的服务器,并将数据返回给用户的一种方式,这是用的比较多的一种方式。

Nginx 除了可以在企业提供高性能的web服务之外,另外还可以将 nginx 本身不具备的请求通过某种预定义的协议转发至其它服务器处理,不同的协议就是Nginx服务器与其他服务器进行通信的一种规范,主要在不同的场景使用以下模块实现不同的功能

ngx_http_proxy_module: #将客户端的请求以http协议转发至指定服务器进行处理

ngx_http_upstream_module #用于定义为proxy_pass,fastcgi_pass,uwsgi_pass等指令引用的后端服务器分组

ngx_stream_proxy_module:#将客户端的请求以tcp协议转发至指定服务器处理

ngx_http_fastcgi_module:#将客户端对php的请求以fastcgi协议转发至指定服务器助理

ngx_http_uwsgi_module: #将客户端对Python的请求以uwsgi协议转发至指定服务器处理

实现 http 反向代理

官方文档:1****

http 协议反向代理

proxy_pass;

#用来设置将客户端请求转发给的后端服务器的主机,可以是主机名(将转发至后端服务做为主机头首部)、IP

地址:端口的方式

bash 复制代码
server {
  listen 80;
  server_name www.pc.com;
location /main {
  proxy_pass http://192.168.64.101/; 

再使用192.168.64.102的机器访问www.pc.com,会发现返回的是192.168.64.101的页面

反向代理------缓存功能

可以在http模块下添加

proxy_cache_path /data/nginx/proyxcache levels=1:1:1 keys_zone=proxycache:20m inactive=60s max_size=1g;

其中:

proxy_cache_path #定义缓存保存的路径,proyxcache 不用手动创建,会自动创建

/data/nginx/proyxcache #缓存保存的路径

levels=1:1:1 #定义缓存目录结构层次,且每个目录中都有2^16次方个文件或文件夹

keys_zone=proxycache:20m #指内存中缓存的大小,主要用于存放key和metadata,一般1M可存放8000个左右的key

inactive=60s #缓存有效时间

max_size=1g; #最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值

再在子配置文件中添加缓存字段

bash 复制代码
proxy_cache proxycache;
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 301 10m;
proxy_cache_valid any 1m;
proxy_cache proxycache;

反向代理------负载均衡

在上一个节中Nginx可以将客户端的请求转发至单台后端服务器但是无法转发至特定的一组的服务器,而且不能对后端服务器提供相应的服务器状态监测,Nginx 可以基于ngx_http_upstream_module模块提供服务器分组转发、权重分配、状态监测、调度算法等高级功能

官方文档 1

bash 复制代码
在http模块自定义一组服务器 

upstream web {
        server 192.168.64.101;
        server 192.168.64.102;
}

然后修改代理服务器的子配置文件
添加
proxy_pass  http://web/
bash 复制代码
当客户端访问时回馈的有101也有102,达到负载均衡
相关推荐
乘云数字DATABUFF2 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
Goodbye3 天前
大模型无状态架构:从 HTTP 协议到 Harness AI 工程的深度解析
http
荣--4 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森4 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜4 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB5 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode7 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220707 天前
如何搭建本地yum源(上)
运维
ping某8 天前
为什么 Nginx 明明监听了 80,转发后端时却用了 4xxxx 端口?
后端·nginx
霜落长河10 天前
抛弃TCP改用UDP,HTTP3怎么了?
http