聊聊nginx

nginx源码安装

# yum install pcre pcre-devel zlib zlib-devel openssl openssl-devel
# cd /usr/local/src/
# wget http://nginx.org/download/nginx-1.12.2.tar.gz
# tar zxvf nginx-1.12.2.tar.gz
# cd nginx-1.12.2
# ./configure --prefix=/usr/local/nginx
# make && make install

nginx命令

./sbin/nginx  启动nginx
./sbin/nginx -s reload 重新启动nginx
./sbin/nginx -s stop    关闭nginx
./sbin/nginx -t 查看nginx配置文件是否有错误

nginx命令添加到环境变量中

# ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/
# nginx 直接输入命令可以使用了
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)

nginx配置项

#全局区
worker_processes  1;//有1个工作的子进程,可以自行修改,但太大无意义,因为要争夺cpu;一般设置为CPU数*核数(4*8), 好的服务器有4块cpu,每个cpu是8核,所以可以设置成32

events {
   //一般配置nginx连接的特性
  // 如一个work能同事连接多少个请求
    worker_connections  1024;// 一个worker子进程最大连接1024个连接
}

 //主要是用来配置http服务器
http {
    include       mime.types;
    default_type  application/octet-stream;
  
  // log 日志的格式
    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;

    keepalive_timeout  65;
  
   //配置虚拟主机
    server {//最简单的server,基于域名的虚拟主机
        listen       80;
         //当访问test.com ,这个server段就起作用了
        server_name test.com;
        location / {
           root test.com;  //这里是相对路径,相对/usr/local/nginx; 也可以写绝对路径
           index a.html index.html //默认的首页, 从左往右
        }
    }
    server {//基于端口的虚拟主机
        listen      8080;
        server_name test.com;
        location / {
           root test.com;  
          }
      }
  
    server{//基于ip的虚拟主机
        listen 80;
        server_name 60.205.231.199,
        location / {
            root  ip;
        }
    }

nginx 日志管理

...
http{
   // log 日志的格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

   //全局访问日子的存放的文件,可以被server段里面的配置覆盖;使用的格式是'main'格式,main格式可以自定义;main格式是我们定义好的一种日志的格式,并起个名字,便于引用;
   //$remote_addr 客户端的ip 122.96.40.215
   //$remote_user [$time_local]客户端的访问的时间 [30/Mar/2018:11:41:06 +0800]
   //$request客户端的请求 GET / HTTP/1.1
   //$status返回的状态码
   //$body_bytes_sent返回给客户端的字节数
   //$http_referer 客户端请求当前页面的来源
   //$http_user_agent 用户的代理浏览器
   //$http_x_forwarded_for 
    access_log  logs/access.log  main

   //给某一个server添加访问日志
   server {
        listen       80;
        server_name test.com;
        //该server,它的访问日志的文件是 logs/access.log; 
        access_log  logs/test.com.log  main;
        location / {
           root test.com; 
           index index.html 
        }
    }
}
...

nginx定时任务,日志切割

  • 把昨天某个server下面的日志改个名称(用昨天的时间)存起来
# mkdir /data
# vim nginxlog.sh
#!/usr/bin/bash
LOGPATH=/ur/local/nginx/logs/test.com.access.log;
BASEPATH=/data
bakname=$BASEPATH/$(date -d yesterday +"%Y%m%d%H%M").test.com.access.log;
echo $bakname;

mv $LOGPATH $bakname;
touch $LOGPAHT;

kill -USR1 `cat /usr/local/nginx/logs/nginx.pid`;
# chmod +x nginxlog.sh
# crontab -e //添加定时任务
*/1 * * * * sh /data/nginxlog.sh //每分钟执行一次nginxlog.sh脚本

location相关

  • 定义: 根据不同的uri,进行不同的路由匹配
  • 语法:
location [=|~|~*|^~] match {}
  • 匹配类型分三种情况:

    1. location = match{} 精准匹配
    2. location match{} 一般匹配
    3. location ~ match{} 正则匹配~区分大小写;~*不区分大小写;^~以摸个字符开头
  • 路由匹配优先级:

    1. 首先看路由中是否有精准匹配,如果有的话,停止匹配过程;比如$uri == match匹配成功,使用configA
       location = match{
          configA
        }
    
    1. 如果没有精准匹配与$uri对应;则剩下普通匹配和正则匹配,此时正则匹配优先级高于普通匹配,如果没有没有正则匹配与$uri对应,最后使用普通匹配;
    
    location / {
          root /usr/local/nginx/html/image;
          index index.html;
      }
    
    location ~ image {
          root /var/www/;
          index index.html;
      }
    

    ps: 如果访问http://www.test.com/image/test.jpg,最终起作用的location是location ~ image{}

    1. 如何既没有精准匹配和正则匹配,只有两个普通匹配,如下:
    location  / {
          root /usr/local/nginx/html/image;
          index index.html;
      }
    location /test {
          root html;
          index index.html;
      }
    

    ps: 如果访问http://www.test.com/test,最终起作用的location是location /test {},因为它比较长,所以其作用了

nginx有哪些配置块

  • main(全局配置)
  • events(事件配置)
  • upstream(上游服务器设置)
  • http(通用请求处理)
  • server(主机设置)
  • location (url匹配特定位置后的设置)

nginx处理请求的过程

  • nginx收到请求后,根据请求定位到location,有handler生成response, 再由fileter进行处理;nginx模块开发,可以是Handler模块开发,也可以是Filter开发

nginx 重写

  1. if 语法格式
if 空格 (条件) {
   重写模式
 }
#条件四种书写方式
#1. = 来判断相等,用于字符串比较
#2. ~ 用正则来匹配(此正则区分大小写)
#3. ~* 不区分大小写的正则
#4. -f, -d, -e 来判断是否为文件,为目录,是否存在

例: 
//返回状态码,禁止某台ip的访问
 if ($remote_addr = 127.0.0.1) {
          return 403;
 }

//重定向到内部的某个页面,重定向到某个路劲
if ( $http_user_agent ~* chrome) {
    rewrite ^.*$ /h5/rewrite.html;//会以root作为根
    break;(不break会循环重定向)
}
root /Users/credan;

nginx常用的系统变量

  1. $remote_addr //获取客户端ip地址
  2. $http_user_agent //获取客户端的信息

nginx配置显示目录结构

location ^~  /h5 {
    autoindex on; //自动显示目录
    autoindex_exact_size off; //默认为on,显示出文件的真实大小,单位是bytes;改为off后,显示出文件的大概大小,单位是kb或者MB或者GB;
    autoindex_localtime on;//默认为off,显示的文件时间为GMT时间;改为on后,显示的文件为文件的服务器时间
    root /usr/local/www;
}

ps: 该根目录下面一定不要有index.html文件,不然就直接显示该文件了

nginx配置运行跨域访问

location ^~ /app {
    add_header 'Access-Control-Allow-Origin' '*';
    root /usr/local/www;
}

nginx配置反向代理和负载均衡

  1. 反向代理
server {
        listen 80;
        server_name test.xxx.com;
        root /usr/local/www;
        error_log /usr/local/nginx/logs/error.log;

        location ^~ /node {
              //如果匹配到此路由会反向代理到本地3000端口服务  
              proxy_pass http://127.0.0.1:3000;
        }
  
}
  1. 负载均衡配置
upstream demo {
    server 127.0.0.1:3000;
    server 127.0.0.1:3001;
}
server {
    listen 80;
    server_name test.xxx.com;
        root /usr/local/www;
    error_log /usr/local/nginx/logs/error.log;

    location ^~ /node {

        proxy_pass http://demo;
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 配置运行Nginx服务器用户(组) 用于配置运行Nginx服务器用户(组)的指令是user,其语法格式为: use...
    吃瓜的东阅读 4,489评论 0 41
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,644评论 18 139
  • Nginx简介 解决基于进程模型产生的C10K问题,请求时即使无状态连接如web服务都无法达到并发响应量级一万的现...
    魏镇坪阅读 1,997评论 0 9
  • 1.简介:  Nginx:engine X ,2002年,开源,商业版 http协议:web服务器(类似于ht...
    尛尛大尹阅读 1,863评论 0 3
  • location正则写法 location使用语法: location [ = | ~ | ~* | ^~ ] u...
    Zhang21阅读 14,568评论 0 5