NGINX学习心得(一)——基础篇

344 阅读4分钟

NGINX基础

安装

  • CentOS7下安装官网稳定版

    1. 安装先决条件

      sudo yum install yum-utiles
      
    2. 设置nginx官方源,修改/etc/yum.repos.d/nginx.repo,添加以下内容:

      [nginx-stable]
      name=nginx stable repo
      baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
      gpgcheck=1
      enabled=1
      gpgkey=https://nginx.org/keys/nginx_signing.key
      module_hotfixes=true
      
      [nginx-mainline]
      name=nginx mainline repo
      baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
      gpgcheck=1
      enabled=0
      gpgkey=https://nginx.org/keys/nginx_signing.key
      module_hotfixes=true
      
    3. 如果想要安装mainline版本,运行:

      sudo yum-config-manager --enable nginx-mainline
      
    4. 安装稳定版本nginx,运行以下命令:

      sudo yum install nginx
      

安装目录和编译参数

目录详解

  • 运行命令rpm -ql nginx,查看nginx安装目录:
路径 类型 作用
/etc/logrotate.d/nginx 配置文件 Nginx日志轮转,用于logrotate服务的日志切割
/etc/nginx
/etc/nginx/nginx.conf
/etc/nginx/conf.d
/etc/nginx/conf.d/default.conf
目录、配置文件 Nginx主配置文件
/etc/nginx/fastcgi_params
/etc/nginx/scgi_params
/etc/nginx/uwsgi_params
配置文件 cgi配置相关,fastcgi配置
/etc/nginx/koi-utf
/etc/nginx/koi-win
/etc/nginx/win-utf
配置文件 编码转换映射转化文件
/etc/nginx/mime.types 配置文件 设置http协议的Content-Type与扩展名的对应关系
/usr/lib/systemd/system/nginx-debug.service
/usr/lib/systemd/system/nginx.service
/etc/sysconfig/nginx
/etc/sysconfig/nginx-debug
配置文件 用于配置出系统守护进程管理器管理方式
/usr/sbin/nginx
/usr/sbin/nginx-debug
命令 Nginx服务的启动管理的终端命令
/usr/share/doc/nginx-1.16.1
/usr/share/doc/nginx-1.16.1/COPYRIGHT
/usr/share/man/man8/nginx.8.gz
文件、目录 Nginx的手册和帮助文件
/var/cache/nginx 目录 Nginx的缓存目录
/var/log/nginx 目录 Nginx的日志目录

编译参数详解

  • 运行nginx -V,查看nginx编译参数:
编译选项 目录
--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-client-body-temp-path=/var/cache/nginx/client_temp
--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
执行对应模块时,Nginx所保留的临时性文件
--user=nginx
--group=nginx
设定Nginx进程启动的用户和组用户

NGINX配置

打开/etc/nginx/nginx.conf

user  nginx;          # 配置用户或者组,默认为nobody nobody
worker_processes  1;  # 允许生成的进程数,默认为1

# 这个设置可以放入全局块,http块,server块 ↓
# debug|info|notice|warn|error|crit|alert|emerg ↓
error_log  /var/log/nginx/error.log warn; #制定日志路径,级别
pid        /var/run/nginx.pid;  # 指定nginx进程运行文件存放地址


events {
    accept_mutex on;   # 设置网路连接序列化,防止惊群现象发生,默认为on
    multi_accept on;  # 设置一个进程是否同时接受多个网络连接,默认为off
    use epoll;      # 事件驱动模型,select|poll|kqueue|epoll|resig|/dev/poll|eventport
    worker_connections  1024;    # 最大连接数,默认为512
}


http {
    include       /etc/nginx/mime.types;  # 文件扩展名与文件类型映射表
    default_type  application/octet-stream; # 默认文件类型,默认为text/plain
		
		access_log off;  # 取消服务日志
    # 自定义格式 ↓
    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; # combined为日志格式的默认值

    sendfile        on; # 允许sendfile方式传输文件,默认为off,可以在http块,server块,location块
    sendfile_max_chunk 100k;  # 每个进程每次调用传输数量不能大于设定的值,默认为0,即不设上限。

    keepalive_timeout  65;  # 连接超时时间,默认为75s,可以在http,server,location块

    gzip  on;  # 是否启用gzip压缩传输

    include /etc/nginx/conf.d/*.conf;      # 导入/etc/nginx/conf.d/目录下的所有conf文件配置
    
    upstream mysvr {   
      server 127.0.0.1:7878;
      server 192.168.10.121:3333 backup;  #热备
    }
    
    error_page 500 502 503 504 /50x.html; #错误页
    
    server {
        keepalive_requests 120; #单连接请求上限次数。
        listen       4545;   #监听端口
        server_name  127.0.0.1;   #监听地址       
        location  ~*^.+$ {       #请求的url过滤,正则匹配,~为区分大小写,~*为不区分大小写。
           root /usr/share/nginx/html;  #根目录
           index index.html index.htm;  #设置默认页
           proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表
           deny 127.0.0.1;  #拒绝的ip
           allow 172.18.5.54; #允许的ip           
        } 
    }
}

NGINX日志

类型

error.log、access_log

配置

  • 模块:HTTP模块

  • 语法:log_format name [escape=default|json] string...;:自定义配置

    access_log path name:配置log

    name: 自定义变量名

    path:log存放路径

    [escape=default|json] string:配置项

NGINX模块

http_sub_status_module

  • 作用:Nginx客户端状态

  • 配置语法

    Syntax:sub_status;

    Default:

    Context: server, location

http_random_index_modulie

  • 作用:目录中选择一个随机主页

  • 配置语法

    Syntax: random_index on|off;

    Default: random_index off;

    Context: location

http_sub_modulie

  • 作用:HTTP内容替换

  • 配置语法

    Syntax: sub_filter string replacment

    Default:

    Context: http, server, location

    Syntax: sub_filter_last_modified on|off

    Default: sub_filter_last_modified off

    Context: http, server, location

    Syntax: sub_filter_once on|off

    Default: sub_filter_once on

    Context: http, server, location

NGINX请求限制

连接频率限制 - limit_conn_module

Syntax: limit_conn_zone key zone=name:size;

Default:

Context: http

Syntax: limit_conn_zone number;

Default:

Context: http, server, location

请求频率限制 - limit_req_module

Syntax: limit_req_zone key zone=name:size rate=rate;

Default:

Context: http

Syntax: limit_req key zone=name [burst=number] [nodelay];

Default:

Context: http, server, location

NGINX访问控制

基于IP的访问控制 - http_access_module

Syntax: allow address|CIDR|unix:|all;

Default: ——

Context: http, server, location, limit_except

Syntax: deny address|CIDR|unix:|all;

Default: ——

Context: http, server, location, limit_except

  • 局限性:只能通过$romote_addr控制信任
  • 解决方法:
    • 采用HTTP头信息控制访问,例如http_x_forwarded_for
    • 结合geo模块做
    • 通过HTTP自定义变量传递

基于用户的信任登录 - http_auth_basic_module

Syntax: auth_basic string|off;

Default: ——

Context: server, location, limit_except

Syntax: auth_basic_user_file file;

Default: ——

Context: server, location, limit_except

  • 局限性:
    • 用户信息依赖文件方式
    • 维护单独的用户登录信息文件,效率低
  • 解决方案:
    • NGINX结合LUA进行验证
    • NGINX和LDAP打通,利用nginx-auth-ldap模块