Nginx笔记

背景

  • 前段时间配置Nginx内容,对配置内容的了解仅限于字面上的了解,并不利于全面理解nginx内容。故找了一些教程看看,现下作一些笔记
  • Nginx下载来源:http://nginx.org/en/download.html

知识点

基础

  1. 真实环境中nginx、数据库版本的选择

    选择距离目前3~6个月的稳定版本,数据库选择距离目前6到8个月稳定版本

  2. 零碎知识

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    # 查看官方库中是否有nginx
    apt list | grep nginx

    # 查看历史命令
    history

    # 查看最后执行的命令是否成功,输出为0表示没有错误
    # $?是ubuntu的特殊变量,表示最后命令的退出状态。
    echo $?

    # 查看端口占用
    lsof -i :80
    # 查看谁在使用某个文件
    lsof /path_to_the_file

    # 查看谁在使用网络
    # l:列表,n:数字,t:tcp链接,u:udp链接,p:程序,a:显示所有
    sudo netstat -lntup | grep nginx
  3. nginx编译安装

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    # wget的-q参数表示静默下载
    wget -q http://nginx.org/download/nginx-1.18.0.tar.gz
    tar -zxvf nginx-1.18.0.tar.gz

    # 检查nginx编译时的依赖库,configure本身并不会直接安装软件。
    cd nginx-1.18.0
    # 查看编译时,可使用的参数:./configure --help
    # 指定--user和--group是因为在linux中每个软件的使用都是需要身份的
    ./configure --user=www --group=www --with-http_ssl_module --prefix=/etc/nginx

    # 用c语言进行编译
    make

    # 安装
    make install

    # 安装完成后检查配置文件是否准确
    /etc/nginx/sbin/nginx -t

    # 查看nginx

nginx命令

1
2
# nginx配置文件检测
nginx -t -c [配置文件]

nginx.conf配置

  1. 零碎知识

    • 本地模拟dns

      1
      2
      # 配置本地的DNS,编辑【drivers/host】文件,添加如下内容,然后到前台打开即可
      [IP] [域名]
    • nginx.conf中的autoindex配置项

      1
      2
      # 设置为on,则可搭建一个文件下载服务端
      autoindex on;

      网站界面如下:

      image-20200916003904727

    • ipconfig和ip给网卡添加ip

      1
      2
      3
      4
      5
      6
      7
      8
      # 添加配置IP,此处的网卡别名都是原网卡名,如原网卡名:[ens33],则网卡别名可以为:[ens33:1]
      # 24表示IP掩码,代表:255.255.255.0
      ifconfig [网卡别名] [ip]/24 up
      ip addr add [ip]/24 dev [原网卡名] label [网卡别名]

      # 删除IP
      ifconfig [网卡别名] down
      ip addr del [ip]/24 dev [原网卡名] label [网卡别名]
  2. 配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    # 核心模块
    user www-data;
    worker_processes auto; # 进程数,一般与核数相同,它相当于提供web服务的服务员数量
    pid /run/nginx.pid; # 配置nginx的进程号
    include /etc/nginx/modules-enabled/*.conf;

    # event模块
    events {
    worker_connections 768; # 最大连接数,它相当于每个服务员一次服务的最大客户数
    }

    # http模块
    http {
    keepalive_timeout 65; # 连接超时时间
    types_hash_max_size 2048;
    include /etc/nginx/mime.types; # include标识包含的意思,意味着当前配置文件包含mime.types配置文件
    default_type application/octet-stream;
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/access.log; # 用户的访问日志
    error_log /var/log/nginx/error.log error; # 记录的错误日志信息,如果不添加则默认error等级
    gzip on;
    # 可以将每个server单独配置一个配置文件,然后在http中将其导入进来即可,这样便于维护
    include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*;

    # server模块,一个server标识一个网站,可以有多个server
    # 当通过IP进行访问的时候,默认返回第一个server对应的网站
    server {
    listen 80; # 默认web监听的端口为80
    root /var/www/html; # 网站文件所在的目录
    index index.html index.htm index.nginx-debian.html; # 首页的默认解析文件
    server_name www.baibai.bai; # 网站的链接
    autoindex on; # 将网站设置为一个文件下载库

    # location可以有多个,其中=匹配的优先级最高
    location / { # 若location未匹配上,则寻找该目录下的内容
    if ($geoip2_data_country_code = CN) {
    rewrite ^(.*)$ https://wozaidunkeng.xyz$request_uri;
    }
    }

    error_page 500 501 502 503 504 /50x.html; # 如果发生错误,则寻找50x.html的页面

    location = /50x.html { # 若location匹配上了50x.html,则寻找该目录下的内容
    root html;
    }
    }
    }

Nginx模块

  1. ngx_http_stub_module模块:记录nginx的基本访问状态信息

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    # 查看是否有该信息
    nginx -V

    # 配置时可新建一个server,专门用于检测。建议配置成一个单独的页面。
    server {
    listen 80;
    index index.html index.htm index.nginx-debian.html;
    server_name status.baibai.bai;

    location / {
    stub_status on; # 开启nginx状态展示
    access_log off; # 关闭日志记录
    # 像这样的数据我们是不会允许其他人访问的,因此有时需要配置IP限制
    allow 10.0.0.0/24; # 配置允许IP段的访问
    deny all; # 配置禁止ip端的访问,all表示所有
    }
    }
  2. log模块:https://www.cnblogs.com/python-way/p/6251720.html

    1
    2
    3
    4
    5
    6
    7
    8
    # 定义日志格式,其中[$变量名]是nginx的特殊变量
    log_format [格式名称]'$http_x_forwarded_for - $remote_user [$time_local] "$request" '
    '"$status" $body_bytes_sent "$http_referer" '
    '"$http_user_agent" "$http_x_forwarded_for" '
    '"$gzip_ratio" $request_time $bytes_sent $request_length';

    # 按照定义的日志格式记录日志
    access_log /var/log/nginx/access.log [日志格式名称];
  3. location配置

    • 命令格式:

      1
      2
      3
      4
      5
      6
      7
      8
      location [=|~|^~|~*|@] [uri] { 匹配后进行的操作 }

      # 匹配的含义
      =:表示精确匹配,其优先级最高
      ~:用于区分大小写的匹配
      ~*:用于不区分大小写的匹配
      !~ | !~*:加上!表示取反
      ^~:进行常规的字符串匹配检查后,不做正则表达式的检查
    • 优先级

      优先级 组合 说明
      1 location = / { … } 精确匹配
      2 location ^~ /images/ { … } 匹配常规字符串,不做正则匹配检查
      3 location ~* \.(jpg|png|)$ { … } 正则匹配
      4 location /images/ { … } 匹配常规字符串,如果有正则则优先匹配正则
      5 location / { … } 所有location都不能匹配后的默认匹配
  1. rewrite配置

    1
    2
    # 配置nginx时只采用相对简单的url重写,复杂的则需要开发人员的协助
    rewrite [正则] [替换方式] [标签]

拓展

  1. curl命令:http://www.ruanyifeng.com/blog/2019/09/curl-reference.html

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    # 正常访问Url,返回浏览器的返回信息
    curl [链接]

    # 添加请求User-Agent
    curl -A "客户端标识" [链接]

    # 打印服务器回应的头和内容
    curl -i [链接]

    # 发送head请求
    curl -I [链接]

    # 跳过ssl检测
    curl -k [链接]

    # 跟随重定向
    curl -L [链接]

    # 输出通信整个过程
    curl -v [链接]

    # -G参数:发送带参数的Get请求
    curl -G -d "参数" [链接]

    # -d参数:默认发送post请求,并附带请求体,
    # -d同样支持json格式的数据,但需要与-H进行配合使用
    curl -d 'login=emma&password=123'-X POST [链接]
    # 也可以直接读取本地文件,使用-d参数后,可省略 -X POST
    curl -d '@data.txt' https://google.com/login

    # 对请求参数进行URL编码,--data-urlencode的作用与-d相同
    curl --data-urlencode 'comment=hello world' https://google.com/login

    # 添加请求头的referer
    curl -e "来源链接" [链接]

    # 上传二进制附件
    curl -F "参数名=@文件名;type=文件类型;filename=上传后的文件名" [链接]

    # 添加cookie
    curl -b "foo1=bar;foo2=bar2" [链接]

    # 将服务器cookie写入到本地文件
    curl -c [文件名] [链接]