1.web服务器介绍
Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамблер)开发的,第一个公开版本0.1.0发布于2004年10月4日。其将源代码以类BSD许可证的形式发布,因它的稳定性、丰富的功能集、简单的配置文件和低系统资源的消耗而闻名。2011年6月1日,nginx 1.0.4发布。
Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,在BSD-like 协议下发行。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx网站用户有:百度、京东、新浪、网易、腾讯、淘宝等。
Nginx 是高性能的 HTTP 和反向代理的web服务器,处理高并发能力是十分强大的,能经受高负 载的考验,有报告表明能支持高达 50,000 个并发连接数。
Nginx支持热部署,启动简单,可以做到7*24不间断运行。几个月都不需要重新启动。
Nginx能干什么呢?
可以作为Web服务器
可以作为邮件服务器
可以作为反向代理的服务器动静分离(就是将动态资源和静态资源分隔开)
可以实现负载均衡
2.源码安装NGINX
使用源代码方法安装Nginx,可以自行选择Nginx版本进行安装,并且在安装过程中可以根据自己的需求调整Nginx的参数、安装自己所需的功能。源代码安装的Nginx相对yum安装的更加的稳定,移动数据更加的安全,卸载Nginx也不会有数据残留。
官方源码包下载地址:https://nginx.org/en/download.html
下载好之后拖入liunx解压即可
tar -zxf nginx-1.24.0.tar.gz
接下来我们采用1.24版本并进行平滑升级和降级
2.1 创建NGINX用户
useradd -s /sbin/nologin -M nginx
创建用户并使用户无法作为远程登录用户
2.2 进行NGINX编译环境检测
首先先进入nginx-1.24.0目录
./configure --prefix=/usr/local/nginx \ #指定下载目录
--user=nginx \ # 指定nginx运行用户--group=nginx \ # 指定nginx运行组--with-http_ssl_module \ # 支持https://--with-http_v2_module \ # 支持http版本2--with-http_realip_module \ # 支持ip透传--with-http_stub_status_module \ # 支持状态页面--with-http_gzip_static_module \ # 支持压缩--with-pcre \ # 支持正则--with-stream \ # 支持tcp反向代理--with-stream_ssl_module \ # 支持tcp的ssl加密--with-stream_realip_module # 支持tcp的透传ip#当然你还可以添加其他更多模块功能#通过./configure --help命令查看#注意斜杠是换行符,复制粘贴时在斜杆后面不要留空格
也可以下面代码一键复制
./configure --prefix=/usr/local/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
如果系统报错缺少东西,就根据提示自己下载
例如:
就是缺少gcc ,yum install gcc 下载即可
就是缺少 pcre-devel 下载即可
2.3 make编译
./nginx #启动nginx
conf :保存 nginx 所有的配置文件,其中 nginx.conf 是 nginx 服务器的最核心最主要的配置文件,其他 的.conf 则是用来配置 nginx 相关的功能的,例如 fastcgi 功能使用的是 fastcgi.conffastcgi_params 两个文件,配置文件一般都有一个样板配置文件,是以.default 为后缀,使用时可将其复制并将 default 后缀 去掉即可。html 目录中保存了 nginx 服务器的 web 文件,但是可以更改为其他目录保存 web 文件 , 另外还有一个 50x 的 web 文件是默认的错误页面提示页面。logs :用来保存 nginx 服务器的访问日志错误日志等日志, logs 目录可以放在其他路径,比如 /var/logs/nginx 里面。默认为空需要自己创建sbin :保存 nginx 二进制启动脚本,可以接受不同的参数以实现不同的功能。
2.4 验证版本及编译参数
2.5 源码安装后的二进制使用
使用 nginx -help 查看记得只有一条杠Usage: nginx [-?hvVtTq] [-s signal] [-c filename] [-p prefix] [-g directives]Options:-?,-h : this help-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 # 发送信号,reload信号 会生成新的worker,但master不会重新生成-p prefix : set prefix path (default: /etc/nginx/) # 指定 Nginx 目录-c filename : set configuration file (default: /etc/nginx/nginx.conf) # 配置文件路径-g directives : set global directives out of configuration file # 设置全局指令 , 注意和配置文件不要同时配置 , 否则冲突
2.6 Nginx 配置启动文件
vim /lib/systemd/system/nginx.service
[/usr]/lib/systemd/system/ 该目录中包含的是软件包安装的单元,也就是说通过yum、dnf、rpm等软件包管理命令管理的systemd单元文件,都放置在该目录下。
/etc/systemd/system/(系统管理员安装的单元, 优先级更高)
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
2.7 平滑升级和回滚
./configure --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
复制老版nginx保留备份
将新版nginx命令复制过去
我们的服务并不会因为升级而断客户端可以一直访问不会有变化
同理降级也是相同操作就不一一演示
3 nginx 核心配置
3.1 配置文件说明
Nginx 的配置文件的组成部分:主配置文件: nginx.conf子配置文件 : include conf.d/*.conffastcgi , uwsgi , scgi 等协议相关的配置文件mime.types :支持的 mime 类型, MIME(Multipurpose Internet Mail Extensions) 多用途互联网邮 件扩展类型,MIME 消息能包含文本、图像、音频、视频以及其他应用程序专用的数据,是设定某 种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览器会自动 使用指定应用程序来打开。多用于指定一些客户端自定义的文件名,以及一些媒体文件打开方式。
3.2 全局配置
user nginx nginx; # 启动 Nginx 工作进程的用户和组没加之前加了之后
# 将 Nginx 工作进程绑定到指定的 CPU 核心,默认 Nginx 是不进行进程绑定的,绑定并不是意味着当前 nginx 进 程独占以一核心CPU ,但是可以保证此进程不运行在其他核心上,这就极大减少了 nginx 的工作进程在不同的 cpu核心上的来回跳转,减少了 CPU 对进程的资源分配与回收以及内存管理等,因此可以有效的提升 nginx 服务 器的性能。绑定采用二进制第一个进程绑定第一个写入的cpu序号以此类推
worker_priority 0;# 工作进程优先级, -20~20(19)worker_rlimit_nofile 65536;#所有worker进程能打开的文件数量上限 ,#包括:Nginx的所有连接(例如与代理服务器的连接等)#而不仅仅是与客户端的连接#另一个考虑因素是实际的并发连接数不能超过系统级别的最大打开文件数的限制#最好与ulimit -n 或者limits.conf 的值保持一致,daemon off; # 前台运行 Nginx 服务用于测试、 docker 等环境。master_process off|on;# 是否开启 Nginx 的 master-worker 工作模式,仅用于开发调试场景 ,默认为on单个工作进程的最大并发连接数
use epoll;
#使用epoll事件驱动,
#Nginx 支持众多的事件驱动,# 比如 :select 、 poll 、 epoll ,只能设置在 events 模块中accept_mutex on; #on 为同一时刻一个请求轮流由 work 进程处理 ,# 而防止被同时唤醒所有 worker# 避免多个睡眠进程被唤醒的设置,默认为 off# 新请求会唤醒所有 worker 进程 , 此过程也称为 " 惊群 "# 因此 nginx 刚安装完以后要进行适当的优化。建议设置为 onmulti_accept on; #on 时 Nginx 服务器的每个工作进程可以同时接受多个新的网络连接# 此指令默认为 off ,# 即默认为一个工作进程只能一次接受一个新的网络连接# 打开后几个同接受多个。建议设置为 on
实现 nginx 的高并发配置
再次访问即可
3.2 http 配置
# 在响应报文中将指定的文件扩展名映射至 MIME 对应的类型include /etc/nginx/mime.types;default_type application/octet-stream; # 除 mime.types 中的类型外# 指定其它文件的默认 MIME 类型,浏览 器一般会提示下载types {text/html html;image/gif gif;image/jpeg jpg;}
3.2.1 建立简单PC站点
为了美观性和可读性等原因我们采用子配置文件写入# 定义子配置文件路径mkdir /usr/local/nginx/conf.d/vim /usr/local/nginx/conf/nginx.confhttp {......include /apps/nginx/conf/conf.d/*.conf; # 在配置文件的最后面添加此行#注意不要放在最前面 , 会导致前面的命令无法 生效}
为了美观和可读性我们采用子配置文件写入
3.2.2 root和alias
server {
listen 80;
server_name www.exam.com;
root /data/web/html;
index index.html;
location / {
root /data/web/html/;
}
location /alias {
alias /data/web/alias/;
}
}
echo this is alias > /data/web/alias/index.html
3.2.3 location的详情使用
# 语法规则:location [ = | ~ | ~* | ^~ ] uri { ... }= # 用于标准 uri 前,需要请求字串与 uri 精确匹配,大小敏感 , 如果匹配成功就停止向下匹配并立即处理请求^~ # 用于标准 uri 前,表示包含正则表达式 , 并且匹配以指定的正则表达式开头# 对 uri 的最左边部分做匹配检查,不区分字符大小写~ # 用于标准 uri 前,表示包含正则表达式 , 并且区分大小写~* # 用于标准 uri 前,表示包含正则表达式 , 并且不区分大写不带符号 # 匹配起始于此 uri 的所有的 uri\ # 用于标准 uri 前,表示包含正则表达式并且转义字符。可以将 . * ? 等转义为普通符号# 匹配优先级从高到低:=, ^~, ~/~*, 不带符号
3.2.4 location的匹配 规则
[root@nginx nginx]# mkdir /data/web{1..5}/test -p
[root@nginx nginx]# ll /data/
总用量 0
drwxr-xr-x. 4 root root 31 8月 22 23:56 web
drwxr-xr-x. 3 root root 18 8月 23 00:08 web1
drwxr-xr-x. 3 root root 18 8月 23 00:09 web2
drwxr-xr-x. 3 root root 18 8月 23 00:09 web3
drwxr-xr-x. 3 root root 18 8月 23 00:09 web4
drwxr-xr-x. 3 root root 18 8月 23 00:08 web5
[root@nginx nginx]# echo web1 test > /data/web1/test/index.html
[root@nginx nginx]# echo web2 test > /data/web2/test/index.html
[root@nginx nginx]# echo web3 test > /data/web3/test/index.html
[root@nginx nginx]# echo web4 test > /data/web4/test/index.html
[root@nginx nginx]# echo web5 test > /data/web5/test/index.html
3.2.4.1 匹配案例-精确匹配
3.2.4.2 匹配案例-区分大小写
3.2.4.3 匹配案例-不区分大小写
3.2.4.4 匹配案例-优先级
~* 和~优先级一样区别在于谁在前面
[root@nginx nginx]# cat /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name www.exam.com;
root /data/web/html;
index index.html;
location ~* .HtMl$ {
root /data/web1;
}
location ~ .html$ {
root /data/web2;
}
location /test {
root /data/web3;
}
location ^~ /te {
root /data/web4;
}
location = /test {
root /data/web5;
}
}
3.2.4.5 匹配案例-文件名后缀
[root@nginx nginx]# mkdir /data/web/jpg
[root@nginx nginx]# cd /data/web/
alias/ html/ jpg/
[root@nginx nginx]# cd /data/web/jpg/
[root@nginx jpg]# ll
总用量 368
-rw-r--r--. 1 root root 376289 8月 23 00:32 1.png
location ~* \.png {
root /data/web/jpg/;
}
3.3 location其他功能
3.3.1 自定义错误页面
[root@nginx conf.d]# cat /data/errors/40x.html
this is error html
[root@nginx conf.d]# cat /usr/local/nginx/conf.d/error.conf
server {
listen 80;
server_name www.exam.com;
error_page 404 /40x.html;
location /40x.html {
root /data/errors;
}
}
3.3.2 自定义错误日志
[root@nginx conf.d]# ll /var/log/ | grep nginx
[root@nginx conf.d]# mkdir /var/log/nginx
[root@nginx conf.d]# cat /usr/local/nginx/conf.d/error.conf
server {
listen 80;
server_name www.exam.com;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_page 404 /40x.html;
location /40x.html {
root /data/errors;
}
}
[root@nginx conf.d]# nginx -s reload
nginx: [warn] conflicting server name "www.exam.com" on 0.0.0.0:80, ignored
[root@nginx conf.d]# curl www.exam.com/haha
this is error html
[root@nginx conf.d]# ll /var/log/ | grep nginx
drwxr-xr-x. 2 root root 41 8月 23 16:04 nginx
[root@nginx conf.d]# tail -n1 /var/log/nginx/error.log
2024/08/23 16:04:30 [error] 45178#0: *39 open() "/usr/local/nginx/html/haha" failed (2: No such file or directory), client: 172.25.254.136, server: www.exam.com, request: "GET /haha HTTP/1.1", host: "www.exam.com"
[root@nginx conf.d]# tail -n1 /var/log/nginx/access.log
172.25.254.136 - - [23/Aug/2024:16:04:30 +0800] "GET /haha HTTP/1.1" 404 19 "-" "curl/7.76.1
3.3.3 检测文件是否存在
[root@nginx errors]# echo the html is not exist > /data/errors/default.html
[root@nginx errors]# cat /usr/local/nginx/conf.d/error.conf
server {
listen 80;
server_name www.exam.com;
root /data/; #必须得有默认路径否则检测文件不触发
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
error_page 404 /40x.html;
try_files $uri $uri.html $uri/index.html /errors/no.html;
location /40x.html {
root /data/errors;
}
}
[root@nginx errors]# nginx -s reload
nginx: [warn] conflicting server name "www.exam.com" on 0.0.0.0:80, ignored
[root@nginx errors]# curl www.exam.com/rhrh
the html is not exist
如果没写开头的默认路径就会报500错误未找到
2024/08/23 16:26:38 [error] 45257#0: *50 rewrite or internal redirection cycle while internally redirecting to "/data/errors/default.html", client: 172.25.254.1, server: www.exam.com, request: "GET /haa HTTP/1.1", host: "www.exam.com"
3.3.4 账户认证
[root@nginx errors]# htpasswd -cmb /usr/local/nginx/conf/.htpasswd admin lee
Adding password for user admin
[root@nginx errors]# cat /usr/local/nginx/conf/.htpasswd
admin:$apr1$0RMWZyx5$sGmSBzlZHK4E9zh3N55li0
[root@nginx errors]# htpasswd -mb /usr/local/nginx/conf/.htpasswd admin2 lee
Adding password for user admin2
[root@nginx errors]# mkdir /data/login
[root@nginx errors]# echo welcome >/data/login/index.html
[root@nginx ~]# cat /usr/local/nginx/conf.d/login.conf
server {
listen 80;
server_name www.exam.com;
location /login {
root /data;
index index.html;
auth_basic "login passwd";
auth_basic_user_file "/usr/local/nginx/conf/.htpasswd";
}
}
3.3.5 长连接
keepalive_requests 3;keepalive_timeout 65 60;# 开启长连接后,返回客户端的会话保持时间为 60s ,单次长连接累计请求达到指定次数请求或 65 秒就会被断 开,第二个数字60 为发送给客户端应答报文头部中显示的超时时间设置为 60s :如不设置客户端将不显示超时时间。Keep-Alive:timeout=60 # 浏览器收到的服务器返回的报文# 如果设置为 0 表示关闭会话保持功能,将如下显示:#Connection:close 浏览器收到的服务器返回的报文
需要下载telnet包[root@nginx ~]# telnet www.exam.com 80
Trying 172.25.254.136...
Connected to www.exam.com.
Escape character is '^]'.
GET / HTTP/1.1
HOST:www.exam.comHTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Fri, 23 Aug 2024 09:12:33 GMT
Content-Type: text/html
Content-Length: 22
Last-Modified: Fri, 23 Aug 2024 08:32:00 GMT
Connection: keep-alive
ETag: "66c84900-16"
Accept-Ranges: bytesthe html is not exist #第一次访问
GET / HTTP/1.1
HOST:www.exam.comHTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Fri, 23 Aug 2024 09:12:55 GMT
Content-Type: text/html
Content-Length: 22
Last-Modified: Fri, 23 Aug 2024 08:32:00 GMT
Connection: keep-alive
ETag: "66c84900-16"
Accept-Ranges: bytesthe html is not exist #第二次访问
GET / HTTP/1.1
HOST:www.exam.comHTTP/1.1 200 OK
Server: nginx/1.26.1
Date: Fri, 23 Aug 2024 09:13:08 GMT
Content-Type: text/html
Content-Length: 22
Last-Modified: Fri, 23 Aug 2024 08:32:00 GMT
Connection: keep-alive
ETag: "66c84900-16"
Accept-Ranges: bytesthe html is not exist #第三次访问
connection closed by foreign host.
#到达3次后自动断开
3.3.6 作为下载服务器
ngx_http_autoindex_module 模块处理以斜杠字符 "/" 结尾的请求,并生成目录列表,可以做为下载服务配置使用
[root@nginx ~]# mkdir /data/download
[root@nginx ~]# cp /usr/local/nginx/logs/error.log /data/download/
[root@nginx ~]# cat /usr/local/nginx/conf.d/download.conf
server {
listen 80 ;
server_name www.exam.com;
root /data;
location /download {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
limit_rate 1024k;
}
}
4 nginx 高级配置
4.1 nginx 状态页
配置如下
location /status {
stub_status;
}
# 状态页用于输出 nginx 的基本状态信息:# 输出信息示例:Active connections: 291server accepts handled requests16630948 16630948 31070465上面三个数字分别对应 accepts,handled,requests 三个值Reading: 6 Writing: 179 Waiting: 106Active connections: # 当前处于活动状态的客户端连接数# 包括连接等待空闲连接数 =reading+writing+waitingaccepts : # 统计总值, Nginx 自启动后已经接受的客户端请求连接的总数。handled: # 统计总值, Nginx 自启动后已经处理完成的客户端请求连接总数# 通常等于 accepts ,除非有因 worker_connections 限制等被拒绝的连接requests: # 统计总值, Nginx 自启动后客户端发来的总的请求数Nginx 支持对指定类型的文件进行压缩然后再传输给客户端,而且压缩还可以设置压缩比例,压缩后的文件大小将比源文件显著变小,样有助于降低出口带宽的利用率,降低企业的IT 支出,不过会占用相应的CPU 资源。Nginx 对文件的压缩功能是依赖于模块 ngx_http_gzip_module, 默认是内置模块配置指令如下:示例:Reading: # 当前状态,正在读取客户端请求报文首部的连接的连接数# 数值越大 , 说明排队现象严重 , 性能不足Writing: # 当前状态,正在向客户端发送响应报文过程中的连接数 , 数值越大 , 说明访问量很大Waiting: # 当前状态,正在等待客户端发出请求的空闲连接数开启 keep-alive 的情况下 , 这个值等于 active –(reading+writing)
4.2 nginx 压缩功能
# 启用或禁用 gzip 压缩,默认关闭gzip on | off;# 压缩比由低到高从 1 到 9 ,默认为 1 ,值越高压缩后文件越小,但是消耗 cpu 比较高。基本设定未 4 或者 5gzip_comp_level 4;# 禁用 IE6 gzip 功能,早期的 IE6 之前的版本不支持压缩gzip_disable "MSIE [1-6]\.";#gzip 压缩的最小文件,小于设置值的文件将不会压缩gzip_min_length 1k;# 启用压缩功能时,协议的最小版本,默认 HTTP/1.1gzip_http_version 1.0 | 1.1;# 指定 Nginx 服务需要向服务器申请的缓存空间的个数和大小 , 平台不同 , 默认 :32 4k 或者 16 8k;gzip_buffers number size;# 指明仅对哪些类型的资源执行压缩操作 ; 默认为 gzip_types text/html ,不用显示指定,否则出错gzip_types mime-type ...;# 如果启用压缩,是否在响应报文首部插入 “Vary: Accept-Encoding”, 一般建议打开gzip_vary on | off;# 预压缩,即直接从磁盘找到对应文件的 gz 后缀的式的压缩文件返回给用户,无需消耗服务器 CPU# 注意 : 来自于 ngx_http_gzip_static_module 模块gzip_static on | off;
server {
listen 80 ;
server_name www.exam.com;
root /data;
gzip on;
gzip_comp_level 5;
gzip_min_length 1k;
gzip_types text/plain text/css text/html;
gzip_vary on;
location /download {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
limit_rate 1024k;
}
}
4.3 nginx 变量使用
$remote_addr;# 存放了客户端的地址,注意是客户端的公网 IP$args;# 变量中存放了 URL 中的所有参数# 例如 :https://search.jd.com/Search?keyword= 手机 &enc=utf-8# 返回结果为 : keyword= 手机 &enc=utf-8$is_args# 如果有参数为 ? 否则为空$document_root;# 保存了针对当前资源的请求的系统根目录 , 例如 :/webdata/nginx/timinglee.org/lee 。$document_uri;# 保存了当前请求中不包含参数的 URI ,注意是不包含请求的指令# 比如 :http://lee.timinglee.org/var?\id=11111 会被定义为 /var# 返回结果为 :/var$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 请求生成的文件绝对路径,# 如 :webdata/nginx/timinglee.org/lee/var/index.html$request_uri;# 包含请求参数的原始 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;# 虚拟主机的端口号$http_user_agent;# 客户端浏览器的详细信息$http_cookie;# 客户端的所有 cookie 信息$cookie_<name>#name 为任意请求报文首部字部 cookie 的 key 名$http_<name>#name 为任意请求报文首部字段 , 表示记录请求报文的首部字段, ame 的对应的首部字段名需要为小写,如果有横线需要替换为下划线# 示例 :echo $http_user_agent;echo $http_host;$sent_http_<name>#name 为响应报文的首部字段, name 的对应的首部字段名需要为小写,如果有横线需要替换为下划线 , 此变量有问题echo $sent_http_server;$arg_<name># 此变量存放了 URL 中的指定参数, name 为请求 url 中指定的参数echo $arg_id;
[root@Nginx ~]# vim /usr/local/nginx/conf.d/vhosts.conf
server {
listen 80;
server_name lee.timinglee.org;
root /webdata/nginx/timinglee.org/lee;
location /var {
default_type text/html;
set $name timinglee;
echo $name;
set $web_port $server_port;
echo $web_port;
}
}
测试输出
[root@client ~]# curl lee.timinglee.org/var
timinglee
80
5 nginx rewrite 功能
5.1 if
= # 比较变量和字符串是否相等,相等时 if 指令认为该条件为 true ,反之为 false!= # 比较变量和字符串是否不相等,不相等时 if 指令认为条件为 true ,反之为 false~ # 区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件为假!~ # 区分大小写字符 , 判断是否匹配,不满足匹配条件为真,满足匹配条件为假~* # 不区分大小写字符,可以通过正则表达式匹配,满足匹配条件为真,不满足匹配条件假!~* # 不区分大小字符 , 判断是否匹配,满足匹配条件为假,不满足匹配条件为真-f 和 !-f # 判断请求的文件是否存在和是否不存在-d 和 !-d # 判断请求的目录是否存在和是否不存在-x 和 !-x # 判断文件是否可执行和是否不可执行-e 和 !-e # 判断请求的文件或目录是否存在和是否不存在 ( 包括文件,目录,软链接 )# 如果 $ 变量的值为空字符串或 0 ,则 if 指令认为该条件为 false ,其他条件为 true 。#nginx 1.0.1 之前 $ 变量的值如果以 0 开头的任意字符串会返回 false
5.2 set
5.3 break
5.4 return
5.5 rewrite 指令
正则表达式格式
. # 匹配除换行符以外的任意字符\w # 匹配字母或数字或下划线或汉字\s # 匹配任意的空白符\d # 匹配数字\b # 匹配单词的开始或结束^ # 匹配字付串的开始$ # 匹配字符串的结束* # 匹配重复零次或更多次+ # 匹配重复一次或更多次? # 匹配重复零次或一次(n) # 匹配重复 n 次{n,} # 匹配重复 n 次或更多次{n,m} # 匹配重复 n 到 m 次*? # 匹配重复任意次,但尽可能少重复+? # 匹配重复 1 次或更多次,但尽可能少重复?? # 匹配重复 0 次或 1 次,但尽可能少重复{n,m}? # 匹配重复 n 到 m 次,但尽可能少重复{n,}? # 匹配重复 n 次以上,但尽可能少重复\W # 匹配任意不是字母,数字,下划线,汉字的字符\S # 匹配任意不是空白符的字符\D # 匹配任意非数字的字符\B # 匹配不是单词开头或结束的位置[^x] # 匹配除了 x 以外的任意字符[^lee] # 匹配除了 magedu 这几个字母以外的任意字符
5.6 rewrite flag 使用介绍
redirect;# 临时重定向,重写完成后以临时重定向方式直接返回重写后生成的新 URL 给客户端# 由客户端重新发起请求 ; 使用相对路径 , 或者 http:// 或 https:// 开头,状态码: 302permanent;# 重写完成后以永久重定向方式直接返回重写后生成的新 URL 给客户端# 由客户端重新发起请求,状态码: 301break;# 重写完成后 , 停止对当前 URL 在当前 location 中后续的其它重写操作# 而后直接跳转至重写规则配置块之后的其它配置,结束循环,建议在 location 中使用# 适用于一个 URL 一次重写last;# 重写完成后 , 停止对当前 URI 在当前 location 中后续的其它重写操作,# 而后对新的 URL 启动新一轮重写检查,不建议在 location 中使用# 适用于一个 URL 多次重写,要注意避免出现超过十次以及 URL 重写后返回错误的给用户
location / {
root /data/nginx/html/pc;
index index.html;
rewrite / http://www.exam.com permanent; #临时重定向
#rewrite / http://www.exam.com redirect; #永久重定向
}
6 反向代理
6.1 反向代理 单web服务器
反向代理: 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 协议转发至指定服务器处理
proxy_pass;
#用来设置将客户端请求转发给的后端服务器的主机
# 可以是主机名 ( 将转发至后端服务做为主机头首部 ) 、 IP 地址:端口的方式# 也可以代理到预先设置的主机群组,需要模块 ngx_http_upstream_module 支
server {
listen 80;
server_name www.exam.com;
root data;
location /proxy {
proxy_pass http://172.25.254.10:80; http协议和端口号要写
}
}
[root@server conf.d]# mkdir /data/web/proxy
[root@server conf.d]# echo this is 172.25.254.10 proxy > /data/web/proxy/index.html
[root@server conf.d]# systemctl restart nginx
nginx 配置
在我们的webserver服务器上移动文件位置
[root@server conf.d]# mv /data/web/proxy/ /data/web/html/
[root@server conf.d]# systemctl restart nginx
6.2 反向代理缓存功能
# 示例:在 http配置定义缓存信息# 配置在 nginx.conf http 配置段proxy_cache_path /var/cache/nginx/proxy_cache# 定义缓存保存路径, proxy_cache 会自动创建levels=1:2:2# 定义缓存目录结构层次keys_zone=proxycache:20m指内存中缓存的大小,主要用于存放 key 和 metadatainactive=120s# 缓存有效时间max_size=10g;# 最大磁盘占用空间,磁盘存入文件内容的缓存空间最大值proxy_cache proxycache;proxy_cache_key $request_uri;# 对指定的数据进行 MD5 的运算做为缓存的 keyproxy_cache_valid 200 302 301 10m;# 指定的状态码返回的数据缓存多长时间proxy_cache_valid any 1m# 除指定的状态码返回的数据以外的缓存多长时间 , 必须设置 , 否则不会缓存proxy_cache_use_stale error | timeout | invalid_header | updating | http_500 |http_502 | http_503 | http_504 | http_403 | http_404 | off ;# 在被代理的后端服务器出现哪种情况下,可直接使用过期的缓存响应客户端proxy_cache_methods GET | HEAD | POST ...;# 对哪些客户端请求方法对应的响应进行缓存, GET 和 HEAD 方法总是被缓存
未配置缓存
ab -n1000 -c100 http://www.exam.com/proxy
配置在nginx.conf http配置段
配置NGINX location端
server {
listen 80;
server_name www.exam.com;
root data;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location /proxy {
proxy_pass http://172.25.254.10:80;
proxy_cache proxycache; #自己定义的名字
proxy_cache_key $request_uri;
proxy_cache_valid 200 302 404 10m;
proxy_cache_valid any 1m;
}
}
#验证缓存目录结构及文件大小
6.3 http反向代理负载均衡
upstream webserver {
#ip_hash;
#hash $request_uri consistent;
#hash $cookie_lee
#least_conn;
server 172.25.254.10:80 weight=1 fail_timeout=15s max_fails=3;
server 172.25.254.20:80 weight=1 fail_timeout=15s max_fails=3;
server 172.25.254.136:80 backup;
}
server {
listen 80;
server_name www.exam.com;
location ~ / {
proxy_pass http://webserver;
}
}