Appearance
nginx
概述
Nginx是开源、高性能、高可靠的web和反向代理服务器,支持热部署,几乎可以做到不间断运行,即使持续运行不需要重新启动,也可以不间断提供服务,而且还可以对软件版本进行热更新
nginx占据内存少,并发能力强,可以支持高度每秒5W并发连接数,最重要的是,nginx是免费的并可以商业化,配置简单
特点
- 高并发、高性能
- 模块化架构易于扩展
- 异步非阻塞的事件驱动模型
- 更新迭代发布系统,不需要重启nginx
- 支持热部署、平滑升级
- 完全开源、生态繁荣
使用场景
- 静态资源服务,通过本地文件系统提供服务
- 反向代理服务,延伸出包括缓存、负载均衡等
- API服务、跨域处理
源码安装方式
演示系统
CentOS Stream release 8
安装环境依赖
- 安装gcc环境:
yum install gcc-c++
- 安装PCRE库,用于解析正则表达式:
yum install -y pcre pcre-devel
- zlib压缩和解压缩依赖:
yum install -y zlib zlib-devel
- SSL 安全的加密的套接字协议层,用于HTTP安全传输,也就是https:
yum install -y openssl openssl-devel
- 安装gcc环境:
官网下载NGINX ,上传下载的nginx包置centos服务器 或者 执行wget下载命令:
wget http://nginx.org/download/nginx-1.20.2.tar.gz
解压:
tar -zxvf nginx-1.20.2.tar.gz
创建Nginx临时目录,如果不创建,在启动的过程中会报错:
mkdir /var/temp/nginx -p
进入到解压的目录执行以下命令:
./configure --with-stream \ --prefix=/usr/local/nginx \ --pid-path=/var/run/nginx.pid \ --lock-path=/var/lock/nginx.lock \ --error-log-path=/home/workspaces/logs/nginx/error.log \ --http-log-path=/home/workspaces/logs/nginx/access.log \ --with-http_gzip_static_module \ --http-client-body-temp-path=/var/temp/nginx/proxy \ --http-fastcgi-temp-path=/var/temp/nginx/fastcgi \ --http-uwsgi-temp-path=/var/temp/nginx/uwsgi \ --http-scgi-temp-path=/var/temp/nginx/scgi \ --with-http_ssl_module
执行编译以及安装命令:
make && make install
cd /usr/local/nginx/sbin
执行启动命令:./nginx
如果无法访问:请检查80端口是否开启、防火墙是否关闭
以上安装依赖如果服务器连不上互联网,可以下载对应的依赖包上传服务器进行解压和安装,类似与nginx安装方式
命令 | 解释 |
---|---|
--prefix | 指定nginx安装目录 |
--pid-path | 指向nginx的pid |
--lock-path | 锁定安装的文件,防止被恶意篡改或操作 |
--error-log-path | 错误日志路径 |
--http-log-path | http日志路径 |
–with-http_gzip_static_module | 启用gzip模块,在线实时压缩输出数据流 |
–http-client-body-temp-path | 设定客户端请求的临时目录 |
–http-proxy-temp-path | 设定http请求的临时目录 |
–http-fastcgi-temp-path | 设定fastcgi临时目录 |
–http-uwsgi-temp-path | 设定uwsgi临时目录 |
–http-scgi-temp-path | 设定scgi临时目录 |
--with-http_ssl_modu | https 模块 |
异常处理:
1、-bash: make: command not found
系统是mini最小化安装,缺少make、vim命令
解决:yum -y install gcc automake autoconf libtool make
2、缺少nginx.pid文件时,重新创建对应的目录 =》./nginx
3、启动时pid文件失效:./nginx -c nginx.conf所在的路径(重新指向配置文件后,重新生成pid文件)
nginx应用程序命令
# 向主进程发送信息,重新加载配置文件,热重启
./nginx -s reload
# 重启nginx
./nginx -s reopen
# 快速停止
./nginx -s stop
# 等待工作进程处理完成之后再关闭
./nginx -s quit
# 查看当前nginx的最终配置
./nginx -T
# 检查配置文件是否正确
./nginx -t
# 查看nginx版本号
./nginx -v
# 查看nginx版本号同时,显示安装时配置的相关参数
./nginx -V
# 查看相关命令参数
./nginx -h
nginx配置
完成配置文件(释义)
# nginx的模块体系
# nginx core核心模块,包含(http、main、event module、phase filter[请求]、upstream、load balancer[负载均衡]、extend module[继承])
# worker进程运行的用户。默认是nobody
#user nobody;
# fork worker数量,一般配置和服务器的cpu核数一致
worker_processes auto;
# nginx 日志级别:debug、info、notice、warn、error、crit
# 在nginx安装的时候可以通过--error-log-path、--http-log-path来配置日志的存放路径
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
# 定义nginx进程号。可以在nginx安装的时候通过:--pid-path 配置路径
#pid logs/nginx.pid;
events {
# 操作模式。linux默认使用epoll模式,异步非阻塞
use epoll;
# 一个worker进程允许客户端最大连接数
worker_connections 1024;
}
http {
# 包含。即:导入一个外包的文件
include mime.types;
# 默认的type类型
default_type application/octet-stream;
# 日志格式化输出到指定文件
# $remote_addr(客户端IP地址)
# $remote_user(客户端用户名称)
# $time_local(时间)
# $request(请求的一些相关信息:请求内容、方法)
# $status(请求状态)
# $body_bytes_sent(相应客户端的body字节数)
# $http_refere(来源地址,即:地方跳转访问)
# $http_user_agent(用户代理:一般指浏览器)
# $http_x_forwarded_for(客户端的IP地址)
#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;
# 只有sendfile值为on才起作用、发送的文件累计到一定大小再进行发送;减少网络报文段的数量
#tcp_nopush on;
#tcp_nodelay on;
# 客户端连接服务器的超时时间,秒为单位。访问结束之后,连接存活的时间,如果在此期间还有访问直接使用此连接,不需要再次创建连接
# 值为0时,代表访问结束后就关闭连接
#keepalive_timeout 0;
keepalive_timeout 65;
# 经过压缩后传输。压缩后体积小、传输快、节约带宽,但是在压缩时需要耗费性能
#gzip on;
# 限制最小压缩,小于1字节文件不会压缩
g_zip_min_length 1;
# 定义压缩级别(压缩比,文件大,压缩越多,但是cpu使用会越多)
g_zip_comp_level 3;
# 定义压缩文件的类型
gzip_types text/plain application/javascript text/css;
# 负载均衡 默认轮询方式
# weight 负载均衡服务器的权重,权重值越大越容易命中
# max_conns 服务器最大连接数,默认值为0,则表示没有限制;可以做限流作用,避免服务器过载
# slow_start 设置权重值在指定的时间内由0慢慢增加到权重的指定值;随机轮询的负载、hash、单机的不支持;(开源版本不支持、只能在商业版本中使用)
# down 标识服务器状态为不可用
# backup 标记服务器为备用机,在负载均衡的服务器请求不到后端服务时,启用;例如:当192.168.1.11与192.168.1.5 对应后端的服务宕机,192.168.1.10 就会启用
# max_fails 最大失败数,默认值:1。fial_timeout 失败的指定时间段,默认值:10s。
# 在fial_timeout指定的时间段内,当失败数达到max_fails指定数,nginx就会认为指定的服务器已经宕机;
# 在fial_timeout的指定时间段内nginx就不会再分发到此服务器上,当过了这时间段,nginx会尝试继续分发到执行服务器, 如果还是失败,重复以上过程
upstream tomcats {
# 可以保证用户访问可以请求到上游服务中的固定服务器,前提是客户端用户IP没有发生更改
# 但是当某一个用户短时间内发起大量请求,易导致指定上游服务器宕机
# 当上游服务器宕机时,不能把执行上游服务器的nginx-server关闭,应该使用down标记,使用户不能继续访问指定的服务
# 当有一台被标记为down时,hash的node_counts总数就会变更,hash算法根据node_counts求值,这会导致大部分的用户连接到的上游服务都会变更
# 以上使用hash算法,当增加或者减少节点服务时,会导致大部分用户对应上游服务器变更使得session会话消失,所以可以使用一致性hash算法来减少此缺点。只能减少大部分用户的变更问题,还是有少数的用户受影响
ip_hash;
server 192.168.1.5 weight=1 max_conns=2 slow_start=60s down;
server 192.168.1.10 weight=2 max_conns=2 backup;
server 192.168.1.11 weight=5 max_conns=5 max_fails=2 fail_timeout=15s;
# 设置长连接数量。即:有指定数的连接不会呗释放,处于长连接状态,可以提高服务器的吞吐量
# 在指定的server块加上以下两项配置:长连接的版本号、清楚connection_header信息
# proxy_http_version 1.1;
# proxy_set_hdeader Connection "";
keepalived 32;
}
upstream tomcats1 {
# 使用url进行hash算法,$request_uri是内置的一个变量,获取的是url值
hash $request_uri;
}
upstream tomcats2 {
# 选择最少连接数的节点,进行负载
least_conn;
}
# proxy_cache_path 设置缓存保存的目录(/usr/nginx/upstream_cache)
# 设置共享内存共享以及占用的空间大小(keys_zone)
# nginxCache名称、5m开辟时初始大小、1g最大的空间值
# inactive 超过此时间,缓存则自动清理
# use_temp_path关闭临时目录
proxy_cache_path /usr/nginx/upstream_cache keys_zone=nginxCache:5m max_size=1g inactive=1h use_temp_path=off
server {
listen 88;
server_name tomcat;
location ^~ /tomcat {
proxy_pass http://tomcats;
proxy_http_version 1.1;
proxy_set_hdeader Connection "";
# 设置缓存的过期时间(控制对浏览器的缓存)
# 指定具体时间
# expires 10s;
# 以天为节点,到达指定时间时缓存会过期
# expires @22h33m;
# 缓存提前过期,即代表不需要缓存
# expires -1h;
# 不设置缓存。no-cache
# expires epoch;
# 默认的浏览器的缓存机制
# expires off;
# 缓存永不过期
expires max;
# 设置缓存的过期时间(控制对上游服务器的缓存)
# 开启并使用指定名称的缓存
proxy_cache nginxCache;
# 针对200和304状态码缓存时间为8小时
proxy_cache_valid 200 304 8h;
}
}
# 虚拟主机
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
# 允许跨域请求的域,*代表所有
add_header 'Access-Control-Allow-Origin' *;
# 允许带上cookie请求
add_header 'Access-Control-Allow-Credentials' 'true';
# 允许请求的方法,比如:GET/POST/PUT/DELETE
add_header 'Access-Control-Allow-Methods' *;
# 允许请求的header
add_header 'Access-Control-Allow-Headers' *;
# 对源站点验证
valid_referers *.huangjiliang.com;
# 非法引用会进入下方判断 增加了如下判断,以上的跨域请求也会相对的失效
if ($valid_referers) {
return 403;
}
location / {
root html;
index index.html index.htm;
deny 192.168.1.138; # 禁止访问的IP地址,可以为all
allow 192.168.1.140; # 允许访问的IP地址,可以为all
}
#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$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.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 {
# deny all;
#}
}
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;
# location / {
# root html;
# index index.html index.htm;
# }
#}
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;
# 开启ssl
# ssl on;
# 配置ssl证书 存放证书路径文件
# ssl_certificate 1_www.imoocdsp.com_bundle.crt;
# 配置证书秘钥 存放密钥文件
# ssl_certificate_key 2_www.imoocdsp.com.key;
# ssl会话cache
# ssl_session_cache shared:SSL:1m;
# ssl会话超时时间
# ssl_session_timeout 5m;
# 配置加密套件,写法遵循 openssl 标准
# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
# ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
# ssl_prefer_server_ciphers on;
# location / {
# root html;
# index index.html index.htm;
# }
#}
}
层级结构图
main
全局配置,对全局生效events
配置影响Nginx
服务器与用户的网络连接http
配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置server
配置虚拟主机的相关参数,一个http
块中可以有多个server
块location
用于配置匹配的uri
upstream
配置后端服务器具体地址,负载配置不可获取的部分
main段核心参数
user
执行运行
nginx
的worker
子进程的属主和属组,其中组可以不指定
user USERNAME [GROUP]
例:用户是nginx,组是lion
user nginx lion;
pid
指定运行
nginx master
主进程的pid文件存放路径
pid /home/nginx/logs/nginx.pid; # 指定master主进程的pid文件存放的路径
worker_rlimit_nofile_number
指定worker子进程的最大链接数
worker_rlimit_nofile 20480;
worker_rlimit_core
指定worker子进程异常终止后的core文件,用于记录分析问题
# 存放大小限制
worker_rlimit_core 50M;
# 存放的目录
working_directory /home/nginx/temp;
worker_processes_number
指定nginx启动的worker子进程数量
# 指定具体子进程数量
worker_processes_number 4;
# 与房前cpu物理核心数一致
worker_processes auto;
worker_cpu_affinity
将每个worker子进程与我们的cpu物理核心绑定
- 将每个worker子进程与特定cpu物理 核心绑定,由于在于避免同一个worker子进程在不同的cpu核心上切换,缓存失效,降低性能。但其并不能真正避免进程之间的切换
# 4个物理核心,4个worker子进程
worker_cpu_affinity 0001 0010 0100 1000;
worker_priority
指定worker子进程的nice值,以调整运行nginx的优先级,通常设定为负值,以优先调用nginx
# 120-10=110,110就是最终的优先级
worker_priority -10;
- linux默认进程的优先级值是120,值越小越优先;nice定范围为-20到+19
- 应用的默认优先值是120加上nice值等于它最终的值,这个值越小,优先级越高
worker_shutdown_timeout
指定worker子进程优雅退出时的超时时间
worker_shutdown_timeout 5s;
timer_resolution
worker 子进程内部使用的计时器精度,调整时间间隔越大,系统调用越少,有利于性能提升;反之,系统调用越多,性能下降
timer_resolution 100ms;
- 在linux系统中,用户需要获取计时器时需要向操作系统内核发送请求,有请求就必然会有开销,因此这个间隔越大开销越小
daemon
指定nginx的运行方式,前台还是后台,前台用于调试,后台用于生产
# 默认时on,后台运行模式
daemon off;
Events段核心参数
use
nginx使用何种事件驱动模型
# 不推荐配置此项,可以让nginx自己选择
use method;
# method的可选值:select、poll、kqueue、epoll、/dev/poll、eventport
worker_connections
worker子进程能够处理的最大并发连接数
# 每个子进程最大连接数为1024
worker_connections 1024;
accept_mutex
是否打开负载均衡互斥锁
# 默认是off关闭的,推荐打开
accept_mutex on;
server_name指令
server_name name1 name2 name3
# 示例
server_name www.huangjiliang.com
域名匹配的四种写法
- 精准匹配:
server_name www.huangjiliang.com;
- 左侧通配:
server_name *.huangjiliang.com;
- 右侧通配:
server_name www.huangjiliang.*;
- 正则匹配:
server_name ~^www\.huangjiliang\.*$;
匹配优先级:精准匹配 > 左侧通配符匹配 > 右侧通配符匹配 > 正则表达式匹配
root
指定静态资源目录位置,它可以写在http、server、location等配置中
root <path>
# 示例
location /image {
root /home/opt/static;
}
# 当用户访问 www.huangjiliang.com/image/1.png时,实际在服务器找的路径是 /home/nginx/static/image/1.png
- [注]:root会将定义路径与uri叠加,alias则只取定义路径
alias
指定静态资源目录,只能写在location中
location /image {
alias /home/nginx/static/image/
}
# 当用户访问www.huangjiliang.com/image/1.png时,实际在服务器找的路径是:/home/nginx/static/image/1.png
- [注]:使用alias末尾一定要添加
/
,并且它只能位于location中
location
配置路径
location [ = | ~ | ^~ ] uri {
...
}
匹配规则:
符号 | 说明 |
---|---|
~ | 正则匹配,区分大小写 |
~* | 正则匹配,不区分大小写 |
^~ | 普通字符匹配,如果该选项匹配,则即刻停止搜索,不在向下匹配其他选项 |
= | 普通字符匹配,精准匹配,找到即刻停止搜索 |
@ | 定义一个命名的location,用于内部订箱,例如error_page,try_files |
匹配优先级。路径匹配,优先级(跟location的书写顺序关系不大)。大致:
=
>^~
>~
>~*
精准匹配
=
前缀的指令严格匹配这个查询。如果找到,停止搜索普通字符匹配
所有剩下的常规字符串,最长的匹配。
如果这个匹配使用
^~
前缀,则停止搜索正则匹配
正则表达式,在配置文件中定义的顺序,匹配到一个结果,搜索停止
默认匹配
如果第3条规则产生匹配的话,结果被使用
否则,如同从第2条规则被使用
# 示例1 ##############
location = / {
# 精确匹配 / ,主机名后面不能带任何字符串
[ configuration A ]
}
location / {
# 因为所有的地址都以 / 开头,所以这条规则将匹配到所有请求
# 但是正则和最长字符串会优先匹配
[ configuration B ]
}
location /documents/ {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration C ]
}
location ~ /documents/Abc {
# 匹配任何以 /documents/ 开头的地址,匹配符合以后,还要继续往下搜索
# 只有后面的正则表达式没有匹配到时,这一条才会采用这一条
[ configuration CC ]
}
location ^~ /images/ {
# 匹配任何以 /images/ 开头的地址,匹配符合以后,停止往下搜索正则,采用这一条。
[ configuration D ]
}
location ~* \.(gif|jpg|jpeg)$ {
# 匹配所有以 gif,jpg或jpeg 结尾的请求
# 然而,所有请求 /images/ 下的图片会被 config D 处理,因为 ^~ 到达不了这一条正则
[ configuration E ]
}
location /images/ {
# 字符匹配到 /images/,继续往下,会发现 ^~ 存在
[ configuration F ]
}
location /images/abc {
# 最长字符匹配到 /images/abc,继续往下,会发现 ^~ 存在
# F与G的放置顺序是没有关系的
[ configuration G ]
}
location ~ /images/abc/ {
# 只有去掉 config D 才有效:先最长匹配 config G 开头的地址,继续往下搜索,匹配到这一条正则,采用
[ configuration H ]
}
location ~* /js/.*/\.js
示例1分析
/
-> config A:精确完全匹配,即使/index.html也匹配不了/downloads/download.html
-> config B:匹配B以后,往下没有任何匹配,采用B/images/1.gif
-> configuration D:匹配到F,往下匹配到D,停止往下/images/abc/def
-> config D:最长匹配到G,往下匹配D,停止往下你可以看到 任何以/images/开头的都会匹配到D并停止,FG写在这里是没有任何意义的,H是永远轮不到的,这里只是为了说明匹配顺序/documents/document.html
-> config C:匹配到C,往下没有任何匹配,采用C/documents/1.jpg
-> configuration E:匹配到C,往下正则匹配到E/documents/Abc.jpg
-> config CC:最长匹配到C,往下正则顺序匹配到CC,不会往下到E
# 示例2
server {
listen 80;
server_name wwww.huangjiliang.com;
# 精准匹配
# 只有访问www.huangjiliang.com/,atch_all/ 时才会匹配到/home/nginx/html/index.html
location = /match_all/ {
root /home/nginx/html;
index index.html;
}
# 正则匹配【区分大小写】
# 当访问www.huangjiliang.com/1.jpg 【uri以(.jpeg、.jpg、.png、.svg)结尾路径时】会去/home/nginx/images找相应的文件资源
location ~ \.(jpeg|jpg|png|svg)$ {
root /home/nginx/images;
}
# 匹配命中后,即停止搜索
# 当访问www.huangjiliang.com/bbs/时会匹配上/home/nginx/html/bolg.html
location ^~ /bbs/ {
root /home/nginx/html;
index blog.html;
}
}
location中的反斜线
# 情况1
location /html {
...
}
# 情况2
location /html/ {
...
}
情况1:不带
/
当访问www.huangjiliang.com/html
时,nginx先找是否有html目录,如果有则找html目录下的index.html;如果没有html目录,nginx则会找是否有html文件情况2:带
/
当访问www.huangjiliang/html
时,nginx先找是否有html目录,如果有则找html目录下的index.html,如果没有它也不会去找是否有test文件总结:当没有html目录时,不带
/
会去找html文件 ;带\
不会去找html文件
return
停止处理请求,直接返回响应码或重定向到其他URL;执行return指令后,location中后续指令将不会被执行
return code [text];
return code URL;
return URL;
# 示例
# 直接返回状态码
location / {
return 404;
}
# 返回状态码 + 一段文本
location / {
return 500 + "server error";
}
# 返回状态码 + 重定向地址
location / {
return 302 /bbs;
}
# 返回重定向地址
location / {
return htttp://www.huangjiliang.com;
}
rewrite
根据指定正则表达式匹配规则,重写URL
语法:rewrite 正则表达式 要替换的内容 [flag];
上下文:server、location、if
# $1是前面括号(.*\.jpg)的反向引用
示例:rewrite /images/(.*\.jpg)$ /pic/$1;
flag 可选值的含义
last
重写后的URL发起新的请求,再次进入server段,重试location中的匹配break
直接使用重写后的URL,不再匹配其他location中语句redirect
返回302临时重定向permanent
返回301永久重定向
server {
listen 80;
server_name elang.vip;
root html;
location /search {
# 重定向
rewrite ^/(.*) http://www.huangjiliang.com redirect;
}
location /images {
rewrite /images/(.*) /pics/$1
}
location /pics {
rewrite /pics/(.*) /photos/$1;
}
location /photos {
}
}
以上配置分析
- 当访问
elang.vip/search
时,会重定向到http://www.huangjiliang.com
- 当访问
elang.vip/images/1.png
时,第一步重写URL为elang.vip/pics/1.png
, 匹配到pics
的location
,继续重写URL为elang.vip/photos/1.png
,再次匹配到photos
的location
,去html/photos
目录下寻找1.png
资源
if指令
语法:
if (condition) {...}
上下文:server、location
示例:
if ($http_user_agent ~ Chrome) {
rewrite /(.*)/browser/$1 break;
}
condition
判断条件
$variable
仅为变量时,值为空或以0开头字符串都会被当作false处理=
或者!=
相等或不等~
正则匹配, 区分大小写! ~
非正则匹配~*
正则匹配,不区分大小写-f
或! -f
检测文件存在或不存在-d
或! -d
检测目录存在或不存在-e
或! -e
检测文件、目录、符号链接等存在或不存在-x
或! -x
检测文件可以执行或不可执行
server {
listen 8080;
server_name location;
root html;
location / {
# 当访问http://127.0.0.1:8080/images/时,会通过if判断,然后执行rewrite重写命令
if ($uri = '/images/') {
rewrite (.*) /pics/ break;
}
}
}
autoindex
用户请求以
/
结尾时,列出目录结构,可以用于快速搭建静态资源下载网站
autoindex
配置信息
server {
listen 80;
server_name elang.vip;
location /download/ {
root /home/source;
# 打开autoindex,可选参数on | off
autoindex on;
# 修改为off,以KB、MB、GB显示文件大小,默认为on,以bytes显示出文件的确切大小
autoindex_exact_size on;
# 以html的方式进行格式化,可选参数 html | json |xml
autoindex_format html;
# 显示的文件时间为文件的服务器时间,默认为off,显示的文件时间为GMT时间
autoindex_localtime off;
}
}
当访问
elang.vip/download/
时,会把服务器/home/source/download/
路径下的文件展示出来。
变量
nginx
提供给使用者的变量非常多,但是终究是一个完整的请求过程所产生的数据,nginx
将这些数据以变量的象时提供给使用者
变量名 | 含义 |
---|---|
remote_addr | 客户端IP地址 |
remote_port | 客户端端口 |
server_addr | 服务端IP地址 |
server_port | 服务端端口 |
server_protocol | 服务端协议 |
binary_remote_addr | 二进制格式的客户端IP地址 |
connection | TCP连接的序号,递增 |
connection_request | TCP连接当前的请求数量 |
uri | 请求的URL,不包含参数 |
request_uri | 请求的URL,包含参数 |
scheme | 写一名,http 或https |
request_method | 请求方法 |
request_length | 全部请求的长度,包含请求行、请求头、请求体 |
args | 全部参数字符串 |
arg_参数名 | 获取特定参数值 |
is_args | URL中是否有参数,有则返回? ,否则返回空 |
query_string | 与args相同 |
host | 请求信息中的host,如果请求中没有host行,则在请求头中找,最后使用nginx中设置的server_name |
http_user_agent | 用户浏览器 |
http_referer | 从哪些链接过来的请求 |
http_via | 每经过一层代理服务器,都会添加相应的信息 |
http_cookie | 获取用户cookie |
request_time | 处理请求已消耗的时间 |
https | 是否开启了https,是则返回on ,否则返回空 |
request_filename | 磁盘文件系统待访问文件的访问路径 |
document_root | 由uri和root/alias规则生成的文件夹路径 |
limit_rate | 返回相应时的速度上限值 |
server {
listen 8081;
server_name localhost;
root html;
index index.html index.htm;
location / {
return 200 "
remote_addr: $remote_addr
remote_port: $remote_port
server_addr: $server_addr
server_port: $server_port
server_protocol: $server_protocol
binary_remote_addr: $binary_remote_addr
connection: $connection
uri: $uri
request_uri: $request_uri
scheme: $scheme
request_method: $request_method
request_length: $request_length
args: $args
arg_pid: $arg_pid
is_args: $is_args
query_string: $query_string
host: $host
http_user_agent: $http_user_agent
http_referer: $http_referer
http_via: $http_via
request_time: $request_time
https: $https
request_filename: $request_filename
document_root: $document_root
";
}
}
Nginx应用核心概念
代理是在服务器和客户端之间架设的一层服务器,代理将接收客户端的请求并将它转发给服务器,然后将服务器端的相应转发给客户端
- 正向代理与反向代理都是以上的理论实现的
正向代理
正向代理是一个位于客户端和原始服务器(origin server)之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端
- 正向代理是为客户端服务的,客户端可以根据正向代理访问到它本身无法访问到的服务器资源
- 正向代理对客户端透明,对服务端是非透明,即服务端并不知道自己收到的是来自代理的访问还是真实客户端的访问
反向代理
反向代理方式是指以代理服务器来接收internet上的链接请求,然后将请求转发给内部网络上的服务器,并将从服务器上获取指定的资源返回给internet上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器
- 反向代理是为服务端服务的,反向代理可以帮助服务器接收来自客户端的请求,帮助服务器做请求转发,负载均衡等
- 反向代理对服务端是透明的,对客户端是非透明,即客户端并不知道自己访问的是代理服务器,而服务器知道反向代理在为它服务
反向代理优势
- 隐藏真实服务器
- 负载均衡便于横向扩展后端动态服务
- 动静分离,提升系统健壮性
动静分离
动静分离是指web服务器架构中,将静态页面与动态页面或者静态内容接口和动态内容接口分开不同系统之间访问的架构设计方法,进而提升整个服务的访问性和可维护性
- 一般来说,都需要将动态资源和静态资源分开,由于nginx的高并发和静态资源缓存等特性,经常将讲台资源部署在nginx上。如果请求的是静态资源,直接带静态资源目录获取资源,如果是动态资源的请求,则利用反向代理的原理,把请求转发给对应后台应用程序去处理,从而实现动静分离效果。
负载均衡
- 一般情况下,客户端发送多个请求到服务器,服务器处理请求,其中一部分可能要操作一些资源,比如数据库、静态资源等,服务器处理完毕后,再将结果返回给客户端
- 这种模式对于早期的系统来说,功能要求不复杂,且并发请求相对较少的情况下还能胜任,成本也低。随着信息数量不断增长,访问量和数据量飞速增长,以及系统业务复杂度持续增加,这种做法已无法满足要求,并发量特别大,服务器容易崩
- 很明显,这是由于服务器性能的瓶颈造成的问题,处理堆机器之外,最重要的做法就是负载均衡
- 请求爆发式增长的情况下,单个机器性能再强劲也无法满足要求了,这个时候集群的概念产生了,单个服务器解决不了的问题,可以使用多个服务器,然后将请求分发到各个服务器上,将负载分发到不同的服务器,这就是负载均衡。负载均衡的核心思想【分摊压力】。nginx实现负载均衡,一般来说指的是将请求转发给服务器集群
nginx实现负载均衡的策略
- 轮询策略:默认情况下采用的策略,将所有客户端请求轮询分配给服务端。这种策略是可以正常工作的,但是如果其中某一台服务器压力太大,出现延迟,会影响所有分配再这台服务器下的用户
- 最小连接数策略:将请求优先分配给压力较小的服务器,它可以平衡每个队列的长度,并避免向压力大的服务器添加更多的请求
- 最快响应时间策略:优先分配给响应时间最短的服务器
- 客户端IP绑定策略,来自同一个IP的请求永远只分配一台服务器,有效解决了动态网页存在的session共享问题
负载均衡示例。【需明白一下upstream、proxy_pass知识点】
upstream blog_server {
# 定义共享内存,并设置共享内存空间的名字和大小
zone test 10M;
# 使用最少连接数负载均衡算法
least_conn;
# 定义3台后端应用程序进行轮询
server 192.168.1.2:8081;
server 192.168.1.2:8082;
server 192.168.1.2:8083;
}
server {
listen 80;
server_name elang.vip;
location /blog/ {
proxy_pass http://blog_server;
}
}
upstream
用于定义上游服务器(指的是后台提供的应用服务器)相关信息
# 语法:
upstream name {
...
}
# 上下文:
http
# 示例
upstream blog_server {
server 192.168.1.138:8080
}
再
upstream
内可使用的指令
server
定义上游服务器地址zone
定义共享内存,用于跨worker
子进程keepalive
对上游服务器启用长连接keepalive_requests
一个长连接最多请求http
的个数keepalive_time
空闲情形下,一个长连接的超时时长hash
哈希负载均衡算法ip_hash
依据IP进行哈希计算的负载均衡算法least_conn
最少连接数负载均衡算法least_time
最短响应时间负载均衡算法random
随机负载均衡算法
server
upstream下的server配置,定于上游服务器地址
# 语法:
server address [parameters]
# 上下文:upstream
parameters 可选值
weight=number
权重值,默认为1max_conns=number
上游服务器的最大并发连接数fail_time=time
服务器不可用的判断时间max_fails=number
服务器不可用的检查次数backup
备份服务器标识,仅当其他服务器都不可用时,才会启用此服务器down
标记服务器长期不可用标识,离线维护
keepalive
upstream
下的keepalive
配置,限制每个worker子进程与上游服务器空闲长连接的最大数量
# 语法
keepalive connections;
# 上下文:upstream
# 示例
keepalive 16;
keepalive_requests
upstream
下的keepalive_requests
配置,单个长连接可以处理的最大http
请求个数
# 语法:
keepalive_requests number;
# 默认值:
keepalive_requests 100;
# 上下文:
upstream
keepalive_timeout
upstream
下的keepalive_timeout
配置,空闲长连接最大的保持时间
# 语法:
keepalive_timeout time;
# 默认值:
keepalive_timeout 100s;
# 上下文:
upstream
proxy_pass
server -> location
下的proxy_pass
配置,用于配置代理服务器
# 语法
proxy_pass URL;
# 上下文:
location、if、limit_except
# 示例1
server {
...
location / {
proxy_pass http://127.0.0.1:8081
}
}
# 示例2
server {
...
location /proxy/ {
proxy_pass http://127.0.0.1:8081/proxy
}
}
# 示例3
server {
...
location /proxy/ {
proxy_pass http://127.0.0.1:8081/proxy/
}
}
URL参数原则
- URL必须以
http
或https
开头 - URL中可以携带变量
- URL中是否带URI,会直接影响发往上游请求的URL
示例2和示例3区别分析:proxy_pass末尾是否有
/
- 示例2不带
/
意味着nginx不会修改用户URL,而是直接传给上游的应用服务器 - 示例3带
/
意味着会修改用户URL,修改方法是将location
后的URL从用户URL中删除
示例2。不带
/
- 当用户访问:
/proxy/blog/index.html
- 请求达到nginx的URL:
/proxy/blog/index.html
- 到达上游应用服务器的URL:
/proxy/blog/index.html
示例3。带
/
- 当用户访问:
/proxy/blog/index.html
- 请求达到nginx的URL:
/proxy/blog/index.html
- 到达上游应用服务器的URL:
/blog/index.html
缓存配置
缓存可以非常有效的提升性能,因此不论是客户端(浏览器),还是代理服务器(nginx),乃至上游应用服务都多少会涉及缓存。可见缓存在每个环节都是非常重要
proxy_cache
存储一些之前被访问过、而且可能将要被再次访问的资源,使用户可以直接从代理服务器获得,从而减少上游应用服务器的压力,加快整个访问速度
语法:proxy_cache zone | off; # zone是共享内存的名称
默认值:proxy_cache off;
上下文:http、server、location
proxy_cache_path
设置缓存文件的存放路径
语法:proxy_cache_path path [level=levels]
默认值:proxy_chache_path off;
上下文:http
参数含义
path
缓存文件的存放路径level
path的目录层级keys_zone
设置共享内存inactive
在指定时间内没有被访问,缓存会被清理,默认10分钟
proxy_cache_key
设置缓存文件的key
语法:proxy_cache_key
默认值:proxy_cache_key $scheme$proxy_host$request_uri;
上下文:http、server、location
proxy_cache_valid
配置什么状态码可以被缓存,以及缓存时长
语法:proxy_cache_valid [code ...] time;
上下文:http、server、location
配置示例:proxy_cache_valid 200 304 2m; # 对于状态为200、304的缓存文件的缓存时间为2分钟
proxy_no_cache
定义响应保存到缓存的条件,如果字符串参数的至少一个值不为空且不等于0,则将不保存该相应到缓存
语法:proxy_no_cache string
上下文:http、server、location
示例:proxy_no_cache $http_pragma $http_authorization;
proxy_cache_bypass
定义条件,在该条件下将不会从缓存中获取响应
语法:proxy_cache_bypass string
上下文:http、server、location
示例:proxy_cache_bypass $http_pragma $http_authorization;
upstream_cache_status 变量
存储了缓存是否命中得信息,会设置在响应头信息中,在调试中非常有用
MISS:未命中缓存
HIT:命中缓存
EXPIRED:缓存过期
STALE:命中了陈旧缓存
REVALIDDATED:nginx验证陈旧缓存依然有效
UPDATING:内容陈旧,但正在更新
BYPASS:响应从原始服务器获取
缓存示例
不设置缓存内容
server {
listen 80;
server_name www.huangjiliang.com;
# URI 中后缀为 .txt 或 .text 的设置变量值为 "no cache"
if ($request_uri ~ \.(txt|text)$) {
set $cache_name "no cache"
}
location / {
proxy_no_cache $cache_name; # 判断该变量是否有值,如果有值则不进行缓存,如果没有值则进行缓存
proxy_cache cache_zone; # 设置缓存内存
proxy_cache_valid 200 5m; # 缓存状态为200的请求,缓存时长为5分钟
proxy_cache_key $request_uri; # 缓存文件的key为请求的URI
add_header Nginx-Cache-Status $upstream_cache_status # 把缓存状态设置为头部信息,响应给客户端
proxy_pass http://cache_server; # 代理转发
}
}
https
https工作流程
基本运作原理:使用公钥、私钥之间的加密与解密配合使用,保证传输内容的安全性
- 客户端(浏览器)访问
https://www.baidu.com
网站 - 百度服务器返回https使用的CA证书
- 浏览器验证CA证书是否为合法证书
- 验证通过,证书合法,生成一串随机数并使用公钥(证书提供)进行加密
- 发送公钥加密后的随机数给百度服务器
- 百度服务器拿到密文,通过私钥进行解密,获取到随机数(公钥加密、私钥解密)
- 百度服务器把要发送给浏览器的内容,使用随机数进行加密后传输给浏览器
- 此时浏览器可以使用随机数进行解密,获取到服务器的真实传输内容
配置证书
下载证书的压缩文件,里面有个nginx文件夹,把xxx.crt 和xxx.key文件拷贝到服务器指定目录下,再进行如下配置
server {
listen 443 ssl;
server_name test.huangjiliang.com;
ssl_certificate test.huangjiliang.com_nginx/test.huangjiliang.com_bundle.crt;
ssl_certificate_key test.huangjiliang.com_nginx/test.huangjiliang.com.key;
ssl_session_timeout 5m;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
location / {
proxy_pass http://127.0.0.1:4037;
}
}
跨域配置
跨域定义
同源策略限制了从同一个源加载的文档或脚本如何与来自另一个源的资源进行交互。这是一个用于隔离潜在恶意文件的重要安全机制。通常不允许不同源间的读操作
同源定义
协议、域名、端口都相同,则为同源
不同源会有如下限制:
- web数据层面,同源策略限制了不同源的站点读取当前站点的
Cookie IndexDB LocalStorage
等数据 - DOM层面,同源策略限制了来自不同源的JavaScript脚本对当前DOM对象读和写的操作
- 网络层面,同源策略限制了通过XMLHttpRequest等方式将站点的数据发送给不同源的站点
Nginx解决跨域的原理
例如:
前端server的域名:www.huangjiliang.com
后端服务的域名:www.huangjiliang.com:8081
- 因为前后端是不同源的,前端访问后端会出现跨域问题
- 解决方式,使用nginx代理,将server_name 设置为
www.huangjiliang.com
,设置对应的location以拦截前端需要跨域的请求,最后将请求代理回www.huangjiliang.com:8081
server {
listen 80;
server_name www.huangjiliang.com;
location / {
proxy_pass www.huangjiliang.com:8081;
}
}
开启gzip压缩配置
gzip
是规定的三种标准http
压缩格式之一,目前绝大多数网站都在使用gzip
传输html、css、javascript
等资源文件- 对于文本文件,gzip的效果非常明显,开启后传输所需要流量大约会降至
1/4~1/3
- 并不是每个浏览器都支持gzip的,如果知道客户端是否支持gzip呢?请求头中的Accept-Encoding来表示对压缩的支持
- 启用zip同时需要客户端和服务器的支持,如果客户端支持gzip的解析,那么只要服务端能够返回gzip的文件就可以启用gzip了,我们可以通过nginx的配置来让服务端支持gzip
在
/home/nginx/conf.d/
文件夹中新建配置文件gzip.conf
# # 默认off,是否开启gzip
gzip on;
# 要采用 gzip 压缩的 MIME 文件类型,其中 text/html 被系统强制启用;
gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;
# ---- 以上两个参数开启就可以支持Gzip压缩了 ---- #
# 默认 off,该模块启用后,Nginx 首先检查是否存在请求静态文件的 gz 结尾的文件,如果有则直接返回该 .gz 文件内容;
gzip_static on;
# 默认 off,nginx做为反向代理时启用,用于设置启用或禁用从代理服务器上收到相应内容 gzip 压缩;
gzip_proxied any;
# 用于在响应消息头中添加 Vary:Accept-Encoding,使代理服务器根据请求头中的 Accept-Encoding 识别是否启用 gzip 压缩;
gzip_vary on;
# gzip 压缩比,压缩级别是 1-9,1 压缩级别最低,9 最高,级别越高压缩率越大,压缩时间越长,建议 4-6;
gzip_comp_level 6;
# 获取多少内存用于缓存压缩结果,16 8k 表示以 8k*16 为单位获得;
gzip_buffers 16 8k;
# 允许压缩的页面最小字节数,页面字节数从header头中的 Content-Length 中进行获取。默认值是 0,不管页面多大都压缩。建议设置成大于 1k 的字节数,小于 1k 可能会越压越大;
# gzip_min_length 1k;
# 默认 1.1,启用 gzip 所需的 HTTP 最低版本;
gzip_http_version 1.1;
Nginx进程模型
多进程中的
Nginx
进程架构如下图所示,会有一个父进程(Master
),它会有很多子进程(worker
)
Master
用来管理子进程的,其本身并不真正处理用户请求。- 某个子进程
down
掉的话,它会向Master
进程发送一条消息,表明自己不可用了,此时Master
进程会去新起一个子进程 - 某个配置文件被修改了
Master
进程会去通知work
进程获取新的配置信息,这也就是我们所说的热部署 - 子进程间是通过共享内存的方式进行通信的。
配置文件重载原理
reload
重载配置文件的流程
- 向
master
进程发送HUP
信号(reload
命令); master
进程检查配置语法是否正确;master
进程打开监听端口;master
进程使用新的配置文件启动新的worker
子进程;master
进程向老的worker
子进程发送QUIT
信号;- 老的
worker
进程关闭监听句柄,处理完当前连接后关闭进程; - 整个过程
Nginx
始终处于平稳运行中,实现了平滑升级,用户无感知;
上传文件大小限制配置
client_max_body_size
语法:client_max_body_size number;
示例1:
...
http {
client_max_body_size 10M; # nginx默认上传大小限制是1M
server {
....
}
}
示例2:
...
http {
...
server {
client_max_body_size 10M; # nginx默认上传大小限制是1M
}
}
上下文:http、server
设置Nginx服务开机启动(centos7.6)
- 创建脚本文件:
vim /lib/systemd/system/nginx.service
- 添加如下内容
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/var/run/nginx.pid
ExecStartPre=/usr/nginx/sbin/nginx -t
ExecStart=/usr/nginx/sbin/nginx
ExecReload=/usr/nginx/sbin/nginx -s reload
ExecStop=/usr/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
【注】:主要修改相关路径
- 加完这个之后,就可以使用service对nginx进行启动,重启等操作
# 开机配置
systemctl enable nginx # 开机自动启动
systemctl disable nginx # 关闭开机自动启动
# 启动nginx
systemctl start nginx
# 停止nginx
systemctl stop nginx
# 重启nginx
systemctl restart nginx
# 重新加载nginx
systemctl reload nginx
# 查看nginx运行状态
systemctl status nginx
- 查看开机启动项是否有
nginx.service
:systemctl list-unit-files |grep enable
异常处理
1、问题描述:修改配置文件后,执行systemctl stop nginx报错
异常错误提示:Stopping nginx (via systemctl): Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units.
解决方案:systemctl daemon-reload
2、问题描述:找不到PID文件
原因:找不到pid文件,因为没有相应的目录
解决方案:mkdir /var/run/nginx -p 或者 修改nginx.conf文件夹指定pid文件路径
超时设置(请求、等待响应)超时等
proxy_connect_timeout
:后端服务器连接的超时时间,发起握手等待响应超时时间proxy_read_tiimeout
:连接成功后,等待后端服务器响应时间,其实已经进入后端的排队之中等候处理(即后端服务器处理请求的时间)proxy_send_timeout
:后端服务器数据回传时间,就是在规定时间之内后端服务器必须传完所有的数据
【注】nginx使用proxy模块是,默认的读取超时时间都是60s
client_header_timeout
指定等待client发送一个请求头的超时时间(例如: GET /HTTP/1.1)。当在一个read中,没有收到请求头,才会算成超时。如果在超时时间内,client没有发送任何东西,nginx返回http 408状态码("Request timed out")
语法:client_header_timeout time;
默认值:client_header_time 60s;
上下文:http、server、location
keepalive_timeout
语法:keepalive_timeout timeout [header_timeout];
默认值:keepalive_timeout 75s;
上下文:http、server、location
第一个参数指定了与client的keep-alive连接超时时间。服务器将会在这个时间后关闭连接
可选的第二个参数指定了在响应头keep-alive: timeout=time中time的值。这个头能够让一些浏览器主动关闭连接,这样服务器就不必要去关闭连接了。没有这个参数,nginx不会发送Keep-Alive响应头(尽管并不是由这个头来决定连接是否'keep-alive')
lingering_timeout
语法:lingering_timeout time;
默认值:lingering_timeout 5s;
上下文:http、server、location
lingering_timeout生效后,在关闭连接前,会检测是否有用户发送的数据达到服务器,如果超过lingering_timeout时间后还没有数据可读,就直接关闭连接;否则,必须在读取完连接缓存区上的数据并丢弃掉后才会关闭连接
resolver_timeout
语法:resolver_timeout time;
默认值:resolver_timeout 30s;
上下文:http、server、location
指令设置DNS解析超时时间
proxy_connect_timeout
语法:proxy_connect_timeout time;
默认值:proxy_connect_timeout 60s;
上下文:http、server、location
指令设置与upstream server的连接超时时间,有必要记住,这个超时不能超过75S
这个不是等待后端返回页面的时间,那是由proxy_read_timeout生命的。如果你的upstream服务器起来了,但是hanging住了(例如没有足够的线程处理请求,所以把你的请求放到池里稍后处理),那么这个声明是没有用的,由于与upstream服务器的连接已经建立起来了
proxy_read_timeout
语法:proxy_read_timeout time;
默认值:resolver_timeout 60s;
上下文:http、server、location
指令设置于代理服务器的读超时时间。它决定了nginx会等待多长时间来获得请求的相应,这个时间不是获得整个response的时间,而是两次reading操作的时间
proxy_send_timeout
语法:proxy_send_timeout time;
默认值:proxy_send_timeout 60s;
上下文:http、server、location
指令设置设置了发送请求给upstream服务器超时时间,超时设置不是为了整个发送期间,而是在两次write操作期间。如果超时后,upstream没有收到新的数据,nginx会关闭连接
proxy_upstream_fail_timeout (fail_timeout)
语法:server address [fail_timeout=30s]
默认值:10s;
上下文:upstream
upstream模块下server指令的参数,设置了某一个upstream后端失败了指定次数(max_fails)后,该后端不可操作的时间
Nginx卸载
- 停掉nginx服务进程:
ps -ef | grep nginx -> kill -9 xxxx
- xxxx 是上个指令查出nginx的进程
- 查找nginx相关文件删除:
find / -name nginx* -> rm -rf /xxx/path
- /xxx/path 是上个指令查询nginx相关文件|文件夹
- 使用yum清理:
yum remove nginx
- 如果设置了开机启动,则需要删除相关文件:
rm -rf /lib/systemd/system/nginx.service
代理重使用斜杠的区别
代理地址不加斜杠
1、location末尾加斜杠
location /api/ {
proxy_pass http://127.0.0.1:8848;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
2、location末尾不加斜杠
location /api {
proxy_pass http://127.0.0.1:8848;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
当代理地址不加斜杠,而location定位的路径设置中,末尾是否带有斜杠都不会影响代理地址
代理地址加斜杠
1、location末尾加斜杠
location /api/ {
proxy_pass http://127.0.0.1:8848/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/nacos/v1/ns/instance
2、location末尾不加斜杠
location /api {
proxy_pass http://127.0.0.1:8848/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848//nacos/v1/ns/instance
如果代理地址加了斜杠,不管location是否加斜杠,api路径都省略了
代理地址带有后缀
1、location末尾加斜杠
location /api/ {
proxy_pass http://127.0.0.1:8848/nacos;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/nacosnacos/v1/ns/instance
2、location末尾不加斜杠
location /api {
proxy_pass http://127.0.0.1:8848/nacos;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/nacos/nacos/v1/ns/instance
如果location带斜杠,会省略url中的斜杠。
代理地址带有后缀及斜杠
1、location末尾加斜杠
location /api/ {
proxy_pass http://127.0.0.1:8848/nacos/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/nacos/nacos/v1/ns/instance
2、location末尾不加斜杠
location /api {
proxy_pass http://127.0.0.1:8848/nacos/;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
}
请求地址:http://127.0.0.1:8848/api/nacos/v1/ns/instance
代理地址:http://127.0.0.1:8848/nacos//nacos/v1/ns/instance
如果location带斜杠,会省略url中的斜杠。
学习补充
- 重写url,去掉接口多余字符
location /api {
rewrite ^/api/(.*)$ /$1 break;
proxy_pass http://192.168.26.130:9981;
}
// 将接口路径前的/api去除
- 静态代理路径问题
# 访问路径在:/data/index.html
location / {
root /data;
index index.html index.htm;
}
# 访问路径在:/data/aa/bb/index.html
location /aa/bb {
root /data;
index index.html index.htm;
}
- Vue使用history模式,nginx一个端口对应多个项目
1、路由文件配置
export default new Router({
// mode: 'hash',
mode: 'history',
base: '/szxc/',
scrollBehavior: () => ({ y: 0 }),
routes: constantRouterMap
});
==》主要:
mode: 'history',
base:base: '/szxc/',
2、vue.config.js配置
publicPath: '/szxc/',
3、nginx配置
# 访问=》 [域名+/szxc]
location /szxc {
# 静态文件目录
alias /data/szxc/web/szxc/;
try_files $uri $uri/ /szxc/index.html;
index index.html index.htm;
}
- http强制跳转到https
server {
listen 80;
server_name demo.com;
rewrite ^(.*)$ https://$server_name$1 permanent;
}
- 返回逻辑
#直接返回状态码
location / {
return 404;
}
#返回状态码 + 一段文本
location / {
return 404 "pages not found";
}
#返回状态码 + 重定向地址
location / {
return 302 /blog ;
}
#返回重定向地址
location / {
return https://www.test.com ;
}
参考学习文章
3、