Nginx基础

Nginx

基础篇

Nginx的基本情况

  • Nginx作为新一代的HTTP服务,解决了c10k问题,同时还可以作为反向代理、IMAP、POP3和SMTP程序
  • Nginx的优点:I/O多路复用,节省系统资源。epoll
  • 关于epoll:其为Nginx中实现I/O多路复用的方法,经过select和poll的演化,epoll当前的版本可以做到线程的安全性,并在实际使用中告知具体哪个sock有数据。具体的特点为:异步非阻塞

Nginx的部署

YUM

配置yum源如下

[nginx]
name=nginx repo
baseurl=http://nginx.org/packages/centos/7/$basearch/
gpgcheck=0
enabled=1

编译安装及参数

  • configure arguments 配置参数
  • --prefix=/etc/nginx 配置文件路径
  • --sbin-path=/usr/sbin/nginx 程序文件
  • --modules-path=/usr/lib64/nginx/modules
  • --conf-path=/etc/nginx/nginx.conf
  • --error--log-path=/var/log/nginx/error.log
  • --http-log-path=/var/log/nginx/access.log
  • --pid-path=/var/run/nginx.pid
  • --lock-path=/var/run/nginx.lock
  • --http-proxy-temp-path=/var/cache/nginx/proxy_temp
  • --http-fastcgi-temp-path=/var/cache/nginx/fastcgi_temp
  • --http-uwsgi-temp-path=/var/cache/nginx/uwsgi_temp
  • --http-scgi-temp-path=/var/cache/nginx/scgi_temp
  • --user=nginx
  • --group=nginx
  • --with-compat
  • --with-file-aio
  • --with-threads
  • --with-http_addition_module
  • --with-http_auth_request_module
  • --with-http_dav_module
  • --with-http_flv_module
  • --with-http_gunzip_module
  • --with-http_gzip_static_module
  • --with-http_mp4_module
  • --with-http_mp4_module
  • --with-http_random_index_module
  • --with-http_realip_module
  • --with-http_secure_link_moodule
  • --with-http_slice_link_module
  • --with-http_ssl_module
  • --with-http_stub_status_module
  • --with-http_sub_module
  • --with-http_v2_module
  • --with-mail
  • --with-mail_ssl_module
  • --with-stream
  • --with-stream_realip_module
  • --with-stream_ssl_module
  • --with-stream_ssl_preread_module
  • --with-cc-opt='-O2 -g -pipr -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector-strong --parram=ssp-buffer-size=4 -grecord-gcc-switches -m64 -mtune=generic -fPIC'
  • --with-ld-opt='-Wl,-z,relro -Wl,-z,now -pir' 1l

与Nginx相关的全部文件

  • /etc/logrotate.d/nginx 日志轮转
  • /etc/nginx 配置文件总目录
  • /etc/nginx/conf.d 自配置文件文件夹
  • /etc/nginx/conf.d/default.conf 默认的网站配置文件
  • /etc/nginx/fastcgi_params
  • /etc/nginx/scgi_params
  • /etc/nginx/uwsgi_params
  • /etc/nginx/koi-utf 字符集,文件编码
  • /etc/nginx/win-utf
  • /etc/nginx/koi-win
  • /etc/nginx/mime.types 关联程序,如网站的文件类型和相关的处理程序
  • /etc/nginx/modules 模块文件夹,第三方模块等
  • /etc/nginx/nginx.conf 主配置文件
  • /usr/lib/systemcd/system/nginx.service.systemctl 服务脚本
  • /usr/sbin/nginx 主程序
  • /usr/share/doc/nginx-1.12.1 文档
  • /usr/share/man/man8/nginx.8.gz
  • /usr/share/nginx/html/index.html默认主页
  • /var/cache/nginx nginx缓存文件
  • /var/log/nginx/ 存放nginx日志的目录

Nginx的基本配置

主配置文件内容详解

user nginx;
worker_processes 1; 
#启动的worker进程的数量(CPU数量一致或auto)
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events{
    use epoll;  
    #事件驱动模型epoll
    worker_connections 1024; 
    #每个worker进程允许处理的最大连接数,通常要改大
}
http{
    include /etc/nginx/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 /var/log/nginx/access.log main;
    sendfile on;
    #优化参数,高效传输文件的模式
    #tcp_nopush on; 
    #TCP停止数据包推送,等积累到最大的时候一起推送到Client
    keepalive_timeout 65;
    #长连接时间
    #gzip on;
    #压缩
    include /etc/nginx/conf.d/*.conf;
    #包含自配置目录
}

虚拟主机的配置文件/etc/nginx/conf.d/default.conf

server{
    listen 80;
    server_name localhost;
    #charset koi8-r;
    #access_log /var/log/nginx/host.access.log main;
    location / {
        root /usr/share/nginx/html;
        index index.html index.html;
    }
    #error_page 404 /404.html;
    #redirect server error pages to the static page /50x.html
    error_page 500 502 503 504 /50x.html;
    location = /50.html {
        root /usr/share/nginx/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 /scipts$fastcgi_script_name;
        #include fastcgi_params;
    }
    #deny access to .htacess files,if Apaches's document root
    #concurs with nginx's one
    #location ~ /\.ht{
        #deny all;
    }
}

新建一个简单的虚拟主机/etc/nginx/conf.d/new.conf

server{
    listen 80;
    server_name new.com;
    location / {
        root /new;
        index index.html index.htm;
    }
}
  • 使用时要配置本地解析

日志配置

简介

Nginx 中有非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志。若要使用日志系统需要加载日志模块 ngx_http_log_module(默认开启)

常见变量意义

log_format
#日志格式
access_log
#访问日志
error_log
#错误日志
open_log_file_cache
#日志缓存
  • 关于日志缓存的配置
open_log_file_cache max=N[inactive=time] [min_uses=N] [valid=time] | off
#该指令默认是禁止的
open_log_file_cache off;
#其中参数的描述符说明如下
#max:缓存中最大的文件的描述符数量
#inactive:设置一个事件,如果在设置的事件内没有使用此文件描述符,则自动删除此描述符。
#min_uses:在参数inactive指定的时间范围内,若文件日志超过被使用的次数,则将该日志文件的描述符记入缓存。
#valid:设置多长时间检查一次,检查内容为指定的日志文件路径与文件名。

#推荐配置如下
open_log_file_cache max=1000 inactive=20s min_uses=2 valid=1m;

日志的格式和命令

主配置文件中的log_format将规定本机中全部的Nginx的日志格式的记录形式。

#基本样式
log_format conbined '$remote_addr - $remote_user [$time_local]'
'"$request" $statues $body_bytes_sent'
'"$http_referer" "$http_user_agent"';

日志中允许包含的标量

$romote_addr,$http_x_forwarded_for
#分别为CIP 和 DIP
$remote_user
#远程用户:记录客户端的名称
[$time_local]
#本地时间
$request
#请求:URL和HTTP协议
$status
#状态:记录请求状态
$body_bytes_sent
#发送给客户端的字节数,不包含响应头的大小
$bytes_sent
#发送给客户端的总字节数
$msec
#日志写入时间。单位微妙,保留三位
$http_referer
#记录从哪个链接跳转过来的
$http_user_agen
#记录客户端浏览器的相关信息
$request_length
#请求的长度,包括请求行,请求头和请求正文
$request_time
#请求处理的事件,单位为秒,保留三位。从读入客户端的第一个字节开始到发送完最后一个字节结束
$time_iso8601
#ISO8601标准格式下的本地时间

访问日志和错误日志

即为access_logerror_log

日志缓存

  • 存在的意义:每次日志写入操作实际上是一次I/O操作,大量的日志写入会使得服务器性能下降。为了能够提高服务器的可用性,先将日志缓存下来,之后再批量写入。
  • 具体操作见上。

日志轮转和切割

  • Nginx的安装,会默认启用日志轮转。
  • Nginx自身的日志轮转规则写入到/etc/logrotate.d/nginx
create 0644 nginx nginx #创建爱你新的日志文件,属主
daily #天
rotate 10 #保留的份数
missingok #丢失不提醒
notifempyt #若为空文件则不轮转
compress #压缩
sharedsripts #轮转后脚本
postrotate
    /bin/kill -USR1 `cat/usr/ningx.pid 2>/dev/null || true endsript`

日志分析

  • 常用的字段有
$remote_addr     $1
$time_local      $4
$request         $7
$status          $9
$body_bytes_sent $10
案例实际操作
#统计 2018年9月5日 的PV量
grep '05/Sep/2018' access.log | wc -l
#统计 2018年9月5日 一天之中访问最多的10个IP
grep '05/Sep/2018' access.log | awk '{ips[$1]++} END{for(i in ips){print i,ips[i]}}' | sort -k2 -rn | head -n10
#统计 2018年9月5日 每个URL访问内容的总大小
grep '05/Sep/2018' access.log | awk '{urls[$7]++;size[$7]+=$10}' END{for(i in urls){print urls[i],size[i],i}} | srot -k1 -rn | head -n10
#统计 2018年9月5日 IP访问码为404及出现的次数($status)
grep '05/Sep/2018' error.log | awk '{if($9="404"){ip_code[$1" "$9]++}} END{for(i in ip_code){print i,ip_code[i]}}'
#统计前一分钟PV量
date=$(date -d '-1 minute' +%d/%b/%Y:%H:%M);awk -v date=$date '$0 ~ $date{i++} END{print i}' access.log

Nginx WEB模块

  • 连接状态 stub_status_module
    • 目的 展示Nginx的连接状态
    • 查询 nginx -V 2>&1 | grep stub_status
    • 启动状态模块
    server{
        location /nginx_status{
            stu_status;
            allow all;
        }
    }
    
    • 查询示例
    Active connections: 1 #当前活动的连接数
    server accepts handled requests 
    17  17  24      # 第一个17:总连接数(TCP) 第二个17(TCP) 成功的链接数 24:总共处理的请求数(HTTP)
    Reading: 0 Writing: 1 Wating:0  #Reading请求头 Writing 响应头 Waiting等待的请求数,开始了Keepalive
    
  • 随机主页 random_index_module
    • 目的 将主页设置成随机页面,是一种微调更新机制
    • 启动随机主页模块
    server{
    
        location / {
            #root /usr/share/nginx/html;
            #index index.html;
            root /app;
            random_index on;
            #隐藏文件不会被作为随机主页显示
        }
    }
    
  • 替换模块 sub_module
    • 目的 网页内容替换 针对模板生成网页时出现的批量错误
    • 启动替换1
    server{
    
        sub-filter nginx'aaa';
        sub_filter_once on;
        location / {
          ...
        }
    }
    
  • 文件读取 ngx_http_core_module
    • 默认启动提升传输效率
  • 文件压缩 ngx_http_gzip_module
    • 语法
    Syntax: gzip on|off;
    Default: gzip off;
    Context: http,server,location,if in location
    
    Syntax: gzip_comp_level level;
    Default: gzip_comp_level 1;
    Context: http,server,location
    #压缩等级
    
    Syntax: gzip_http_version 1.0 | 1.1;
    Default: gzip_hjttp_version 1.1
    Context: http,server,location
    
    • 启动模块,传输前压缩,提高传输效率。
    • 启动
    http{
    
        gzip on;
        gzip_http_version 1.1;
        gzip_comp_level 2;
        gzip_types text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
        gzip_static on;
    }
    
  • 浏览器缓存 ngx_http_headers_module
    • 语法
    Syntax:   expires [modified] time;
    Default:  expires off;
    Context:  http,server,location,if in location
    
    • 开启
      location / {
          root /app/aaa.com;
          index index.html
          expires 24h;
      }
    
  • 防盗链 ngx_http_referer_module
    • 语法
      Syntax: valid_referers none | blocked | server_names| string ...;
      Default: --
      Context: server,location
    
    • 启用
      location / {
    
          valid_referers none blocked *.a.com;
          if ($invalid_referer){
              return 403;
          }
      }
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,743评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,296评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,285评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,485评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,581评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,821评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,960评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,719评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,186评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,516评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,650评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,936评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,757评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,991评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,370评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,527评论 2 349

推荐阅读更多精彩内容