• Nginx 介绍与使用


    Nginx 简介

    Nginx 概述

    Nginx 是一款由俄罗斯开放的开源的高性能的 HTTP服务器和反向代理 web 服务器,同时还支持 IMAP/POP3/SMTP 服务。其特点是高性能、稳定、消耗硬件资源小、能够处理大并发

    Nginx 功能

    • web 服务

    • 负载均衡 (反向代理)

    • web cache (web 缓存)

    Nginx 优点

    • 支持高并发,能支持几万并发连接(特别是静态小文件业务环境)

    • 内存消耗小,在3万并发连接下,开启10个Nginx线程消耗的内存不到200MB。

    • 配置简单,使用灵活,支持Rewrite重写规则。

    • 能种类比较多,web,cache,proxy。

    • 支持异步网络I/O事件模型epoll。

    Nginx 模块划分

    结构划分

    • 核心模块:HTTP、EVENT模块和MAIL模块
    • 基础模块:HTTP Access模块、HTTP FastCGI模块、HTTP Proxy模块和HTTP Rewrite模块
    • 第三方模块:HTTP Upstream Request Hash模块、Notice模块和HTTP Access Key模块。

    功能划分

    Handlers(处理器模块):此类模块直接出来请求,并输出内容和修改headers信息等操作。Handlers处理器模块一般只能有一个。

    Filters(过滤器模块):此类模块主要对其他处理器模块输出的内容进行修改操作,最后有nginx输出。

    Proxies(代理类模块):此类模块是nginx的HTTP Upstream质量的模块,这些模块主要与后端一些服务(例如FastCGI)进行交互,实现服务代理和负载均衡等功能。

    Nginx 进程模型

    Nginx在启动后,会有一个master进程和多个worker进程。

    Master 进程

    1.接收外界传递给Nginx的信号,进而管理服务的状态等;

    2.管理worker进程,向各worker进程发送信号,监控worker进程的运行状态,当worker进程异常情况下退出后,会自动重新启动新的worker进程;

    3.master进程充当整个进程组与用户的交互接口,同时对进程进行监护。它不需要处理网络事件,不负责业务的执行,只会通过管理worker进程来实现重启服务、平滑升级、更换日志文件、配置文件实时生效等功能。

    Worker 进程

    1.处理基本的网络事件,多个worker进程之间是对等且独立,他们同等竞争来自客户端的请求。

    2.一个请求,只可能在一个worker进程中处理,一个worker进程,不可能处理其它进程的请求。

    2.worker进程的个数是可以设置的,一般我们会设置与机器cpu核心数一致;

    Nginx 安装

    实验环境

    系统类型 IP地址 主机名 硬件
    CentOS 7.6 1810 10.4.7.7 www.onelpc.com 内存:2G

    安装 Nginx 所需依赖

    yum install -y pcre pcre-devel		
    yum install -y openssl openssl-devel
    

    创建 nginx 用户

    useradd  -s /sbin/nologin -M nginx 
    

    下载软件包并解压

    # 创建目录存放软件包
    mkdir -p /server/tools
    cd /server/tools
    
    # 下载nginx 软件包
    wget http://nginx.org/download/nginx-1.16.1.tar.gz
    
    # 解压
    tar xf nginx-1.16.1.tar.gz 
    cd nginx-1.16.1/
    

    编译与安装

    ./configure 
    --user=nginx 
    --group=nginx 
    --prefix=/usr/local/nginx-1.16.1 
    --with-http_stub_status_module 
    --with-http_ssl_module 
    --with-pcre
    
    make&&make install
    

    创建软连接

    ln -s /usr/local/nginx-1.16.1 /usr/local/nginx
    ln -s /usr/local/nginx/sbin/  /usr/local/sbin
    

    配置 systemctl 管理

    cat >/usr/lib/systemd/system/nginx.service<<EOF
    [Unit]
    Description=nginx - high performance web server
    Documentation=http://nginx.org/en/docs/
    After=network.target remote-fs.target nss-lookup.target
    
    [Service]
    Type=forking
    PIDFile=/usr/local/nginx/logs/nginx.pid
    ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
    ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
    ExecReload=/bin/kill -s HUP $MAINPID
    ExecStop=/bin/kill -s QUIT $MAINPID
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user.target
    EOF
    

    启动nginx

    systemctl daemon-reload
    systemctl start nginx
    systemctl enable nginx
    

    访问测试

    image-20200301174911355

    nginx 常用编译参数说明

    -prefix=/usr/local/nginx 				##指定安装位置
    --user=nginx --group=nginx 				##指定运行服务的用户和组
    --with-http_stub_status_module			##开启状态监听模块 
    --conf-path= 							##指向配置文件存放位置
    --error-log-path= 						##指向错误日志存放位置
    --pid-path= 							##指向pid文件存放位置 
    --with-rtsig_module 					##启用rtsig模块支持(实时信号)
    --with-select_module 					##启用select模块支持(一种轮询模式,不推荐在高载环境下使用)禁用:--without-select_module
    --with-http_ssl_module 					##启用ngx_http_ssl_module支持(使支持https请求,需已安装openssl)
    --with-http_xslt_module  				##启用ngx_http_xslt_module支持(过滤转换XML请求)
    --with-http_image_filter_module 		##启用ngx_http_image_filter_module支持(传输JPEG/GIF/PNG 图片的一个过滤器)(默认为不启用,要用到gd库) 
    --with-http_gzip_static_module 			##启用ngx_http_gzip_static_module支持(在线实时压缩输出数据流)
    --with-http_degradation_module  		##启用ngx_http_degradation_module支持(允许在内存不足的情况下返回204或444码)
    --without-http_access_module 			##禁用ngx_http_access_module支持(该模块提供了一个简单的基于主机的访问控制,允许或拒绝基于ip地址)
    --without-http_auth_basic_module		##禁用ngx_http_auth_basic_module(该模块是可以使用用户名和密码基于http基本认证方法,来保护你的站点或其部分内容)
    ---without-http_rewrite_module 			##禁用ngx_http_rewrite_module支持(该模块允许使用正则表达式改变URL)
    --without-http_fastcgi_module 			##禁用ngx_http_fastcgi_module支持(该模块允许Nginx 与FastCGI 进程交互,并通过传递参数来控制FastCGI 进程工作。)
    
    

    Nginx 配置文件

    nginx 配置文件整体结构

    img

    1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径,配置文件引入,允许生成worker process数等。

    2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。

    3、http块:可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如文件引入,mime-type定义,日志自定义,是否使用sendfile传输文件,连接超时时间,单连接请求数等。

    4、server块:配置虚拟主机的相关参数,一个http中可以有多个server。

    5、location块:配置请求的路由,以及各种页面的处理情况。

    Nginx 配置文件内容说明

    user  nobody  nobody;			##运行的用户和组
    worker_processes  3;			##process数
    error_log  logs/error.log;		##错误日志存放位置与日志级别
    pid  logs/nginx.pid;			##PID文件路径
    
    events {
    	use epoll;				   ##事件驱动模型
        worker_connections  1024;  ##最大连接数的配置
    }
    
    
    http {
        ##设定mime类型,类型由mime.type文件定义
        include       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  logs/access.log  main;		##服务日志路径与名称
        sendfile  on;				##开启高效传输模式	
        keepalive_timeout  65;  	##长连接超时时间  
        
       	gzip on;					##开启gzip压缩
    	gzip_min_length  1k;		##指定最小压缩文件的大小
    	gzip_buffers    4  16k;		##指定压缩缓冲区的个数和大小
    	gzip_http_version 1.0;		##指定压缩版本
    	gzip_comp_level 2;			##指定压缩等级1-9,9等级最高
        ##指定压缩文件类型
    	gzip_types  text/plain application/x-javascript text/css application/xml;		
    
        #配置虚拟主机
        server {
            #虚拟主机使用的端口
            listen       80;
            #虚拟主机域名
            server_name  localhost;
    
            #虚拟主机支持的字符集
            #charset koi8-r;
    
            #虚拟主机的访问日志路径
            #access_log  logs/host.access.log  main;
    
            #定义web根路径
            location / {
                #根目录路径
                root   html;
                #索引页
                index  index.html index.htm;
            }
    
            #error_page  404              /404.html;
            # redirect server error pages to the static page /50x.html
            #
            #根据错误码 返回对应的页面
            error_page   500 502 503 504  /50x.html;
            #定义页面路径
            location = /50x.html {
                root   html;
            }
    
            #定义PHP为本机服务的模型  
            # 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  /scripts$fastcgi_script_name;
            #    include        fastcgi_params;
            #}
    
        #https的配置方案
        # HTTPS server
        #
        #server {
        #    listen       443 ssl;
        #    server_name  localhost;
        #    ssl_certificate      cert.pem;
        #    ssl_certificate_key  cert.key;
        #    ssl_session_cache    shared:SSL:1m;
        #    ssl_session_timeout  5m;
        #    ssl_ciphers  HIGH:!aNULL:!MD5;
        #    ssl_prefer_server_ciphers  on;
        #    location / {
        #        root   html;
        #        index  index.html index.htm;
        #    }
        #}
    }
    

    注意:修改完配置文件后一定要记得nginx -t检查配置文件是否正确,否则直接重启会导致nginx无法启动。

    Nginx 配置实例

    Nginx 日志配置

    access_log 指令

    access_log 用来定义日志级别,日志位置。

    日志级别: debug > info > notice > warn > error > crit > alert > emerg

    #语法
    access_log path format gzi=[level] [buffer=size] [flush=time]
    		  # gzip压缩等级
          # buffer设置内存缓冲区大小
          # flush保存在缓冲区中的最长时间
          # 不记录日志:access_log off 
    # 例子
    access_log   logs/host.access.log  main;
    

    log_format 指令

    用来定义记录日志的格式

    #日志格式
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    
    日志格式允许包含的变量:
      $remote_addr, $http_x_forwarded_for 记录客户端IP地址
      $remote_user         	 记录客户端名称
      $request              记录请求的URL和HTTP协议
      $status          	   记录请求状态
      $body_bytes_sent         发送给客户端的字节数,不包括响应头的大小
      $bytes_sent       	 发送给客户端的总字节数
      $connection        	 链接的序列号
      $connection_requests 		 当前通过一个链接获得的请求数量
      $msec       			 日志写入时间,单位为秒,精确是毫秒
      $pipe       	      	  如果请求时通过http流水线发送,pipe值为p,否则为.
      $http_referer              记录从那个页面链接访问过来的
      $http_user_agent        	 记录客户端浏览器相关信息
      $request_length         	 请求的长度
      $request_time           	 请求处理时间,单位为秒,精确度毫秒
      $time_iso8601           	 标准格式下的本地时间
      $time_local                通用日志格式下的本地时间
    
    #@指定为json格式
    log_format main_json '{"@timestamp":"$time_local",'
                         '"client_ip": "$remote_addr",'
                         '"request": "$request",'
                         '"status": "$status",'
                         '"bytes": "$body_bytes_sent",'
                         '"x_forwarded": "$http_x_forwarded_for",'
                         '"referer": "$http_referer"'
    '}';
    

    Nginx location匹配规则

    location指令作用: 用于匹配uri信息,针对不同的uri信息做出不同的处理

    # 语法格式
    location指令作用: 用于匹配uri信息,针对不同的uri信息做出不同的处理
    location匹配方法:
    Syntax:	location [ = | ~ | ~* | ^~ ] uri { ... }
            location @name { ... }
    Default:	—
    Context:	server, location
    
    # 匹配优先级
    	=       精确匹配                        优先级01
    	^~      优先匹配(不识别匹配中的正则信息)    优先级02
    	~       模糊匹配(对匹配信息大小写敏感)      优先级03
    	~*      模糊匹配(对匹配信息大小写不敏感)    优先级03
    	uri     模糊匹配(指定清楚匹配内容)         优先级03
    	loaction /  默认匹配的location           优先级最低    
    

    Nginx 访问控制

    网站阻止访问模块: Module ngx_http_access_module

    ## 语法格式
    Syntax:	allow address | CIDR | unix: | all;
    Default:	—
    Context:	http, server, location, limit_except
    
    
    ## 举例说明
    [root@web01 nginx]# cat www.conf 
    server {
        listen   80;
        server_name  www.bossx.club;
        root  /html/www;
        
        location / {
            index index.html;
            deny  10.4.7.0/24;	#拒绝10.4.7.0 访问
    		allow 10.4.7.1;		#允许10.4.7.1 访问
    }
    

    网站认证访问模块: ngx_http_auth_basic_module

    ## 语法格式
    Syntax:	auth_basic string | off;             --- 是否开启认证功能
    Default:	auth_basic off;
    Context:	http, server, location, limit_except
    Syntax:	auth_basic_user_file file;           --- 定义密码文件信息
    
    ## 举例说明
    [root@web01 nginx]# cat www.conf 
    server{
        listen 80;
        server_name  www.bossx.club;
        root /var/html/www;
        
        location / {
            index index.html;
            auth_basic bossx_auth;						# 开启认证模块		
            auth_basic_user_file conf.d/http.password;	# 指定的密码文件路径
            ##可以使用htpasswd命令生成密码(在httpd-tools软件包中),`htpasswd -c $PATH
        }
    }
    

    Nginx 访问状态监控

    ## 举例说明
    [root@web01 nginx]# cat nginx.conf
    ...
        location /status {
        stub_status on;
        access_log off;
        }
    ...
    

    Nginx 索引功能

    作用:将网站转化为类似ftp的站点,作为共享文件的工具;

    [root@web01 nginx]# cat nginx.conf
    ...
        location /download {
            autoindex on;
        }
    ...
    

    Nginx 目录别名

    作用:将域名后缀的路径设置一个别名,通过多种方式访问;

    #访问 www.bossx.club/dw == www.boosx.club/download 
    [root@web01 nginx]# cat nginx.conf
    ...
        location /dw {
             alias /var/html/download;
        }
    ...
    
  • 相关阅读:
    读书计划(2020年秋)
    Hbase 常用Shell命令
    假期第三周总结
    语义分析
    虚拟机安装
    掌握需求过程读后感
    第八周总结
    SLR1分析
    第七周总结
    需求工程阅读笔记(三)
  • 原文地址:https://www.cnblogs.com/lpcsf/p/12860269.html
Copyright © 2020-2023  润新知