• nginx基本原理与配置


    一、选用Nginx的理由

    1)支持高并发连接

    得益于Nginx使用最新的epoll(Linux 2.6内核)和 kqueue(FreeBSD)网络I/O模型,官方测试Nginx可最高支持5万的并发连接,在实际的生产环境中,可实际支持2~4万的并发连接数。

    2)内存消耗低

    3)成本低

    4)配置简单

    5)支持Rewrite重写规则,能够根据域名、URL的不同将http请求分发到不同的后端服务器群组。

    6)内置健康检查功能,如果Nginx proxy后端的某台服务器宕机了,不会影响前端访问

    7)节省带宽,支持GZIP压缩,可添加浏览器本地缓存的header

    8)稳定性高,用于反向代理,宕机概率极低

    9)支持热部署,启动容易,几乎可以7x24小时不间断运行,且支持不间断服务的情况下,对软件进行升级。

    二、Nginx的启停

    运行环境:max os, Nginx通过brew install安装,路径为:/usr/local/Cellar/nginx/1.10.2_1/

    1、启动

    nginx [-c path]

    -c 选项可用来指定配置文件路径, 如 nginx -c /usr/local/etc/nginx.conf

    2、停止

    一般通过发送系统信号给Nginx主进程的方式来停止。可通过 ps -ef | grep nginx查看进程号

    $ ps -ef | grep nginx
      501  3709     1   0  3:10下午 ??         0:00.00 nginx: master process nginx
      501  3710  3709   0  3:10下午 ??         0:00.00 nginx: worker process
      501  3711  3709   0  3:10下午 ??         0:00.01 nginx: worker process
      501  3712  3709   0  3:10下午 ??         0:00.01 nginx: worker process
      501  3713  3709   0  3:10下午 ??         0:00.01 nginx: worker process
      501  3724   686   0  3:11下午 ttys001    0:00.00 grep nginx

    如上所示,3709为主进程,3710 ~ 3713为工作子进程。nginx.conf配置文件中指定了pid文件的存放路径, 如/usr/local/var/run/nginx.pid, 其中存放了当前Nginx运行的主进程号,可通过该进程号,来平滑停止Nginx服务。

    1)  平滑停止

    $ kill -QUIT 3709
    $ ps -ef | grep nginx
      501  3989   686   0  3:49下午 ttys001    0:00.00 grep nginx

    # 或者,通过pid文件获取主进程号来停止
    $ kill -QUIT `cat /usr/local/var/run/nginx.pid`

    2)快速停止

    $ kill -TERM 3709
    $ ps -ef | grep nginx
      501  3989   686   0  3:49下午 ttys001    0:00.00 grep nginx
    
    # 或者,通过pid文件获取主进程号来停止
    $ kill -TERM `cat /usr/local/var/run/nginx.pid`
    
    # 另一种方式
    $ kill -INT 3709
    $ ps -ef | grep nginx
      501  3989   686   0  3:49下午 ttys001    0:00.00 grep nginx
    
    # 或者,通过pid文件获取主进程号来停止
    $ kill -INT `cat /usr/local/var/run/nginx.pid`

    3)强制停止

    $ pkill -9 nginx
    $ ps -ef | grep nginx
      501  4081   686   0  3:57下午 ttys001    0:00.00 grep nginx

    3、平滑重启

    如果修改了配置文件nginx.conf,想重启Nginx,需要发送信号给Nginx主进程来实现。

    $ ps -ef | grep nginx
      501  4188     1   0  4:13下午 ??         0:00.00 nginx: master process nginx
      501  4189  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4190  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4191  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4192  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4195   686   0  4:13下午 ttys001    0:00.00 grep nginx
    
    $ kill -HUP `cat /usr/local/var/run/nginx.pid`
    
    $ ps -ef | grep nginx
      501  4188     1   0  4:13下午 ??         0:00.01 nginx: master process nginx
      501  4201  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4202  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4203  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4204  4188   0  4:13下午 ??         0:00.00 nginx: worker process
      501  4206   686   0  4:13下午 ttys001    0:00.00 grep nginx

    可以看出,重启的只是工作进程,当接收到HUP信号后,当前工作进程会关闭监听套接字,并继续为当前连接的客户端服务,当所有客户端服务完成后,旧的工作进程关闭。

    4、其他信号

    USR1: 重新打开日志文件,切割日志文件时有用

    USR2: 平滑升级可执行程序

    WINCTH: 从容关闭工作进程

    $ kill -WINCH `cat /usr/local/var/run/nginx.pid`
    $ ps -ef | grep nginx
      501  4188     1   0  4:13下午 ??         0:00.01 nginx: master process nginx
      501  4258   686   0  4:21下午 ttys001    0:00.00 grep nginx

    三、Nginx基本配置

    1、虚拟主机配置

    虚拟主机提供了同一台服务器,同一个Nginx进程上运行多个网站的功能,Nginx支持配置多种类型的虚拟主机: 基于IP的, 基于域名的, 基于端口号的。

    在nginx.conf中,一台简化的虚拟主机配置如下:

    http {
    
        server {
            listen       8080;
            server_name  localhost;
            
            access_log  logs/host.access.log  main;
            
            location / {
                root   html;
                index  index.html index.htm;
              }
        }
    }

    基于IP的虚拟主机配置

    通过ifconfig和route命令为当前服务器主机添加IP别名,如下:

    $ ifconfig eth0:1 192.168.1.102 broadcast 192.168.1.255 netmask 255.255.255.0 up
    
    $ route add -host 192.168.1.102 dev eth0:1

    接下来分别对192.168.1.101和192.168.1.102配置虚拟主机

    http {
        # 第一个虚拟主机
        server {
            # 监听的IP和端口
            listen      192.168.1.101:8080;
            # 主机名称
            server_name  192.168.1.101;
            # 访问日志文件存放路径
            access_log  logs/host.access.log  main;
            
            location / {
                # html网页文件存放目录
                root   /data0/htmldoc/server1;
                # 默认首页文件,从左至右,找不到index.html,就查找index.htm,都查找不到则报错
                index  index.html index.htm;
              }
        }
        
        # 第二个虚拟主机
        server {
            listen       192.168.1.102:8080;
            server_name  192.168.1.102;
            
            access_log  logs/host.access.log  main;
            
            location / {
                root   /data0/htmldoc/server2;
                index  index.html index.htm;
              }
        }
    }

    基于域名的虚拟主机配置

    配置你的DNS服务器,将你的IP映射到不同的域名即可实现,可以有效解决IP地址不足的问题。

    http {
        # 第一个虚拟主机
        server {
            # 监听的IP和端口
            listen      8080;
            # 主机名称
            server_name  aaa.ssl.com;
            # 访问日志文件存放路径
            access_log  logs/host.access.log  main;
            
            location / {
                # html网页文件存放目录
                root   /data0/htmldoc/server1;
                # 默认首页文件,从左至右,找不到index.html,就查找index.htm,都查找不到则报错
                index  index.html index.htm;
              }
        }
        
        # 第二个虚拟主机
        server {
            listen       8080;
            server_name  bbb.ssl.com;
            
            access_log  logs/host.access.log  main;
            
            location / {
                root   /data0/htmldoc/server2;
                index  index.html index.htm;
              }
        }
    }

    2、日志文件配置与切割

    1)配置log_format日志格式 log_format name format [format..]

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';

    name用来指定日志格式的名称,保持唯一性。

    $remote_addr用于记录远程客户端IP地址, 还有另外一个变量$http_x_forwarded_for用来记录用户的X-Forwarded-For IP地址。

    2)配置日志文件存放路径

    access_log path [format [ buffer=size | off ]]

    path: 存放路径

    format: 日志格式名称,log_format中设置的name

    buffer: 内存缓冲区大小

    off: 表示关闭日志记录

    如: access_log /data0/logs/log1 combined buffer=32k;

    3) 日志切割

    a) 重命名原日志文件,然后向Nginx主进程发送USR1信号,让Nginx重新生成一个新的日志文件。

    mv /data0/logs/access.log /data0/logs/20170716.log

    kill -USR1 `cat /usr/local/var/run/nginx.pid`

    b)按天定时切割日志文件的方式

    # !/bin/bash
    # 这个脚本须在每天的00:00运行, 保存为cut_nginx.log.sh
    
    # Nginx日志文件的存放路径
    logs_path="/data0/logs"
    
    mkdir -p ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/
    
    mv ${logs_path}access.log ${logs_path}$(date -d "yesterday"+"%Y")/$(date -d "yesterday"+"%m")/access_$(date -d "yesterday"+"%Y%m%d").log
    kill -USR1 `cat /usr/local/var/nginx/nginx.pid`

    配置crontab每天凌晨00:00定时执行该脚本

    crontab -e

    输入:

    00 00 * * * /bin/bash /usr/local/var/nginx/sbin/cut_nginx.log.sh

    3、压缩配置

    gzip压缩后,页面大小可变为原来的30%甚至更小,这样用户浏览页面时速度会快很多。

    4、自动列目录

    location / {
                # html网页文件存放目录
                root   /Users/qwe/Desktop;
                # 自动列出目录
                autoindex on;
              }

    5、浏览器本地缓存设置

    浏览器将用户最近请求过的页面存储到本地磁盘,当用户再次访问时,可以直接从本地磁盘显示文档,加速页面浏览速度,节约网络资源。

    浏览器缓存通过expires指令输出header头来实现 。

    语法: expires [time | epoch | max | off]

    默认值: expires off

    作用域:http, server, location

    用途: 使用本指令可以控制HTTP应答中的“Expires”和“Cache-Control”

    epoch 指定 Expires值为 1 January,1970,00:00:01 GMT

    max 指定 Expires值为 31 December,2037 23:59:59 GMT, Cache-Control值为10年

    -1 指定"Expires"值为服务器当前时间,即永远过期。

    Cache-Control的值由你指定的时间来决定, 负数表示no-cache, 正数或零为你指定时间的秒数。

    ”off“表示不修改“Expires”和”Cache-Control“的值。

    一般对常见格式的图片、Flash文件缓存30天,对js、css文件缓存1小时。如下:

    location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$ {
             expires 30d;
     }
    
    location ~ .*.(js|css)${
             expires 1h;
     }
  • 相关阅读:
    大话设计模式笔记(二十)の命令模式
    大话设计模式笔记(十九)の桥接模式
    大话设计模式笔记(十八)の单例模式
    大话设计模式笔记(十七)の迭代器模式
    反射的使用及其使用场景
    linq的简单使用
    XML的简单使用
    log4net的简单使用
    token
    axios在vue中的简单封装及应用
  • 原文地址:https://www.cnblogs.com/java-wgm/p/7160530.html
Copyright © 2020-2023  润新知