聊聊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;
        }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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