Nginx(1.20.0)(操作系统CentOS-8.4.2105-x86_64)
用途
- 正向代理:客户端通过局域网LAN内的代理服务器访问广域网WAN的服务。对服务端屏蔽客户端。
- 反向代理:客户端访问指定服务,服务通过代理服务器转发给局域网LAN内的目标服务器。对客户端屏蔽服务端。
- 动静分离:动态资源和静态资源分开服务。
- 负载均衡:同一请求按规则转发到不同服务的某一个。
安装
快速安装
- 安装:
yum install nginx - 设置开机启动Nginx服务:
systemctl enable nginx - 启动Nginx服务:
systemctl start nginx - 要验证服务是否正在运行,检查其状态:
systemctl status nginx
自定义安装
- 安装依赖
- 快速安装
- gcc__
- 用途:编译源码
- 安装:
yum -y install gcc-c++ - pcre、pcre-devel
- 用途:PCRE(Perl Compatible Regular Expressions) 是一个Perl库,包括perl兼容的正则表达式库。nginx的http模块使用pcre来解析正则表达式,所以需要在linux上安装pcre库,pcre-devel是使用pcre开发的一个二次开发库。nginx也需要此库。
- 安装:
yum install -y pcre pcre-devel - zlib
- 用途:zlib库提供了很多种压缩和解压缩的方式,nginx使用zlib对http包的内容进行gzip。
- 安装:
yum install -y zlib zlib-devel - openssl、openssl-devel
- 用途:OpenSSL是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及SSL协议,并提供丰富的应用程序供测试或其它目的使用。nginx不仅支持http协议,还支持https(即在ssl协议上传输http)。
- 安装:yum install -y openssl openssl-devel
- 常规安装
- gcc
- 用途:编译源码
- 安装:
yum -y install gcc-c++ - pcre
- 用途:rewrite模块
- 网站:pcre英文官方网站
- 下载安装
- 安装目录:
cd /usr/src - 下载:
wget https://github.com/PhilipHazel/pcre2/releases/download/pcre2-10.39/pcre2-10.39.tar.bz2 - 解压:
tar -xjvf pcre2-10.39.tar.bz2 - 安装
cd pcre2-10.39 ./configure make & make install - openssl
- 用途:ssl模块
- 网站:openssl英文官方网站
- 下载安装
- 安装目录:
cd /usr/src - 下载:
wget https://www.openssl.org/source/openssl-3.0.0.tar.gz - 解压:
tar -zxvf openssl-3.0.0.tar.gz - 安装:
cd openssl-3.0.0 ./config make & make install - zlib
- 用途:gzip模块
- 网站:zlib英文官方网站
- 下载安装
- 安装目录:
cd /usr/src - 下载:
wget http://zlib.net/zlib-1.2.11.tar.gz - 解压:
tar -zxvf zlib-1.2.11.tar.gz - 安装
cd zlib-1.2.11 ./configure make & make install - 安装nginx
- 下载安装
- 安装目录:
cd /usr/src - 下载:
wget http://nginx.org/download/nginx-1.20.0.tar.gz - 解压:
tar -zxvf nginx-1.20.0.tar.gz - 安装
cd nginx-1.20.0 ./configure --prefix=/usr/local/nginx --with-openssl=/usr/src --with-pcre=/usr/src --with-zlib=/usr/src --with-http_stub_status_module --with-http_ssl_module --with-http_v2_module --with-http_sub_module --with-http_gzip_static_module make & make install - 启动
cd /usr/local/nginx/sbin ./nginx - 访问0.0.0.0:80
CLI
configure指令(nginx源文件构建指令)
- configure指令:打开源文件存放目录/usr/src/nginx-1.20.0/里面的configure执行指令
--help :输出帮助信息--prefix=path :设置nginx安装目录,默认值/usr/local/nginx --with-openssl=path :设置用于安装openssl库的源文件所在路径--with-pcre=path :设置用于安装pcre库的源文件所在路径--with-pcre :设置强制使用PCRE库--with-zlib=path :设置用于安装zlib库的源文件所在路径--with-http_stub_status_module :设置允许查看nginx状态的模块--with-http_ssl_module :设置支持https(即在ssl协议上传输http)的模块--with-http_v2_module :设置支持http/2的模块--with-http_sub_module :设置支持改动匹配的响应的字符串--with-http_gzip_static_module :设置支持gzip功能
nginx指令(nginx运行时指令)
- nginx指令:打开nginx安装目录/usr/local/nginx里面的sbin/nginx执行指令
- 无参数:启动nginx服务
-? | -h :打印帮助信息-c file :设置指定的配置文件,用于替换默认的配置文件,默认配置文件路径为/usr/local/nginx/conf/nginx.conf -e file :设置指定存放的错误日志文件,用于替换默认的错误日志文件-g directives :设置配置文件的全局指令,例如nginx -g "pid /var/run/nginx.pid; worker_processes 'sysctl -n hw.ncpu';" -p prefix :设置nginx指令的存放目录,用于替换默认的nginx指令存放目录/usr/local/nginx -q :设置执行nginx配置文件的执行过程中禁止打印错误信息-s signal :发送一个信号到主进程
stop :关闭nginx服务,(强硬)此方式相当于先查出nginx进程id再使用kill命令强制杀掉进程。quit :关闭nginx服务,(温和)此方式停止步骤是待nginx进程处理任务完毕进行停止。注意:启动nginx服务就是直接执行nginx指令无参数。reload :重启nginx(不推荐此方法,推荐先停止在启动),一般用于重新加载配置文件reopen :重新打开日志文件 -t :测试配置文件是否语法错误-T :测试配置文件是否语法错误,并打印配置文件内容-v :打印nginx版本-V :打印nginx版本,编译器版本,和配置参数
配置文件
- 配置文件:配置文件默认路径为
/usr/local/nginx/conf/nginx.conf
内嵌变量
$remote_addr :客户端IP地址$remote_user :客户端用户名称$time_local :当前请求在Nginx服务器当前机器的访问时间和时区$request :请求的URI和HTTP协议$status :响应状态码$body_bytes_sent :发送给客户端响应文件内容大小,不包括响应请求头$http_referer :url跳转来源$http_user_agent :用户终端浏览器等信息
配置项
核心模块(全局模块)
daemon on | off
- 用途:设置nginx服务是否作为一个守护进程,主要用于测试环境的调试。
- 缺省值:
daemon on; - 上下文:main。
- 注意:不要将
daemon 和master_process 指令用于生产环境,这些配置主要用于测试环境的调试。
daemon off;
master_process on | off
- 用途:设置nginx服务是否启动worker进程,这个指令主要适用于nginx开发者。
- 缺省值:
master_process on; - 上下文:main。
- 注意:不要将
daemon 和master_process 指令用于生产环境,这些配置主要用于测试环境。
master_process off;
# /usr/src/nginx/conf/nginx.conf
include mime.types;
include vhosts/*.conf;
# /usr/src/nginx/conf/mime.types
types {
text/html html htm shtml;
text/css css;
text/xml xml;
image/gif gif;
image/jpeg jpeg jpg;
application/javascript js;
application/atom+xml atom;
application/rss+xml rss;
text/mathml mml;
text/plain txt;
text/vnd.sun.j2me.app-descriptor jad;
text/vnd.wap.wml wml;
text/x-component htc;
image/png png;
image/svg+xml svg svgz;
image/tiff tif tiff;
image/vnd.wap.wbmp wbmp;
image/webp webp;
image/x-icon ico;
image/x-jng jng;
image/x-ms-bmp bmp;
application/font-woff woff;
application/java-archive jar war ear;
application/json json;
application/mac-binhex40 hqx;
application/msword doc;
application/pdf pdf;
application/postscript ps eps ai;
application/rtf rtf;
application/vnd.apple.mpegurl m3u8;
application/vnd.google-earth.kml+xml kml;
application/vnd.google-earth.kmz kmz;
application/vnd.ms-excel xls;
application/vnd.ms-fontobject eot;
application/vnd.ms-powerpoint ppt;
application/vnd.oasis.opendocument.graphics odg;
application/vnd.oasis.opendocument.presentation odp;
application/vnd.oasis.opendocument.spreadsheet ods;
application/vnd.oasis.opendocument.text odt;
application/vnd.openxmlformats-officedocument.presentationml.presentation
pptx;
application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
xlsx;
application/vnd.openxmlformats-officedocument.wordprocessingml.document
docx;
application/vnd.wap.wmlc wmlc;
application/x-7z-compressed 7z;
application/x-cocoa cco;
application/x-java-archive-diff jardiff;
application/x-java-jnlp-file jnlp;
application/x-makeself run;
application/x-perl pl pm;
application/x-pilot prc pdb;
application/x-rar-compressed rar;
application/x-redhat-package-manager rpm;
application/x-sea sea;
application/x-shockwave-flash swf;
application/x-stuffit sit;
application/x-tcl tcl tk;
application/x-x509-ca-cert der pem crt;
application/x-xpinstall xpi;
application/xhtml+xml xhtml;
application/xspf+xml xspf;
application/zip zip;
application/octet-stream bin exe dll;
application/octet-stream deb;
application/octet-stream dmg;
application/octet-stream iso img;
application/octet-stream msi msp msm;
audio/midi mid midi kar;
audio/mpeg mp3;
audio/ogg ogg;
audio/x-m4a m4a;
audio/x-realaudio ra;
video/3gpp 3gpp 3gp;
video/mp2t ts;
video/mp4 mp4;
video/mpeg mpeg mpg;
video/quicktime mov;
video/webm webm;
video/x-flv flv;
video/x-m4v m4v;
video/x-mng mng;
video/x-ms-asf asx asf;
video/x-ms-wmv wmv;
video/x-msvideo avi;
}
timer_resolution 100ms;
# 分别给每个worker进程绑定一个CPU.
worker_proceses 4;
worker_cpu_affinity 0001 0010 0100 1000;
# 将CPU0/CPU2绑定给第一个worker进程,将CPU1/CPU3绑定给第二个worker进程。
worker_proceses 2;
worker_cpu_affinity 0101 1010;
worker_priority number
- 用途:使用该选项可以给所有的worker进程分配优先值。
- 缺省值:
worker_priority 0; - 上下文:main。
- 参数
worker_priority -10;
-
worker_processes number | auto
- 用途:设置nginx服务使用的worker进程数量,一般设置为cpu的核数
- 缺省值:
worker_processes 1; - 上下文:main。
- 参数
- number:-20至20之间,或者auto,The auto parameter is supported starting from versions 1.3.8 and 1.2.5.
-
worker_rlimit_core size
- 用途:Changes the limit on the largest size of a core file (RLIMIT_CORE) for worker processes. Used to increase the limit without restarting the main process.
- 缺省值:无
- 上下文:main。
-
worker_rlimit_nofile number
- 用途:Changes the limit on the maximum number of open files (RLIMIT_NOFILE) for worker processes. Used to increase the limit without restarting the main process.
- 缺省值:无
- 上下文:main。
-
worker_shutdown_timeout time
- 用途:This directive appeared in version 1.11.11.Configures a timeout for a graceful shutdown of worker processes. When the time expires, nginx will try to close all the connections currently open to facilitate shutdown.
- 缺省值:无
- 上下文:main。
-
working_directory directory
- 用途:Defines the current working directory for a worker process. It is primarily used when writing a core-file, in which case a worker process should have write permission for the specified directory.
- 缺省值:无
- 上下文:main。
events模块
events {
debug_connection 127.0.0.1;
debug_connection localhost;
debug_connection 192.0.2.0/24;
debug_connection ::1;
debug_connection 2001:0db8::/32;
debug_connection unix:;
...
}
http模块
ngx_http_core_module
default_type mime-type
- 用途:设置相应的默认文件类型,如果客户端Web程序的请求报文没设置,服务端的Nginx服务也没对应文件的扩展名(即include mime.types的文件内不存在此响应的文件后缀匹配),就用Nginx里默认的 default_type定义的处理方式。
- 缺省值:
default_type text/plain; - 上下文:http, server, location
location = /proxy.pac {
default_type application/x-ns-proxy-autoconfig;
}
location = /wpad.dat {
rewrite . /proxy.pac;
default_type application/x-ns-proxy-autoconfig;
}
sendfile on | off
- 用途:设置是否允许使用sendfile()。
- 缺省值:
sendfile off; - 上下文:http, server, location, if in location
location /video/ {
sendfile on;
tcp_nopush on;
aio on;
}
ngx_http_log_module
-
log_format name [escape=default|json|none] string ...
- 用途:定义记录日志格式(可以定义多种日志格式,取不同名字name即可)
- 缺省值:
log_format combined '$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent"; - 上下文:http
- 参数
- name:定义的记录日志格式的名称,在access_log指令中引用
- escape:设置变量中的字符编码方式是json还是default,默认是default。
- default:默认值,转义
" , \ 以及字符编码值小于32或者大于126的字符为\xXX 格式,如果字符编码值不存在则日志会打印为- 。 - json:所有不匹配JSON字符的字符将会被转义,
" , \ 将被转义为\" , \\ ,字符编码值小于32将会被转义为如同\n , \r , \t , \b , \f 或者\u00XX 。 - none:不允许转义。
- string:要定义的日志格式内容。该参数可以有多个。参数中可以使用Nginx内嵌变量。
-
access_log path name [format [buffer=size] [gzip[=level]] [flush=time] [if=condition]] , access_log off
- 用途:记录nginx每一次http请求的访问状态,主要用于分析每一次访问的请求和客户端的交互行为。
- 缺省值:
access_log logs/access.log combined - 上下文:http, server, location, if in location, limit_except
- 参数
- path:access日志文件路径
- name:设置记录日志格式,可以用log_format设置的自定义记录日志格式
- format
- buffer:设置存放访问日志的缓冲区大小
- gzip:设置压缩级别
- flush:设置缓冲区的日志刷到磁盘的时间
- if:设置其他条件
- 注意:关闭access日志使用指令
access_log off
ngx_http_gzip_module
gzip on | off
- 用途:设置响应是否使用Gzip。
- 缺省值:
gzip off; - 上下文:http, server, location, if in location
ngx_http_index_module
index file ...
- 用途:设置HTTP服务器的默认首页。指令值为多个文件时,会按照从左到右的顺序依次查找,找到对应文件后将结束查找。
- 缺省值:
index index.html; - 上下文:http, server, location
location / {
index index.$geo.html index.html;
}
ngx_http_proxy_module
proxy_pass URL
- 用途:设置连接被代理服务器的协议、IP地址或套接字,也可以是域名或upstream定义的服务器组
- 缺省值:无
- 上下文:location, if in location, limit_except
location / {
proxy_pass $scheme://$http_host$request_uri; # 代理到远端服务器
}
ngx_http_fastcgi_module
# Nginx基于FastCGI实现负载均衡
upstream fscgi_server {
ip_hash; # session会话保持
server 192.168.2.145:9000; # PHP-FPM服务器IP
server 192.168.2.159:9000; # PHP-FPM服务器IP
}
fastcgi_cache_path /usr/local/nginx/nginx-cache1
levels=1:2
keys_zone=fscgi_hdd1:100m
max_size=10g
use_temp_path=off
inactive=60m; # 设置缓存存储路径1,缓存的共享内存名称和大小
# 100MB,无效缓存的判断时间为1小时
fastcgi_cache_path /usr/local/nginx/nginx-cache2
levels=1:2
keys_zone=fscgi_hdd2:100m
max_size=10g
use_temp_path=off
inactive=60m; # 设置缓存存储路径2,缓存的共享内存名称和大小
# 100MB,无效缓存的判断时间为1小时
split_clients $request_uri $fscgi_cache {
50% "fscgi_hdd1"; # 50%请求的缓存存储在第一个磁盘上
50% "fscgi_hdd2"; # 50%请求的缓存存储在第二个磁盘上
}
server {
listen 8080;
root /opt/nginx-web/phpweb;
index index.php;
include fscgi.conf; # 引入默认配置文件
location ~ \.(gif|jpg|png|htm|html|css|js|flv|ico|swf)(.*) { # 静态资源文件过期时间
# 为12小时
expires 12h;
}
set $no_cache 0;
if ($query_string != "") { # URI无参数的数据不进行缓存
set $no_cache 1;
}
location ~ \.php(.*)$ {
root /opt/nginx-web/phpweb;
fastcgi_cache $fscgi_cache; # 启用fastcgi_cache_path设置的$fscgi_cache
# 的共享内存区域做缓存
fastcgi_cache_key ${request_method}://$host$request_uri; # 设置缓存的关键字
fastcgi_cache_lock on; # 启用缓存锁
fastcgi_cache_lock_age 5s; # 启用缓存锁时,添加缓存请求的处理时间为5s
fastcgi_cache_lock_timeout 5s; # 等待缓存锁超时时间为5s
fastcgi_cache_methods GET HEAD; # 默认对GET及HEAD方法的请求进行缓存
fastcgi_cache_min_uses 1; # 响应数据被请求一次就将被缓存
fastcgi_no_cache $no_cache; # $no_cache时对当前请求不进行缓存
fastcgi_cache_bypass $no_cache; # $no_cache时对当前请求不进行缓存
fastcgi_cache_use_stale error timeout invalid_header
updating http_500 http_503
http_403 http_404 http_429; # 当出现指定的条件时,使用
# 已经过期的缓存响应数据
fastcgi_cache_background_update on; # 允许使用过期的响应数据时,启用后台子请求用于
# 更新过期缓存,并将过期的缓存响应数据返回给客户端
fastcgi_cache_revalidate on; # 当缓存过期时,向后端服务器发起包含If-
# Modified-Since和If-None-Match HTTP消息
# 头字段的服务端校验
fastcgi_cache_valid 200 301 302 10h; # 200 301 302状态码的响应缓存10小时
fastcgi_cache_valid any 1m; # 其他状态码的响应缓存1分钟
add_header X-Cache-Status $upstream_cache_status; # 查看缓存命中状态
fastcgi_pass fscgi_server;
fastcgi_index index.php;
fastcgi_split_path_info ^(.+\.php)(.*)$; # 获取$fastcgi_path_info变量值
fastcgi_param PATH_INFO $fastcgi_path_info; # 赋值给参数PATH_INFO
include fastcgi.conf; # 引入默认参数文件
}
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
}
ngx_http_upstream_module
upstream name { ... }
- 用途:该指令域内可设置服务器、负载均衡策略等负载均衡配置
- 缺省值:无
- 上下文:http
- 注意
- nginx负载均衡:由代理模块和上游(upstream)模块共同实现的,Nginx通过代理模块的反向代理功能将用户请求转发到上游服务器组,上游模块通过指定的负载均衡策略及相关的参数配置将用户请求转发到目标服务器上。上游模块可以与 Nginx的代理指令(
proxy_pass )、FastCGI协议指令(fastcgi_pass )、uWSGI协议指令(uwsgi_pass )、SCGI协议指令(scgi_pass )、memcached指令(memcached_pass )及gRPC协议指令(grpc_pass )实现多种协议后端服务器的负载均衡。
upstream backend {
server backend1.example.com weight=5; # 被代理服务器端口号为80,权重为5
server backend2.example.com:8080; # 被代理服务器端口号为8080,默认权重为1
server unix:/tmp/backend3;
server backup1.example.com:8080 backup; # 该被代理服务器为备份状态
server backup2.example.com:8080 backup; # 该被代理服务器为备份状态
}
server {
location / {
proxy_pass http://backend; # 将客户端请求反向代理到上游服务器组backend
}
}
server
-
server { ... }
- 用途:Nginx 用来定义服务 IP、绑定端口及服务相关的指令区域
- 缺省值:无
- 上下文:http
-
listen
- 用途:服务监听端口、绑定 IP、监听方式的配置
- 用法
listen address[:port] [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; listen port [default_server] [ssl] [http2 | spdy] [proxy_protocol] [setfib=number] [fastopen=number] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [ipv6only=on|off] [reuseport] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; listen unix:path [default_server] [ssl] [http2 | spdy] [proxy_protocol] [backlog=number] [rcvbuf=size] [sndbuf=size] [accept_filter=filter] [deferred] [bind] [so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt]]; - 缺省值:
listen *:80 | *:8000; ,超级管理员默认端口号为80,其他用户默认端口号为8000 - 上下文:server
- 参数
address :如果只设置IP地址没设置port,则超级管理员默认端口号为80,其他用户默认端口号为8000default_server :当http指令域中包含多个虚拟主机时(即多个server块),该参数用于指定哪个虚拟主机是默认服务,如果没设置该配置项则将第一个顺序的server设为默认服务。默认服务可以用来处理没有server_name匹配成功的请求ssl :SSL支持http2 :HTTP/2 协议支持spdy :SDPY 协议支持,与 HTTP/2 协议不能同时存在proxy_protocol :在指定监听端口上启用proxy_protocol协议支持setfib=number :为监听套接字设置关联路由表,仅在 FreeBSD 系统上有效fastopen=number :HTTP处于保持连接(keepalive)状态时,允许不经过三次握手的TCP连接的队列的最大数backlog=number :当阻塞时,设置挂起连接队列的最大长度,在FreeBSD,DragonFly BSD和MacOS操作系统上,默认值为-1,其他平台上默认值为511rcvbuf=size :socket 接收缓冲的大小,默认为 8k 字节,在接收数据比较大的场景中可以适当调整sndbuf=size :socket 发送缓冲的大小,默认为 8k 字节,在发送数据较大的场景中可以适当调整accept_filter=filter :默认值filter,为监听套接字设置过滤器,仅支持 FreeBSD 和 NetBSD 5.0+ 系统deferred :添加该参数后,在TCP三次握手的过程中,检测到客户端有数据时才将TCP状态置为ESTABLISHED状态,没有数据则直接丢弃bind :指定IP及端口ipv6only=on|off :只接收IPv6连接或接收IPv6和IPv4连接reuseport :默认情况下,所有的工作进程会共享一个socket去监听同一IP和端口的组合。该参数启用后,允许每个工作进程有独立的socket去监听同一IP和端口的组合,内核会对传人的连接进行负载均衡。适用于Linux 3.9+,DragonFly BSD和FreeBSD 12+so_keepalive=on|off|[keepidle]:[keepintvl]:[keepcnt] :默认值off,配置是否在监听的端口启用“TCP keepalive”机制。当设置为 on 时,默认等同于so_keepalive=30m::10 ,表示30分钟无数据传输时发送探测包,发送10 次,发送间隔使用系统内核参数tcp_keepalive_intvl 的设定值
http {
server {
listen 127.0.0.1:8000; # 监听127.0.0.1的8000端口
listen 127.0.0.1; # 监听127.0.0.1的默认80端口(root权限)
listen 8000; # 监听本机所有IP的8000端口
listen *:8000; # 监听本机所有IP的8000端口
listen localhost:8000; # 监听locahost的8000端口
listen [::]:8000; # 监听IPv6的8000端口
listen [::1]; # 监听IPv6的回环IP的默认80端口(root权限)
listen unix:/var/run/nginx.sock; # 监听域套接字文件
listen *:8000 \ # 监听本机的8000端口
default_server \ # 当前服务是http指令域的主服务
fastopen=30 \ # 开启fastopen功能并限定最大队列数为30
deferred \ # 拒绝空数据连接
reuseport \ # 工作进程共享socket这个监听端口
backlog=1024 \ # 请求阻塞时挂起队列数是1024个
so_keepalive=on; # 当socket为保持连接时,开启状态检测功能
}
}
# IPv6 addresses (0.7.36) are specified in square brackets:
listen [::]:8000;
listen [::1];
# UNIX-domain sockets (0.8.21) are specified with the “unix:” prefix:
listen unix:/var/run/nginx.sock;
server_name name ...
- 用途:设定所在server指令域的虚拟主机名,当server_name指令值中有多个主机名时,第一个主机名为首主机名。
- 缺省值:
server_name ""; - 上下文:server
http {
server {
server_name example.com .example.com; # 泛域名的使用
server_name www.example.; # 多个后缀域名的使用server_name
www.example.com ~^www.example.com$; # 正则表达式匹配
# 正则匹配变量的场景
server_name ~^(www\.)?(.+)$;
location / {
root /sites/$2;
}
# 正则匹配为变量的场景
server_name ~^(www\.)?(?<domain>.+)$;
location / {
root /sites/$domain;
}
}
}
error_page code ... [=[response]] uri
- 用途:当HTTP请求发生错误时,可以根据响应状态码定义一个返回的页面或执行跳转。
- 缺省值:无
- 上下文:http, server, location, if in location
error_page 404 /404.html;
error_page 500 502 503 504 /50x.html;
error_page 404 = @fallback;
location
location [ = | ~ | ~* | ^~ ] uri { ... }
- 用途:告知客户端跳转到指定的 URI。
- 缺省值:无
- 上下文:server, location
- 参数
= :表示精确匹配^~ :表示uri以某个常规字符串开头,理解为匹配url路径即可。nginx不对url做编码,因此请求为/static/20%/aa ,可以被规则^~ /static/ /aa 匹配到(注意是空格)。以xx开头~ :表示区分大小写的正则匹配,以xx结尾~* :表示不区分大小写的正则匹配,以xx结尾!~ :区分大小写不匹配!~* :不区分大小写不匹配的正则/ :通用匹配,任何请求都会匹配到- 匹配规则:精确匹配
= -> 其次以xx开头匹配^~ -> 然后是按文件中顺序的正则匹配 -> 最后是交给 / 通用匹配,当有匹配成功时候,停止匹配,按当前匹配规则处理请求
# /usr/local/nginx/conf/nginx.conf
location = / {
# 规则A
}
location = /login {
# 规则B
}
location ^~ /static/ {
# 规则C
}
location ~ \.(gif|jpg|png|js|css)$ {
# 规则D,注意:是根据括号内的大小写进行匹配。括号内全是小写,只匹配小写
}
location ~* \.png$ {
# 规则E
}
location !~ \.xhtml$ {
# 规则F
}
location !~* \.xhtml$ {
# 规则G
}
location / {
# 规则H
}
# 效果如下:
# 访问根目录/, 比如http://localhost/ 将匹配规则A
# 访问 http://localhost/login 将匹配规则B,http://localhost/register 则匹配规则H
# 访问 http://localhost/static/a.html 将匹配规则C
# 访问 http://localhost/a.gif, http://localhost/b.jpg 将匹配规则D和规则E,但是规则D顺序优先,规则E不起作用, 而 http://localhost/static/c.png 则优先匹配到 规则C
# 访问 http://localhost/a.PNG 则匹配规则E, 而不会匹配规则D,因为规则E不区分大小写
# 访问 http://localhost/a.xhtml 不会匹配规则F和规则G,http://localhost/a.xhtml不会匹配规则G,(因为!)。规则F,规则G属于排除法,符合匹配规则也不会匹配到,所以想想看实际应用中哪里会用到。
# 访问 http://localhost/category/id/1111则最终匹配到规则H,因为以上规则都不匹配,这个时候nginx转发请求给后端应用服务器,比如FastCGI(php),tomcat(jsp),nginx作为方向代理服务器存在。
# 直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
# 这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
location = / {
proxy_pass http://tomcat:8080/index
}
# 第二个必选规则是处理静态文件请求,这是nginx作为http服务器的强项
# 有两种配置模式,目录匹配或后缀匹配,任选其一或搭配使用
location ^~ /static/ { //以xx开头
root /webroot/static/;
}
location ~* \.(gif|jpg|jpeg|png|css|js|ico)$ { //以xx结尾
root /webroot/res/;
}
# 第三个规则就是通用规则,用来转发动态请求到后端应用服务器
# 非静态文件请求就默认是动态请求,自己根据实际把握
location / {
proxy_pass http://tomcat:8080/
}
root path
- 用途:设定请求URL的本地文件根目录。当root指令在location指令域时,root设置的是location匹配访问路径的上一层目录
- 缺省值:
root html; - 上下文:http, server, location, if in location
# 请求文件的实际本地路径为/data/web/flv/
location /flv/ {
root /data/web;
}
应用
概况
- 日志
- error.log:通过配置项
error_log 设置,主要记录nginx处理http请求的错误状态,以及nginx本身服务运行的错误状态。 - access.log:通过配置项
access_log 和log_format 设置,记录nginx每一次http请求的访问状态,主要用于分析每一次访问的请求和客户端的交互行为。
场景
实践
示例
官方示例
#官方示例
#user nobody;
worker_processes 1;
#error_log logs/error.log;
#error_log logs/error.log notice;
#error_log logs/error.log info;
#pid logs/nginx.pid;
events {
worker_connections 1024;
}
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 0;
keepalive_timeout 65;
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / {
root html;
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$ {
# 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_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;
# }
#}
}
方向代理
# 反向代理示例1
# 192.168.1.100:8901 -> http://192.168.1.101:8099
# 反向代理示例2
# 192.168.1.100:8902/101/index.html -> http://192.168.1.101:8099/dist/index.html
# 192.168.1.100:8902/102/index.html -> http://192.168.1.102:8099/dist/index.html
worker_processes 1;
events {
worker_connections 1024;
}
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 8901;
server_name 192.168.1.100;
location / {
proxy_pass http://192.168.1.101:8099;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8902;
server_name 192.168.1.100;
location / {
proxy_pass http://192.168.1.102:8099;
}
location ^~ /101/ {
proxy_pass http://192.168.1.101:8099/dist/;
}
location ^~ /102/ {
proxy_pass http://192.168.1.102:8099/dist/;
}
}
}
reference
高可用 nginx底层架构
|