Nginx总结二

普通的(静态的)虚拟主机配置

客户端通过域名访问服务器时会将域名与被解析的ip一同放在请求中。当请求到了nginx中时。nginx会先去匹配ip,如果listen中没有找到对应的ip,就会通过域名进行匹配,匹配成功以后,再匹配端口。当这三步完成,就会找到对应的server的location对应的资源。
当listen出现了ip时,server_name就失去了意义。

server {
        listen       80;
        server_name  server.example.com;
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
        location / {
        root   /usr/share/nginx/html/1/;
        index  index.html index.htm;
        }

Nginx的匹配规则

语法规则: location [=|~|~*|^~] /uri/ { … }

  • = 开头表示精确匹配
  • ^~ 开头表示uri以某个常规字符串开头,理解为匹配 url路径即可。
  • ~ 开头表示区分大小写的正则匹配 以xx结尾
  • ~* 开头表示不区分大小写的正则匹配 以xx结尾
  • !~!~*分别为区分大小写不匹配及不区分大小写不匹配 的正则
  • / 通用匹配,任何请求都会匹配到。
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
#这里是直接转发给后端应用服务器了,也可以是一个静态首页
# 第一个必选规则
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/
自定义错误界面
首先要创建一个错误的目录
mkdir /usr/share/nginx/html/error
cd /usr/share/nginx/html/error
echo  error > 40x.html
 server {
        listen       80;
        server_name  server.example.com;
        #charset koi8-r;
        #access_log  /var/log/nginx/host.access.log  main;
        location / {
        root   /usr/share/nginx/html/1/;
        index  index.html index.htm;
        }
        # redirect server error pages to the static page /40x.html
        #
        error_page  403  404     /40x.html;
           location = /40x.html {
           root  /usr/share/nginx/html/error/;
        }

在浏览器输入一个不存在的地址 http://server.example.com/data/

Nginx的自动索引功能
server {
        listen       80;
        server_name  server.example.com;
        #charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;
        
        location / {
        root   /usr/share/nginx/html/1/;
        index  index.html index.htm;
        }
        location /index {
        autoindex  on;   #开启该功能
        }
在对应的服务器上面 
nginx -s reload 
mkdir /usr/share/nginx/html/index
cd  /usr/share/nginx/html/index
cp /etc/passwd  . 
cp /etc/group  .

在浏览器输入地址 http://server.example.com/index/

Nginx的别名功能
server {
        listen       80;
        server_name  server.example.com;
        #charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;
        location / {
        root   /usr/share/nginx/html/1/;
        index  index.html index.htm;
        }
        location /index {
        autoindex  on;
        }
        location /b { 
          alias  /usr/share/nginx/html/alise;
        }
mkdir   /usr/share/nginx/html/alise
cd  /usr/share/nginx/html/alise
echo  123456 > index.html
nginx -s reload 

在浏览器输入地址 http://server.example.com/b/

Nginx状态检查
    location /nginx_status {
           stub_status on;
           access_log off;
        }
nginx -s reload 

在浏览器输入地址 http://server.example.com/nginx_status/
结果如下:

Nginx rewrite
  • rewrite主要的功能是实现url的重写,nginx的rewrite规则采用pcre perl兼容正则表达式的语法,进行规则匹配,如果需要nginx的rewrite功能,在编译nginx之前,需要安装pcre库。
  • 规则语法 IF 指令
if  ($http_user_agent ~ MSIE){
    rewrite ^(.*)$ /msie/$1 break;
}
 if (!-f $request_filename) {
  rewrite ^/img/(.*)  /site/$host/image/$1 last;
}
  • 含义
    = ,!= 比较的一个变量和字符串。
    ~, ~* 与正则表达式匹配的变量,如果这个正则表达式中包含},;则整个表达式需要用"或'包围。
    -f,!-f 检查一个文件是否存在。
    -d, !-d 检查一个目录是否存在。
    -e,!-e 检查一个文件、目录、符号链接是否存在。
    -x, !-x 检查一个文件是否可执行。
return 指令
  • 示例,如果访问的URL 以 “.sh” ,".bash" 结尾,则返回状态码403
location  ~  .*\.(sh|bash)?$
{
   return 403;
}
rewrite 指令

flag可以是如下参数
last 停止处理后续rewrite指令集,然后对当前重写的新URI在rewrite指令集上重新查找。
break 停止处理后续rewrite指令集,并不在重新查找,但是当前location内剩余非rewrite语句和location外的的非rewrite语句可以执行。
redirect 如果replacement不是以http:// 或https://开始,返回302临时重定向
permant 返回301永久重定向
最终完整的重定向URL包括请求scheme(http://,https://等),请求的server_name_in_redirect和 port_in_redirec三部分 ,说白了也就是http协议 域名 端口三部分组成。
last 和 break用来实现URL重写,浏览器地址栏URL地址不变,redirect和permanent用来是实现URL跳转,浏览器地址栏会显示跳转后的URL地址。

server {
        listen       80;
        server_name  server.example.com;
        rewrite  ^/data/(\.*)$ /bbs  last; #访问data目录则会转向bbs目录
        #charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;
        location  /bbs {
          index  index.html;
mkdir  -p   /usr/share/nginx/html/bbs
cd   /usr/share/nginx/html/bbs
echo bbs > index.html 

通过浏览器访问 http://server.example.com/data/ 则会重新自动定义为http://server.example.com/bbs/

Nginx日志管理

log_format 指令用来设置日志的记录模式,语法如下:
log_format name(格式名称) type(格式样式)
举例说明如下:

log_format main '$server_name 
$remote_addr - $remote_user 
[$time_local] "$request" '
'$status $uptream_status
 $body_bytes_sent 
"$http_referer" ''
"$http_user_agent" "$http_x_forwarded_for"'
'$ssl_protocol $ssl_cipher $upstream_addr$request_time
$upstream_response_time';


每个样式的含义如下:
$server_name:虚拟主机名称。
$remote_addr:远程客户端的IP地址。
-:空白,用一个“-”占位符替代,历史原因导致还存在。
$remote_user:远程客户端用户名称,用于记录浏览者进行身份验证时提供的名字,如登录百度的用户名scq2099yt,如果没有登录就是空白。
[$time_local]:访问的时间与时区,比如18/Jul/2012:17:00:01 +0800,时间信息最后的"+0800"表示服务器所处时区位于UTC之后的8小时。
$request:请求的URI和HTTP协议,这是整个PV日志记录中最有用的信息,记录服务器收到一个什么样的请求
$status:记录请求返回的http状态码,比如成功是200。
$uptream_status:upstream状态,比如成功是200.
$upstream_addr:后端服务器的IP地址
$upstream_status:后端服务器返回的HTTP状态码
$body_bytes_sent:发送给客户端的文件主体内容的大小,比如899,可以将日志每条记录中的这个值累加起来以粗略估计服务器吞吐量。
$http_referer:记录从哪个页面链接访问过来的。 
$http_user_agent:客户端浏览器信息
$http_x_forwarded_for:客户端的真实ip,通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。
$ssl_protocol:SSL协议版本,比如TLSv1。
$ssl_cipher:交换数据中的算法,比如RC4-SHA。 
$upstream_addr:upstream的地址,即真正提供服务的主机地址。 
$request_time:整个请求的总时间。 
$upstream_response_time:请求过程中,upstream的响应时间。
日志的输入路径在 /var/log/nginx/host.access.log   
日志的错误日志在 /var/log/nginx/error.log              
 server {
        listen       80;
        server_name  server.example.com;
        rewrite  ^/data/(\.*)$ /bbs  last;
        #charset koi8-r;
        access_log  /var/log/nginx/host.access.log  main;
        error_log /var/log/nginx/error.log  warn;        
        location  /bbs {
          index  index.html;
       }

日志如下:


定义日志
  • access_log /data/log/$server_name.log mylogformat buffer=32k (从0.7.4之后nginx支持变量) buffer=32K : 表示设置内存缓冲区的大小
  • access_log [存储路径] [buff=大小] [gzip=压缩级别] [flush=time 刷新时间]
开启日志打开缓存
  • 对于每一条日志记录,日志文件都将先打开文件,在写入日志记录,然后马上关闭,为了提高包含变量的日志文件的存放路径的性能,可以使用open_log_file_cache指令来设置,格式如下:
    open_log_file_cache max=N [inactive=time] [min_users=N] [vaild=time] | off
    max: 设置缓存中的最大文件描述符数量
    inactive:设置时间默认是10s,如果在设置的时间内没有使用此文件描述符,则自动删除此描述符。
    min_uses:在参数inactive指定的时间范围内,如果日志文件超过被使用的次数,则将该日志文件的描述符计入缓存,默认为10秒钟。
    valid:设置检查频率,默认60s,设置多长时间检查一次,看日志文件路径与文件名是否仍然存在。
    off:禁用缓存
open_log_file_cache  max=1000 inactive=20s min_user=2 vaild=1m;
Nginx开启压缩输出
gzip on; 
//该指令用于开启或关闭gzip模块(on/off)
gzip_min_length 1k; 
//设置允许压缩的页面最小字节数,页面字节数从header头得content-length中进行获取。默认值是0,不管页面多大都压缩。建议设置成大于1k的字节数,小于1k可能会越压越大。
gzip_buffers 4 16k; 
//设置系统获取几个单位的缓存用于存储gzip的压缩结果数据流。4 16k代表以16k为单位,安装原始数据大小以16k为单位的4倍申请内存。
gzip_http_version 1.1; 
//识别http的协议版本(1.0/1.1)
gzip_comp_level 2; 
//gzip压缩比,1压缩比最小处理速度最快,9压缩比最大但处理速度最慢(传输快但比较消耗cpu)
gzip_types text/plain application/x-javascript text/css application/xml 
//匹配mime类型进行压缩,无论是否指定,”text/html”类型总是会被压缩的。
gzip_vary on; 
//和http头有关系,加个vary头,给代理服务器用的,有的浏览器支持压缩,有的不支持,所以避免浪费不支持的也压缩,所以根据客户端的HTTP头来判断,是否需要压缩
Nginx设定限速
配置文件
  location /data {
        limit_rate 100K
       }

通过另外一台服务器访问该网站的地址wget http://server.example.com/data
[root@192 ~]# wget http://server.example.com/data/
--2021-02-19 23:29:07--  http://server.example.com/data/
Resolving server.example.com (server.example.com)... 192.168.1.1
Connecting to server.example.com (server.example.com)|192.168.1.1|:80... connected.
HTTP request sent, awaiting response... 301 Moved Permanently
Location: http://server.example.com/bbs/ [following]
--2021-02-19 23:29:07--  http://server.example.com/bbs/
Reusing existing connection to server.example.com:80.
HTTP request sent, awaiting response... 200 OK
Length: 4 [text/html]
Saving to: ‘index.html’

100%[===================================================>] 4           --.-K/s   in 0s      

2021-02-19 23:29:07 (38.7 KB/s) - ‘index.html’ saved [4/4]
可以看到传递的速度都是在100K以下的

硬件的负载均衡,比如 F5,深信服,Array等。软件负载均衡,比如 Nginx,lvs。Nginx 通过在nginx.conf 文件进行配置即可实现负载均衡。

events {
    worker_connections  1024; #配置每个worker进程连接数上限,nginx支持的总连接就等于worker_connections
}

[root@192 nginx]# vi mime.types
配置nginx支持哪种多类型,可以在conf/mime.types 查看支持哪种多媒体类型
include   mime.types;
# sendfile   on ; #开启高效文件传输模式 
# 配置access.log日志及存放路径,并使用上面定义的main日志格式
keepalive_timeout  65; 长时间连接超时时间,单位是秒
Nginx主要应用有
  • 静态网络部署
  • 负载均衡
  • 静态代理
  • 动静分离
  • 虚拟主机
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,496评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,407评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,632评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,180评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,198评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,165评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,052评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,910评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,324评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,542评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,711评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,424评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,017评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,668评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,823评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,722评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,611评论 2 353

推荐阅读更多精彩内容