首页 > 系统相关 >nginx使用

nginx使用

时间:2024-06-30 18:30:45浏览次数:1  
标签:http server nginx html location 使用 com

Nginx概述

Nginx 功能介绍

  • 静态的web资源服务器html,图片,js,css,txt等静态资源

  • http/https协议的反向代理 ,7层 url

  • 结合FastCGI /uWSGI/SCGI等协议反向代理动态资源请求

  • tcp/udp协议的请求转发(反向代理) 4层

基础特性

  • 模块化设计,较好的扩展性
  • 高可靠性
  • 支持热部署:不停机更新配置文件,升级版本,更换日志文件
  • 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅需2.5M内存
  • event-driven, aio, mmap,sendfile

Web 服务相关的功能

  • 虚拟主机(server)
  • 支持 keep-alive 和管道连接(利用一个连接做多次请求)
  • 访问日志(支持基于日志缓冲提高其性能)
  • url rewirte
  • 路径别名
  • 基于IP及用户的访问控制
  • 支持速率限制及并发数限制
  • 重新配置和在线升级而无须中断客户的工作进程

Nginx 架构

Nginx 进程结构

web请求处理机制

  • 多进程方式:服务器每接收到一个客户端请求就有服务器的主进程生成一个子进程响应客户端,直到用户关闭连接,这样的优势是处理速度快,子进程之间相互独立,但是如果访问过大会导致服务器资源耗尽而无法提供请求。

  • 多线程方式:与多进程方式类似,但是每收到一个客户端请求会有服务进程派生出一个线程来个客户方进行交互,一个线程的开销远远小于一个进程,因此多线程方式在很大程度减轻了web服务器对系统资源的要求,但是多线程也有自己的缺点,即当多个线程位于同一个进程内工作的时候,可以相互访问同样的内存地址空间,所以他们相互影响,一旦主进程挂掉则所有子线程都不能工作了,IIS服务器使用了多线程的方式,需要间隔一段时间就重启一次才能稳定。

主进程(master process)的功能:

对外接口:接收外部的操作(信号)
对内转发:根据外部的操作的不同,通过信号管理 Worker
监控:监控 worker 进程的运行状态,worker 进程异常终止后,自动重启 worker 进程
读取Nginx 配置文件并验证其有效性和正确性
建立、绑定和关闭socket连接
按照配置生成、管理和结束工作进程
接受外界指令,比如重启、升级及退出服务器等指令
不中断服务,实现平滑升级,重启服务并应用新的配置
开启日志文件,获取文件描述符
不中断服务,实现平滑升级,升级失败进行回滚处理
编译和处理perl脚本

工作进程(worker process)的功能:

所有 Worker 进程都是平等的
实际处理:网络请求,由 Worker 进程处理
Worker进程数量:一般设置为核心数,充分利用CPU资源,同时避免进程数量过多,导致进程竞争CPU资源,
增加上下文切换的损耗
接受处理客户的请求
将请求依次送入各个功能模块进行处理
I/O调用,获取响应数据
与后端服务器通信,接收后端服务器的处理结果
缓存数据,访问缓存索引,查询和调用缓存数据
发送请求结果,响应客户的请求
接收主程序指令,比如重启、升级和退出等

Nginx 模块

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理 四层
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

nginx高度模块化,但其模块早期不支持DSO机制;1.9.11 版本支持动态装载和卸载

常用模块

ngx_http_core_module         核心模块
ngx_http_access_module       访问控制  deny   allow
ngx_http_auth_basic_module   身份验证
ngx_http_gzip_module         压缩模块
ngx_http_log_module          日志模块
ngx_http_proxy_module        代理模块
ngx_http_rewrite_module      重写模块
ngx_http_stub_status_module  状态页模块
ngx_http_upstream_module     反向代理
ngx_http_stream_module       四层代理
核心模块:core module
标准模块:
 HTTP 模块: ngx_http_*
 HTTP Core modules   #默认功能
 HTTP Optional modules #需编译时指定
 Mail 模块: ngx_mail_*
 Stream 模块 ngx_stream
第三方模块

安装nginx

编译安装

源码包内的文件:

  • contrib:vim 格式文件,修改nginx配置文件的格式,高亮 cp -r /opt/nginx-1.18.0/contrib/vim/* /usr/share/vim/vimfiles/
  • conf:配置文件
  • man:man帮助 man man/nginx.8 不加路径看不了 nginx.8 文件
  • src:源码包 点c 点h 结尾的文件 find src -type f |xargs cat |wc -l 193678
https://nginx.org/en/download.html
#官网

yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-devel
#安装依赖包   
useradd -M -s /sbin/nologin nginx
#新建nginx用户便于管理

cd /opt/
wget http://nginx.org/download/nginx-1.18.0.tar.gz
#官网下载安装包

tar xf nginx-1.18.0.tar.gz 
cd nginx-1.18.0/
#解压软件包
mkdir /apps/nginx -p


./configure --help   
#查看帮助模块

./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


make -j2 && make install

chown -R nginx.nginx /apps/nginx
#修改权限

ll /apps/nginx/
total 0
drwxr-xr-x 2 root root 333 Sep 22 12:49 conf
drwxr-xr-x 2 root root  40 Sep 22 12:49 html
drwxr-xr-x 2 root root   6 Sep 22 12:49 logs
drwxr-xr-x 2 root root  19 Sep 22 12:49 sbin

######安装好后生成四个文件功能如下
  1. conf:保存nginx所有的配置文件,其中nginx.conf是nginx服务器的最核心最主要的配置文件,其他的.conf则是用来配置nginx相关的功能的,例如fastcgi功能使用的是fastcgi.conf和fastcgi_params两个文件,配置文件一般都有个样板配置文件,是文件名.default结尾,使用的使用将其复制为并将default去掉即可。
  2. html目录中保存了nginx服务器的web文件,但是可以更改为其他目录保存web文件,另外还有一个50x的web文件是默认的错误页面提示页面。
  3. logs:用来保存nginx服务器的访问日志错误日志等日志,logs目录可以放在其他路径,比如/var/logs/nginx里面。
  4. sbin:保存nginx二进制启动脚本,可以接受不同的参数以实现不同的功能。
find   src/   -name "*.c" |xargs cat |wc -l

启动停止nginx

##########启动##############
/apps/nginx/sbin/nginx
#绝对路径启动

ln -s /apps/nginx/sbin/nginx /usr/sbin/
#创建软连接后直接 nginx启动

##########停止###############
killall  nginx

创建Nginx 自启动文件

#复制同一版本的nginx的yum安装生成的service文件
vim /usr/lib/systemd/system/nginx.service
#建立文件
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
#注意文件位置,如果不对 启动不了
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
#注意启动文件位置
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target


####复制使用
[Unit]
Description=nginx - high performance web server
Documentation=http://nginx.org/en/docs/
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/apps/nginx/logs/nginx.pid
ExecStart=/apps/nginx/sbin/nginx -c /apps/nginx/conf/nginx.conf
ExecReload=/bin/kill -s HUP \$MAINPID
ExecStop=/bin/kill -s TERM \$MAINPID
LimitNOFILE=100000

[Install]
WantedBy=multi-user.target



###如果需要修改pid文件可以执行以下操作#################
mkdir /apps/nginx/run/
#创建目录
vim /apps/nginx/conf/nginx.conf
#修改配置文件
pid   /apps/nginx/run/nginx.pid;
#找到 pid的位置修改  
#######################################################


systemctl daemon-reload 
#重新加载配置
systemctl enable --now nginx
#开机自启并立即启动    如果卡主是应为logs下有 nginx.pid  文件  删除即可

chown -R nginx.nginx /apps/nginx
#修改权限

Yum安装

centos7 需要安装epel源
yum install -y epel-release
#安装epel源   额外      rpeo
yum install nginx -y


yum    nginx


去使用官方源按装较新的版本
http://nginx.org/en/linux_packages.html#RHEL

信号

nginx 命令支持向其发送信号,实现不同功能

nginx 当做单独命令使用有以下选项

[root@node2 ~]#nginx -h
  -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: /etc/nginx/)
  -e filename   : set error log file (default: /var/log/nginx/error.log)
  -c filename   : set configuration file (default: /etc/nginx/nginx.conf)
  -g directives : set global directives out of configuration file


nginx   -t   检查语法
nginx  -T   检查语法 并打印所有配置
nginx  -v   显示版本
nginx -V  显示详细信息, 包括 编译的信息 
nginx -c  指定配置文件启动 
nginx  -s  = kill   发送信号

nginx  -s  relaod    重新加载配置文件 
nginx  -s  stop       停止nginx   立即停止
nginx  -s   quit       优雅的退出  , 如果有人在访问我的服务, 那么不会立即关闭, 等客户断开连接再 退出
nginx  -s    reopen   重新生成日志文件   USR1   日志 有关 
nginx  -s    USR2    飞行中升级  

nginx命令 kill命令 含义
nginx -s relaod kill -s HUP 重新加载配置文件
nginx -s stop kill -9(KILL) 立即停止
nginx -s quit kill -3(QUITt) 优雅的退出
nginx -s reopen kill -s USR1 重新生成日志文件
nginx kill -s USR2 飞行中升级

Nginx基本配置

nginx 官方帮助文档:http://nginx.org/en/docs/

tengine 帮助文档:http://tengine.taobao.org/nginx_docs/cn/docs/

Nginx的配置文件的组成部分:

主配置文件:nginx.conf

子配置文件: include conf.d/*.conf

配置文件由指令和指令块构成
每条指令以;分号结尾,指令与值之间以空格符号分隔
pid    /apps/run/nginx.pid
指令已{}达括号将多条指令组织在一起且可以嵌套指令块
include语句允许组合多个配置文件以提升可维护性 
#号注释
$使用变量
部分支持正则
自定义变量:由用户使用set命令定义,格式: set variable_name value


全局配置
events{  控制事件驱动      }
http  {  web网页配置有关   server  { location  }   }



main block:主配置段,即全局配置段,对http,mail都有效

#事件驱动相关的配置   同步
event {
 ...
}   
#http/https 协议相关配置段
http {
 ...
}          
#默认配置文件不包括下面两个块
#mail 协议相关配置段
mail {
 ...
}    
#stream 服务器相关配置段
stream {负载均衡
 ...
}

全局块配置

nginx 有多种模块

  • 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 、配置文件解析 、事件驱动机制 、进程管理等核心功能
  • 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如: 端口配置 、 网页编码设置 、 HTTP响应头设置 等等
  • 可选HTTP模块:主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,比如:Flash 多媒体传输 、解析 GeoIP 请求、 网络传输压缩 、 安全协议 SSL 支持等
  • 邮件服务模块:主要用于支持 Nginx 的 邮件服务 ,包括对 POP3 协议、 IMAP 协议和 SMTP协议的支持
  • Stream服务模块: 实现反向代理功能,包括TCP协议代理
  • 第三方模块:是为了扩展 Nginx 服务器应用,完成开发者自定义功能,比如: Json 支持、 Lua 支持等

event块配置

io模型调优

events {
   worker_connections  65535;  #设置单个工作进程的最大并发连接数 worker_rlimit_nofile  总数量
   use epoll;
   #使用epoll事件驱动,Nginx支持众多的事件驱动,比如:select、poll、epoll,只能设置在events模块中设置。
   accept_mutex on; 
   #on为同一时刻一个请求轮流由work进程处理,而防止被同时唤醒所有worker,避免多个睡眠进程被唤醒的设置,默认为off,新请求会唤醒所有worker进程,此过程也称为"惊群",因此nginx刚安装完以后要进行适当的优化。建议设置为on
   multi_accept on; 
   #ON时Nginx服务器的每个工作进程可以同时接受多个新的网络连接,此指令默认为off,即默认为一个工作进程只能一次接受一个新的网络连接,打开后几个同时接受多个。建议设置为on
}

http块设置

http 是一个大的语句块,包含若干个小的语句块(比如server语句块)

http {
 ...
 ...  #各server的公共配置
 server {    #每个server用于定义一个虚拟主机,第一个server为默认虚拟服务器   对主机的设置   端口号  ip地址   域名  主站点  日志  
 ...
 }
 server {     
 ...
 
 server_name   #虚拟主机名
 root     #主目录
 alias     #路径别名
 location [OPERATOR] URL {     #指定URL的特性      匹配  url 
 ...
 if CONDITION {
 ...
 }
 }
 }
}

http 协议配置说明

http {
   expires   1d;
   include       mime.types; #导入支持的文件类型,是相对于/apps/nginx/conf的目录
   default_type application/octet-stream; #除mime.types中文件类型外,设置其它文件默认类型,访问其它类型时会提示下载不匹配的类型文件
#日志配置部分
    #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; #在开启了sendfile的情况下,合并请求后统一发送给客户端。
    #tcp_nodelay   off; #在开启了keepalived模式下的连接是否启用TCP_NODELAY选项,当为off时,延迟0.2s发送,默认On时,不延迟发送,立即发送用户响应报文。
    #keepalive_timeout 0;
   keepalive_timeout  65 65; #设置会话保持时间,第二个值为响应首部:keepAlived:timeout=65,可以和第一个值不同
    #gzip on; #开启文件压缩
   server {
       listen        80; #设置监听地址和端口
       server_name localhost   ; #设置server name,可以以空格隔开写多个并支持正则表达式,如:*.kgc.com www.kgc.* ~^www\d+\.kgc\.com$ default_server 
        #charset koi8-r; #设置编码格式,默认是俄语格式,建议改为utf-8
        #access_log logs/host.access.log main;
       
       location /fxj  {           www.ky31.com/fsj     /apps/nginx/html   
           root   /data;
           index index.html index.htm;
       }
        #error_page 404             /404.html;
        # redirect server error pages to the static page /50x.html
        #
       error_page   500 502 503 504 /50x.html; #定义错误页面
       location = /50x.html {
           root   html;
       }
        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ { #以http的方式转发php请求到指定web服务器
        #   proxy_pass   http://127.0.0.1;
        #}
        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ { #以fastcgi的方式转发php请求到php处理
        #   root           html;
        #   fastcgi_pass   127.0.0.1:9000;
        #   fastcgi_index index.php;
        #   fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
        #   include       fastcgi_params;
        #}
        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht { #拒绝web形式访问指定文件,如很多的网站都是通过.htaccess文件
来改变自己的重定向等功能。
        #   deny all;
        #}
       location ~ /passwd.html {
           deny all;
       }
   }
    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server { #自定义虚拟server
3.3.1 MIME
范例: 识别php文件为text/html
    #   listen       8000;
    #   listen       somename:8080;
    #   server_name somename alias another.alias;
    #   location / { 
    #       root   html;
    #       index index.html index.htm; #指定默认网页文件,此指令由
ngx_http_index_module模块提供
    #   }
    #}
    # HTTPS server
    #
    #server { #https服务器配置
    #   listen       443 ssl;
    #   server_name localhost;
    #   ssl_certificate     cert.pem;
    #   ssl_certificate_key cert.key;
    #   ssl_session_cache   shared:SSL:1m;
    #   ssl_session_timeout 5m;
    #   ssl_ciphers HIGH:!aNULL:!MD5;
    #   ssl_prefer_server_ciphers on;
    #   location / {
    #       root   html;
    #       index index.html index.htm;
    #   }
    #}

Nginx高级配置

日志分割

----------------日志切割-------------------
vim /opt/fenge.sh
#!/bin/bash
# Filename: fenge.sh
day=$(date -d "-1 day" "+%Y%m%d")											#显示前一天的时间
logs_path="/var/log/nginx"
pid_path="/usr/local/nginx/logs/nginx.pid"
[ -d $logs_path ] || mkdir -p $logs_path 									#创建日志文件目录
mv /usr/local/nginx/logs/access.log ${logs_path}/kgc.com-access.log-$day	#移动并重命名日志文件
kill -USR1 $(cat $pid_path)													#重建新日志文件
find $logs_path -mtime +30 -exec rm -rf {} \;								#删除30天之前的日志文件
#find $logs_path -mtime +30 | xargs rm -rf 

chmod +x /opt/fenge.sh
/opt/fenge.sh
ls /var/log/nginx
ls /usr/local/nginx/logs/access.log 

crontab -e
0 1 * * * /opt/fenge.sh

一键安装及脚本
日志分割
系统调优 
自动检测系统性能

Nginx压缩功能

支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,这样有助于降低出口带宽的利用率,降低企业的IT支出,不过会占用相应的CPU资源。Nginx对文件的压缩功能是依赖于模块 ngx_http_gzip_module

官方文档: https://nginx.org/en/docs/http/ngx_http_gzip_module.html

配置指令如下:

#启用或禁用gzip压缩,默认关闭
gzip on | off; 

#压缩比由低到高从1到9,默认为1
gzip_comp_level level;

#禁用IE6 gzip功能
gzip_disable "MSIE [1-6]\."; 

#gzip压缩的最小文件,小于设置值的文件将不会压缩
gzip_min_length 1k; 

#启用压缩功能时,协议的最小版本,默认HTTP/1.1
gzip_http_version 1.0 | 1.1; 

#指定Nginx服务需要向服务器申请的缓存空间的个数和大小,平台不同,默认:32 4k或者16 8k;
gzip_buffers number size;  

#指明仅对哪些类型的资源执行压缩操作;默认为gzip_types text/html,不用显示指定,否则出错
gzip_types mime-type ...;     a.txt  

#如果启用压缩,是否在响应报文首部插入“Vary: Accept-Encoding”,一般建议打开
gzip_vary on | off;

#预压缩,先压缩好,不用临时压缩,消耗cpu
gzip_static on | off;


#重启nginx并进行访问测试压缩功能
[root@centos8 ~]# cp /apps/nginx/logs/access.log /data/nginx/html/pc/m.txt
[root@centos8 ~]# echo "test" > /data/nginx/html/pc/test.html #小于1k的文件测试是否会压缩
[root@centos8 ~]# vim /apps/nginx/conf/nginx.conf
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/gif image/png;      
gzip_vary on;
#重启Nginx并访问测试:
[root@centos8 ~]# curl --head --compressed 192.168.91.100/test.html
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Feb 2019 01:52:23 GMT
Content-Type: text/html
Last-Modified: Thu, 21 Feb 2019 10:31:18 GMT
Connection: keep-alive
Keep-Alive: timeout=65
Vary: Accept-Encoding
ETag: W/"5c6e7df6-171109"
Content-Encoding: gzip #压缩传输
#验证不压缩访问的文件大小:

https

ssl on | off;   
#为指定的虚拟主机配置是否启用ssl功能,此功能在1.15.0废弃,使用listen [ssl]替代
listen 443 ssl;

ssl_certificate /path/to/file;
#指向包含当前虚拟主机和CA的两个证书信息的文件,一般是crt文件

ssl_certificate_key /path/to/file;
#当前虚拟主机使用的私钥文件,一般是key文件

ssl_protocols [SSLv2] [SSLv3] [TLSv1] [TLSv1.1] [TLSv1.2]; 
#支持ssl协议版本,早期为ssl现在是TLS,默认为后三个

ssl_session_cache off | none | [builtin[:size]] [shared:name:size];
#配置ssl缓存
 off: #关闭缓存
 none:  #通知客户端支持ssl session cache,但实际不支持
 builtin[:size]:#使用OpenSSL内建缓存,为每worker进程私有
 [shared:name:size]:#在各worker之间使用一个共享的缓存,需要定义一个缓存名称和缓存空间大小,一兆可以存储4000个会话信息,多个虚拟主机可以使用相同的缓存名称

ssl_session_timeout time;
#客户端连接可以复用ssl session cache中缓存的有效时长,默认5m

升级 openssl

./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=/data/echo-nginx-module-master --with-openssl=/data/openssl-1.1.1k

重写功能rewrite

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

一,用于实现URL的重写,URL的重写是非常有用的功能,比如它可以在我们改变网站结构之后,不需要客户端修改原来的书签,也无需其他网站修改我们的链接,就可以设置为自动访问,另外还可以在一定程度上提高网站的安全性。

ngx_http_rewrite_module模块指令

官方文档: https://nginx.org/en/docs/http/ngx_http_rewrite_module.html

if 指令

官方文档:

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#if

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

if (条件匹配) {   
 action
}

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

= #比较变量和字符串是否相等,相等时if指令认为该条件为true,反之为false
!=  #比较变量和字符串是否不相等,不相等时if指令认为条件为true,反之为false
~ #区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假
!~ #区分大小写字符,判断是否匹配,不满足匹配条件为真,满足匹配条件为假

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


-f 和 !-f #判断请求的文件是否存在和是否不存在
-d 和 !-d #判断请求的目录是否存在和是否不存在
-x 和 !-x #判断文件是否可执行和是否不可执行
-e 和 !-e #判断请求的文件或目录是否存在和是否不存在(包括文件,目录,软链接)
#注意:
#如果$变量的值为空字符串或0,则if指令认为该条件为false,其他条件为true。
#nginx 1.0.1之前$变量的值如果以0开头的任意字符串会返回false
#示例:
http://www.baidu.com

3字打头重定向
301  永久重定向  将缓存记录在浏览器中
302  临时重定向  没有缓存  每次都要重定向 
304  


location /main {
     index index.html;
     default_type text/html;
     if ( $scheme = http ){
       echo "if-----> $scheme";
     }
     if ( $scheme = https ){
      echo "if ----> $scheme";
   }
    
     #if (-f $request_filename) {
     #   echo "$request_filename is exist";
     #}
     if (!-e $request_filename) {
        echo "$request_filename is not exist";
        #return ;
   }
 }

http://192.168.91.100/test/a.jpg

/data/test/a.jpg


【用户访问的文件不存在 直接返回主页】
server {
    listen 80;
    server_name www.kgc.com;
    root /data/nginx/pc/;
    location / {
    root /data/nginx/pc/;
}
    location /test {
    default_type text/plain;
    return  301 http://www.baidu.com;
}
    location /main {
    index index.html;
    default_type text/html;
    if ( $scheme = http ){
    return 666 "if-----> $scheme";
   }
    if (!-e $request_filename){
    return 302  /index.html;          #如果用户不存在直接跳转到主页面

}
}
}
www.kgc.com/main/xxxxx     
#注意访问的main下的不存在 目录   
#注意前面的if语句执行后会 停止匹配
【想控制所有网站可以  放到前面】
server {
    listen 80;
    server_name www.kgc.com;
    root /data/nginx/pc/;
    if (!-e $request_filename){
    return 302  /index.html;          #如果用户不存在直接跳转到主页面
	}
	
	location / {
    root /data/nginx/pc/;
}
    location /test {
    default_type text/plain;
    return  301 http://www.baidu.com;
}
    location /main {
    index index.html;
    default_type text/html;
    if ( $scheme = http ){
    return 666 "if-----> $scheme";
   }
    
}
}

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地址    

return   code  [text] 

范例:

location / {
   root /data/nginx/html/pc;
    default_type text/html;
   index index.html;
      if ( $scheme = http ){
        #return 666;
        #return 666 "not allow http";
        #return 301 http://www.baidu.com;
       return 500 "service error";
        echo "if-----> $scheme"; #return后面的将不再执行
     }
     if ( $scheme = https ){
      echo "if ----> $scheme";
   }
}
##############################################################
例子1:
server { 
    listen 80;
    server_name www.kgc.com;
    root /data/nginx/pc/;
	location /{
        root /data/nginx/pc/;

}
  location /test {      #访问test 直接返回403
	return 403;         #可以改成666    
  }

}

例子2:
location /test {                #访问test 直接返回403
	return 666 "hello";         #可以改成666自定义,hello是描述 文字可以  图形浏览器不可以    
  }


例子3:
  location /test { 
  default_type text/plain;     #定义文本格式后图形浏览器可以看见
  return 666 "hello";
 } 


例子4:
location /test {
        default_type text/plain;
        return 302 http://www.baidu.com;    
}

location /test {
        default_type text/plain;
        return 301 /index.html;    
}
301 缓存在磁盘上   我们即使关闭nginx  服务器  客户也可以正常跳转      
302 没有缓存 , 服务器断开无法重定向 


301永久重定向
302临时重定向

永久重定向

image-20230220215319946

set 指令

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

set   $变量名    变量值 


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块中使用

注意: 如果break指令在location块中后续指令还会继续执行,只是不执行 ngx_http_rewrite_module 模块的指令(set rewrit return if),其它指令还会执行

使用语法如下:

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;
 }

location  /test  {
    set  naem 
    
    
}


if
return
rewrite
set


break    如果同属于 rewrite  模块那么 break之后的命令就不执行了 

rewrite 指令

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

官方文档:

https://nginx.org/en/docs/http/ngx_http_rewrite_module.html#rewrite

rewrite可以配置在 server、location、if

语法格式 :

rewrite可以配置在 server、location、if
语法格式 :
rewrite regex               replacement(www.baidu.com)        [flag];
        正则匹配原始访问url    替代的url链接                  标志 ()premanent301   redirect302     break    last  死循环

rewrite将用户请求的URI基于regex所描述的模式进行检查,匹配到时将其替换为表达式指定的新的URI

注意:如果在同一级配置块中存在多个rewrite规则,那么会自上而下逐个检查;被某条件规则替换完成后,会重新一轮的替换检查,隐含有循环机制,但不超过10次;如果超过,提示500响应码,[flag]所表示的标志位用于控制此循环机制如果替换后的URL是以http://或https://开头,则替换结果会直接以重定向返回给客户端, 即永久重定向 301

正则表达式格式

. #匹配除换行符以外的任意字符
\w #匹配字母或数字或下划线或汉字
\s #匹配任意的空白符
\d #匹配数字    [0-9]   
\b #匹配单词的开始或结束
^ #匹配字符串的开始
$ #匹配字符串的结束
* #匹配重复零次或更多次
+ #匹配重复一次或更多次
? #匹配重复零次或一次
{n} #匹配重复n次
{n,} #匹配重复n次或更多次
{n,m} #匹配重复n到m次
*? #匹配重复任意次,但尽可能少重复
+? #匹配重复1次或更多次,但尽可能少重复
?? #匹配重复0次或1次,但尽可能少重复
{n,m}? #匹配重复n到m次,但尽可能少重复
{n,}? #匹配重复n次以上,但尽可能少重复
\W  #匹配任意不是字母,数字,下划线,汉字的字符
\S #匹配任意不是空白符的字符
\D #匹配任意非数字的字符
\B #匹配不是单词开头或结束的位置
[^x] #匹配除了x以外的任意字符
[^kgc] #匹配除了kgc 这几个字母以外的任意字符

rewrite flag 使用介绍

利用nginx的rewrite的指令,可以实现url的重新跳转,rewrtie有四种不同的flag,分别是redirect(临时重定向302)、permanent(永久重定向301)、break和last。其中前两种是跳转型的flag,后两种是代理型

  • 跳转型指由客户端浏览器重新对新地址进行请求
  • 代理型是在WEB服务器内部实现跳转

rewrite 格式

Syntax: rewrite regex replacement [flag]; #通过正则表达式处理用户请求并返回替换后的数据包。
Default: —
Context: server, location, if

flag 说明

redirect;302
#临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求;使用相对路径,或者http://或https://开头,状态码:302

permanent;301       www.bj.com     www.beijing.com
#重写完成后以永久重定向方式直接返回重写后生成的新URL给客户端,由客户端重新发起请求,状态码:301



break;       www.bj.com
#重写完成后,停止对当前URL在当前location中后续的其它重写操作,而后直接跳转至重写规则配置块之后的其它配置;结束循环,建议在location中使用
#适用于一个URL一次重写 
 



last; 
#重写完成后,停止对当前URI在当前location中后续的其它重写操作,而后对新的URL启动新一轮重写检查,不建议在location中使用
#适用于一个URL多次重写,要注意避免出现超过十次以及URL重写后返回错误的给用户301

例子:

bj ------ > beijing

bj 宝鸡----> baoji

www.bj.com -----> www.beijing.com

#访问  bj   跳转到  beijing  
location /bj {
   root /data/nginx/pc;   
   rewrite ^/bj/(.*)    /beijing/$1   permanent;

}

此处的$1代表后项引用

192.168.91.100/bj/(.*)     /beijing/$1 



location / {
   root /data/nginx/html/pc;
   index index.html;
   rewrite / http://www.kgc.com permanent;
    #rewrite / http://www.kgc.com redirect;
 }
#重启Nginx并访问域名 http://www.kgc.org 进行测试



【rewrite】
rewrite regex replacement [flag];
指令     正则   替换         标志


【访问bj  等于 访问beijing】
location /bj {
   rewrite ^/bj/(.*) /beijing/$1  permanent;
}
mkdir beijing
echo beijing > beijing/index.html


整个网页跳转  老域名跳转到新域名
location / {
         root /data/nginx/pc/;
        rewrite /  http://www.accp.com permanent;
}
server {

listen 80;
server_name www.accp.com;
root /data/nginx/pc/accp/;
}
~              
cd /data/nginx/pc/
mkdir accp
echo accp > accp/index.html


问,直接给你结果

break 用户在浏览器中的连接不会改变

【break】
server {
location /bj {
   rewrite ^/bj/(.*) /beijing/$1  break;
}
}

mkdir beijing
echo beijing > beijing/index.html

mkdir bj
echo bj > bj/index.html


301 302   请求后  告诉你重定向的域名, 让你重新发起请求  两次请求
break     服务器缓存好网页直接让你访   一次请求

last 与 break

 location /break {
   rewrite .*  /test  break;
   }

  location /last {
   rewrite .*  /test  last;
   }

  location /test {
  return 403;
  }



location 
500




例子:要有页面访问
break  是立即终止匹配   使用该url 进行访问
last    停止本location中的 匹配,    开启新一轮的 location 匹配
location  /break {
  root /data/;
  rewrite ^/break/(.*)  /test1/$1  break;
  rewrite ^/test1/(.*)  /break/$1  break;
  }

  location  /last {
  root /data/;
  rewrite ^/last/(.*)   /test1/$1  last;
  rewrite ^/test1/(.*)  /test2/$1  last;
  }

  location  /test1 {
  echo  "new test1";
  }

  location  /test2 {
  echo  "new test2";
  }


mkdir   /data/test1
mkdir   /data/test2

echo /data/test1  > /data/test1/index.html
echo /data/test2  > /data/test2/index.html


curl 192.168.91.100/break/index.html
curl 192.168.91.100/last/index.html

实战案例 http 转https

server {
 listen 443 ssl;
 listen 80;
 ssl_certificate /apps/nginx/certs/www.kgc.org.crt;
 ssl_certificate_key /apps/nginx/certs/www.kgc.org.key;
 ssl_session_cache shared:sslcache:20m;
 ssl_session_timeout 10m;
 server_name www.kgc.org;
 
    
   location / {    #针对全站跳转
   root /data/nginx/html/pc;
   index index.html;
    if ($scheme = http ){  #如果没有加条件判断,会导致死循环
   rewrite /(.*) https://$host/$1 redirect;
   }     
 }
    
    
    
 location /login {     #针对特定的URL进行跳转https 
 if ($scheme = http ){  #如果没有加条件判断,会导致死循环
   rewrite / https://$host/login redirect;
   }
    }
}

其他例子:

#案例1: 更换目录访问方式,目录转换为对象存储形式
#要求:
#/20200106/static ->/static?id=20200106
#/20200123/image ->/image?id=20200123
rewrite ^/(\d+)/(.+)/   /$2?id=$l last;



#案例2:多目录转换访问方式
#要求: www.lucky.com/images/20200106/1.jpg => www.lucky.com/index.do?name=images&dir=20200106=&file=1.jpg

#规则配置:
if ($host ~* (.*)\.lucky\.com) {
 rewrite ^/(.*)/(\d+)/(.*)$   /index.do?name=$1&dir=$2&file=$3 last; 
}

防盗链

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

none:#请求报文首部没有referer首部,比如用户直接在浏览器输入域名访问web网站,就没有referer信息
blocked:#请求报文有referer首部,但无有效值,比如为空 





server_names:#referer首部中包含本主机名及即nginx 监听的server_name。
www.lucky.com/test 
www.kucky.com/a.jpg

www.cloud.com/index.html
www.lucky.com/a.jpg


arbitrary_string:#自定义指定字符串,但可使用*作通配符。示例: *.kgc.org www.kgc.*  www.baidu.com   


blog.lucky.com/index.html 
www.lucky.com/a.jpg

blog.sina.com
news.sina.com 
sports.sina.com

regular expression:#被指定的正则表达式模式匹配到的字符串,要使用~开头,例如:~.*\.kgc\.com

实现盗链

在二机器上:
systemctl   stop firewalld
setenforce  0
yum install epel-release.noarch -y
yum install nginx
cd /usr/share/nginx/html

yum  install  httpd  -y
cd /var/www/html 

vim  index.html
<html>
<body>
<h1>this is yunjisuan  </h1>
<img src="http://www.lucky.com/a.jpg"/>
</body>
</html>
systemctl start nginx   

vim   /etc/nginx/nginx.conf
41         server_name  www.lucky.com;
修改41行如上

真机上 添加dns  解析
C:\Windows\System32\drivers\etc   
打开  hosts  文件  
第二台机器的IP地址       www.lucky.com
真机上测试
www.lucky.com  是否可以打开图片

第一胎服务器
vim   /apps/nginx/conf.d/pc.conf
server{
        listen 80;
        server_name  www.pc.com;
        root    /data/nginx/pc;
        location  / {
        root  /data/nginx/pc;
}
        location ~* \.(jpg|gif|swf|jpeg|bmp)$ {
         root  /data/nginx/pc;
         valid_referers none blocked *.lucky.com lucky.com;
         if ( $invalid_referer ) {
           #rewrite ^/ http://www.lucky.com/error.jpg;
           return   403;
        }
        }
}
}

cd  /data/nginx/pc/
拖入两张图片   a.jpg     error.png
再次测试www.accp.com  是否可以打开图片








www.kgc.com
www.accp.com

80
/data/nginx/kgc
/data/nginx/accp

server  {
   listen 80;
	server_name   www.kgc.com;
	root  /data/nginx/kgc;
}

server  {
   listen 80;
	server_name   www.accp.com;
	root  /data/nginx/accp;
}

实现防盗链

location ~* \.(jpg|gif|swf|png)$ {            
         root  /data/nginx/pc;
         valid_referers none blocked *.pc.com pc.com;   
         if ( $invalid_referer ) {
           rewrite ^/ http://www.pc.com/error.png;
           #return  403
           }
        }
        
        
        
~* \.(jpg|gif|swf)$:这段正则表达式表示匹配不区分大小写,以.jpg 或.gif 或.swf 结尾的文件
Valid_referers:设置信任的网站,可以正常使用图片。
None :浏览器中 referer 为空的情况,就是直接在浏览器访问图片。
Blocked :referer 不为空的情况 ,但是值被代理或防火墙删除了,这些值不以 http://或https://开头。后面的网址或者域名:referer 中包含相关字符串的网址。
If 语句:如果链接的来源域名不在 valid_referers 所列出的列表中,$invalid_referer 为1,则执行后面的操作,即进行重写或返回 403 页面。


例子:
server {
   index index.html;
   valid_referers none blocked server_names *.magedu.com *.magedu.org   
~\.google\. ~\.baidu\. ~\.bing\. ~\.so\. ~\.dogedoge\. ; #定义有效的
referer
    if ($invalid_referer) { #假如是使用其他的无效的referer访问
     return 403 "Forbidden Access"; #返回状态码403
   }
......
}
#重启Nginx并访问测试

标签:http,server,nginx,html,location,使用,com
From: https://www.cnblogs.com/GrandOB/p/18276796

相关文章

  • C#使用MQTT通讯协议发布订阅主题报文
    一、服务端1.添加引用MQTTnet类库   2.代码:启动一个MQTT服务1//启动一个MQTT服务器2//MQTT3IMqttServerserver=newMqttFactory().CreateMqttServer();4server.ClientConnecte......
  • 这个大纲涵盖了从基础到高级的 Log Parser 使用技巧和实践,帮助用户全面掌握这一强大的
    LogParser是一个功能强大的工具,用于处理和分析各种日志文件和数据源。以下是一个初级使用教程的大纲,帮助你快速入门和理解其基本功能和用法:1. 介绍和安装什么是LogParser?LogParser是一种强大的命令行工具,用于从多种日志文件、事件日志、CSV文件以及其他结构化数据......
  • 【Docker Compose】掌握容器资源管理:高效限制CPU与内存使用
    【DockerCompose】掌握容器资源管理:高效限制CPU与内存使用一、DockerCompose介绍1.1DockerCompose简介1.2DockerComposeV2简介1.3DockerComposeV1与V2版本区别1.4docker-compose.yaml部署文件介绍二、检查本地docker环境2.1本地环境规划2.2......
  • 初学者必读:如何使用 Nuxt 中间件简化网站开发
    title:初学者必读:如何使用Nuxt中间件简化网站开发date:2024/6/24updated:2024/6/24author:cmdragonexcerpt:本文概述了Nuxt3框架的升级特点,对比Nuxt2,详细解析中间件应用、配置策略与实战示例,涵盖功能、错误管理、优化技巧,并探讨与Nuxt3核心组件集成方法,给出最佳......
  • 不会你打我!使用AI绘画Stable Diffusion或Midjourney创建你的专属表情包!附完整详细教程
    大家好,我是向阳相信大家对微信表情包一定非常熟悉了,可能每天都在使用别人的表情包。那么有没有想过制作自己的专属表情包呢?那您可能觉得我又不会设计,怎么制作呢?没关系,虽然不会设计,但是我们可以简单地使用一些AI辅助。不是也上架了自己制作的表情包~今天将自己通过AI制作......
  • AI绘画Stable Diffusion 超强一键去除图片中的物体,免费使用!
    大家好,我是设计师阿威在生成图像时总有一些不完美的小瑕疵,比如多余的物体或碍眼的水印,它们破坏了图片的美感。但别担心,今天我们将介绍一款神奇的工具——sd-webui-cleaner,它可以帮助我们使用StableDiffusion轻松去除图片中的指定物体和水印。让我们一起学习如何使用这个工......
  • 免费ddns工具,快解析DNS解析使用教程
    DDNS(DynamicDomainNameServer),中文叫动态域名解析,主要用于没有固定公网ip的网络环境下,使用一个固定的域名,解析动态变化的ip地址,达到远程访问的目的。众所周知,目前公网ip资源非常紧缺,固定公网ip价格非常昂贵,而动态公网ip因为每天都会变,使用起来很不方便。这时DDNS的价值就提......
  • 免费ddns工具,快解析DNS解析使用教程
    DDNS(DynamicDomainNameServer),中文叫动态域名解析,主要用于没有固定公网ip的网络环境下,使用一个固定的域名,解析动态变化的ip地址,达到远程访问的目的。众所周知,目前公网ip资源非常紧缺,固定公网ip价格非常昂贵,而动态公网ip因为每天都会变,使用起来很不方便。这时DDNS的价值就提......
  • springboot项目中使用iframe引入页面
    很多朋友想在spring-boot项目(包含:Security)中引用iframe,但是都不能正常运行,会报错localhost已拒绝连接:这是因为这个框架的安全性考虑:默认情况下,现代的Web浏览器会应用一些安全策略,例如同源策略,限制从一个源加载的内容如何与来自另一个源的内容进行交互。如果你尝试从一个不......
  • Java Script-使用DOM编程实现移动坦克
    要求:实现:将坦克图片放在页面上:<imgid="mytank"src="./img/right.png"/>在css中设置坦克的初始位置以及页面背景:<styletype="text/css">    input{font-size:26px;margin-top:20px;}    body{background-image:url("./img/gra......