Nginx常用整理

Nginx文档

安装Nginx

环境:VBox,Centos7.3
Nginx下载地址
选择文本即可
将安装包上传到虚拟机之后,进行安装环境

# 安装Gcc环境
yum install gcc-c++
# 安装PCRE库,用于解析正则表达式
yum install -y pcre pcre-devel
# zlib压缩和解压缩依赖
yum install -y zlib zlib-devel
# SSL安全的加密的套接字协议层,用于HTTP安全传输
yum install -y openssl openssl-devel
# 解压安装包
tar -zxvf nginx-1.16.1.tar.gz
# 创建临时目录进行编译
mkdir /var/temp/nginx -p

创建makefile文件,先cd到nginx解压出来的目录,因为目录下有个configure文件

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi
--with-http_ssl_module
命令说明
–prefix指定nginx安装目录
–pid-path指向nginx的pid
–lock-path锁定安装文件,防止被恶意篡改或误操作
–error-log错误日志
–http-log-pathhttp日志
–with-http_gzip_static_module启用gzip模块,在线实时压缩输出数据流
–http-client-body-temp-path设定客户端请求的临时目录
–http-proxy-temp-path设定http代理临时目录
–http-fastcgi-temp-path设定fastcgi临时目录
–http-uwsgi-temp-path设定uwsgi临时目录
–http-scgi-temp-path设定scgi临时目录
–with-http_ssl_moduleSSL

执行完上面的命令之后,nginx目录下就有了makeFile文件夹

# make编译
make
# 安装
make install

查看nginx有没有安装完毕
可以cd到安装的目录下

whereis nginx
cd /usr/local/nginx/


启动nginx

cd sbin
# 启动nginx
./nginx
# 停止nginx
./nginx -s stop
# 重载nginx
./nginx -s reload
# 优雅关闭nginx,如果还有请求时,会等请求完毕再关闭
./nginx -s quit

添加系统服务

vim /lib/systemd/system/nginx.service
# 添加如下内容
[Unit]
Description=nginx 
After=network.target 
   
[Service] 
Type=forking 
# 根据实际安装路径
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true 
   
[Install] 
WantedBy=multi-user.target
# 开机自动启动
systemctl enable nginx.service
# 启动nginx
systemctl start nginx.service
#结束nginx
systemctl stop nginx.service
# 重启nginx
systemctl restart nginx.service

添加到系统环境变量

vim /etc/profile

# 写入如何内容
# 根据实际安装路径
export NGINX_HOME=/usr/local/nginx
export PATH=${NGINX_HOME}/sbin:${PATH}

source /etc/profile
nginx -v

Nginx进程

Nginx中有两个进程:master(主进程)worker(工作进程),master只有一个,worker可以有多个(在nginx.conf中进行配置)

修改worker的进程为2个
修改worker进程

根据字面意思就可以理解,master是分配任务到worker的,所有的处理都是由worker去处理的,比如对于指令的下发,master只是起到分发的作用,worker是具体干活的那个。
每个工作进程都是相互独立的,互不影响,如果有一个工作进程挂了,master会再启用一个新的工作进程来工作。

Worker抢占机制

一个master,三个worker作为条件,当一个client发起请求,那么哪个worker会处理请求呢,这里是使用了nginx的抢占机制。
当一个client发起请求,这时候会有一个互斥锁(accept_mutex),哪个worker抢到了这个锁,那么就是哪个worker去处理这个请求。

Nginx事件处理

Nginx本身是一个异步非阻塞的,当一个master,一个worker时,有多个请求时,比如client1阻塞时,是不影响处理client2的请求的。这也是nginx在linux环境下使用了一种模型—— use epoll,不同的操作系统需要进行不同的配置。
worker也是跟服务器本身的CPU相关的,配置越高,处理的请求就越多。

nginx.conf配置

配置结构

# 表示的是worker在运行的时候,是由系统的哪个用户执行的。默认是nobody,如果使用root,那么对于一些操作的权限就变大了。
user nobody;
# worker进程的数量,
worker_processes  2;

# nginx默认日志存放路径
error_log  logs/error.log;
# nginx的日志级别(从低到高):debug info notice warn error crit
error_log  logs/error.log  notice;
error_log  logs/error.log  info;

# nginx的进程号存放路径
#pid        logs/nginx.pid;

events {
    # linux下可以不写,默认就是use epoll。根据不同的操作系统可以进行修改
    use epoll;
    # 每个worker最大的连接数,可以根据实际配置进行调整
    worker_connections  1024;
}

http {
	# include是导入外部文件,mime.types文件包含了很多的类型(Html,css等,可以在自己nginx文件目录下的conf文件内查看)
    include       mime.types;
    # 默认type类型
    default_type  application/octet-stream;

	# 可以跟 access_log 配置进行一起使用,主要的作用是格式化nginx请求的日志
    #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;
	# 当数据包累计到一定的大小之后再发送,需要跟sendfile配合使用,只有sendfile开启,才会起到一定的效果
    #tcp_nopush     on;

	# 客户端连接服务器的超时时间,单位秒
    #keepalive_timeout  0;
    keepalive_timeout  65;

	# 压缩,如html、css、js体积会压缩,这样传输就加快(压缩会消耗服务器性能)
    #gzip  on;

server {
		# 监听端口号
        listen       80;
        # IP或域名,对外访问
        server_name  localhost;
		
		# /表示默认访问根路径
        location / {
            root   html;
            index  index.html index.htm;
        }
		# 发生指定的错误的时候,展示50x.html这个页面
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

切割日志

手动

脚本代码

#!/bin/bash
LOG_PATH="/var/log/nginx/"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/access.log ${LOG_PATH}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
#向Nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`
定时
# 安装定时任务
yum install crontabs
# 查看当前定时任务
crontab -l
# 编辑并添加新的定时任务
crontab -e
*/1 * * * * /usr/local/nginx/sbin/cut_log.sh
# 重启定时任务
service crond restart
# 启动定时任务
service crond start
# 关闭定时任务
service crond stop
# 重新载入定时任务配置
service crond reload

使用Nginx配置访问静态资源

server {
        listen       81;
        server_name  localhost;

        location / {
            root   /home/dist;
            index  index.html;
        }

		# 该种配置就是将 /resources 拼接到/home中去
        location /resources {
            root /home;
        }

		# 该种配置就是将 /res 替换为 /home/resources访问
        location /res {
            alias /home/resources;
        }
    }



使用Gzip压缩

gzip可以帮助压缩文件,但是压缩的前提会消耗CPU的开销,但是带宽会得到提升。

    # 开启gzip
    gzip  on;
    # 小于1个字节就不压缩
    gzip_min_length 1;
    # 压缩文件时使用的缓存空间的大小,默认 128
    gzip_buffers 4 16k;
    # 压缩的级别,值越大,文件越大,压缩就越多,越消耗CPU
    gzip_comp_level 3;
    # 定义压缩文件的类型
    gzip_types test/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
    # 跟 Squid 等缓存服务有关,on 的话会在 Header 里增加 "Vary:Accept-Encoding"
    gzip_vary off;
    # IE6 对 Gzip 不怎么友好,不给它 Gzip 了
	gzip_disable "MSIE [1-6]\.";

开启gzip前
开启gzip前
开启gzip后
开启gzip后

localtion匹配规则

精准匹配
    server {
        listen       82;
        server_name  localhost;

        # 精确匹配,如果还存在其他的目录是匹配不了的,只能匹配/下的 
        location = / {
            root   /home/dist;
            index  index.html;
        }

        location = /resources/icon.png {
            root   /home;
            index  index.html;
        }
    }

设置了上面的访问规则,就只能访问规则的路径,访问其他的就会404。

正则表达式
server {
        listen       83;
        server_name  localhost;

        # 正则表达式。*表示不区分大小写
        # 会根据访问的路径自定去/home路径下进行映射
        location ~* \.(gif|png|jpg|jpeg|bmp) {
            root   /home;
        }
    }

前缀匹配
server {
        listen       85;
        server_name  localhost;

        # ^~ 以某个字符路径开头请求
        # 只能请求/resources的资源
        location ^~ /resources {
            root   /home;
        }
    }

Nginx配置跨域

server {
        listen       86;
        server_name  localhost;

        # 允许跨域请求的域,*代表所有
        add_header 'Access-Control-Allow-Origin' *;
        # 允许带上cookie请求
        add_header 'Access-Control-Allow-Credentials' 'true';
        # 允许请求的方法,比如GET、POST、PUT、DELETE
        add_header 'Access-Control-Allow-Methods' *;
        # 允许请求的header
        add_header 'Access-Control-Allow-Headers' *;

        location / {
            root   /home/dist;
            index  index.html;
        }
    }

防盗链配置

主要用于静态资源防止在别的站点直接引用

server {
        listen       87;
        server_name  localhost;

        # 对源站点验证,如果不是*.cxqnb.cn的站点引入的,就会返回404
        valid_referers *.cxqnb.cn;
        # 非法引入会进行下面的判断
        if ($invalid_referer) {
			return 404;
		}

        location / {
            root   /home/dist;
            index  index.html;
        }
    }

四层、七层、DNS负载均衡

四层

主要基于TCP、UDP

  • F5硬负载均衡(商业级)
  • LVS四层负载均衡(基于Linux内核的负载均衡)
  • Haproxy四层负载均衡
  • Nginx四层负载均衡(1.9版本之后)
七层

基于URL、IP的负载均衡,主要是HTTP

  • Nginx七层负载均衡
  • Haproxy七层负载均衡
  • apache七层负载均衡(性能不如Nginx)
DNS

根据DNS返回的IP去获取当前请求所对应的地理位置,根据地理位置负载均衡就近的机房

配置负载均衡

基本配置

默认是轮询的方式

upstream index-cluster {
		# 事先准备三台虚拟机供nginx可以负载均衡
        server 192.168.1.6:81;
        server 192.168.1.7:81;
        server 192.168.1.8:81;
   }

server {
        listen       88;
        server_name  localhost;

        location / {
            proxy_pass http://index-cluster;
        }
    }

访问结果:


加权轮询

添加weight值,默认都是1

upstream index-cluster {
        server 192.168.1.6:81 weight=1;
        server 192.168.1.7:81 weight=3;
        server 192.168.1.8:81 weight=5;
   }

upstream配置

max_conns

如下配置最多支持6个用户同时访问(最大连接数),只要前面的请求没有释放,后面的请求就会请求失败,只能等前面的释放了之后才能正常访问。
如果使用了共享内存(配置了多个worker),这个配置会在每个worker中生效。
nginx-1.11.5版本之后才生效

upstream index-cluster {
        server 192.168.1.6:81 max_conns=2;
        server 192.168.1.7:81 max_conns=2;
        server 192.168.1.8:81 max_conns=2;
   }
slow_start

他会在配置的时间之后,从权重0慢慢升级到指定的权重。
该项配置只适用 权重策略的负载均衡,对于Hash、随机负载均衡是不适用的

该配置只适用于商业版的nginx
该配置只适用于集群,否则失效

upstream index-cluster {
        server 192.168.1.6:81 weight=8 slow_start=60s;
        server 192.168.1.7:81 weight=3;
        server 192.168.1.8:81 weight=2 ;
   }
down

表示这台服务器不能被访问到

upstream index-cluster {
        server 192.168.1.6:81 down;
        server 192.168.1.7:81 weight=3;
        server 192.168.1.8:81 weight=2 ;
   }
backup

表示如果有某台服务挂掉了,这台backup才会启用,才会被用户访问到,否则是一直不会被访问到这台机器的。
按照如下配置,只有当7、8两台都挂掉之后,才会访问到6这台。

upstream index-cluster {
        server 192.168.1.6:81 backup;
        server 192.168.1.7:81 weight=3;
        server 192.168.1.8:81 weight=2 ;
   }

该项配置只适用 权重策略的负载均衡,对于Hash、IP_Hash、随机负载均衡是不适用的

max_fails

max_fails 需要和 fail_timeout配合使用
最大的失败次数,当达到了这个次数,那么这台服务器就不能被访问了
该配置只适用于集群,否则失效
默认值为1

fail_timeout

max_fails 需要和 fail_timeout配合使用
fail_timeout只适用于集群,否则失效

默认值为10秒

max_fails=2,fail_timeout=60,那么就是说在60秒以内某个请求到达了这台服务器,失败了2次,那么就会认为这台服务器宕机了,随后还会继续等待60秒,在这60秒之内就不会有请求发送到这台宕机的服务器上。等60秒之后又新的请求过来就会尝试到这台宕机的服务器上,循环上面的操作。

upstream index-cluster {
        server 192.168.1.6:81 max_fails=2 fail_timeout=60s;
        server 192.168.1.7:81 weight=3;
        server 192.168.1.8:81 weight=2 ;
   }
keepalive

可以提高吞吐率,也就是把之前请求完毕就断开连接变成了一个长连接,可以节省构建、断开连接时候的开销。
proxy_http_version默认是1.0,是不存在长连接的
Connection “” 意思就是清楚connection header里的一些信息

upstream index-cluster {
        server 192.168.1.6:81;
        keepalive 32;
   }

server {
        listen       88;
        server_name  localhost;

        location / {
                proxy_pass http://index-cluster;
                proxy_http_version 1.1;
                proxy_set_header Connection "";
        }
    }
ip_hash

hash(ip) % node_counts(节点数量) = index(访问该下标的服务器,下标从0开始)
nginx实际在hash的时候其实是在计算192.168.1的hash值
当集群中的某台服务器宕机之后,不能直接将这台服务器配置删除,而是添加 down配置标记
在版本1.3.1和1.2.2之前,不可能使用ip_hash负载均衡方法为服务器指定权重。

upstream index-cluster {
		ip_hash;
        server 192.168.1.6:81;
        server 192.168.1.7:81;
        server 192.168.1.8:81;
   }

带来的问题:
不管是服务器的增加还是减少,都会让请求查询计算hash值来请求新的服务器,这样会导致,用户原先的会话都会丢失,服务器内的缓存也会相应请求不到,这样的请求就会比原先更耗时。

一致性hash算法

在一个0-((2^32)-1)的闭合空间中
采用顺时针就近原则: 让用户访问顺时针方向上最近的服务器节点
当服务节点宕机时,原先访问宕机节点的用户就会顺时针往下去访问就近的服务器,那么其他用户的访问是不受影响的,缓存也不会丢失。
当服务器增加时候同宕机一个原理。

url_hash

hash(url) % node_counts(节点数量) = index

upstream index-cluster {
		hash $request_uri;
        server 192.168.1.6:81;
        server 192.168.1.7:81;
        server 192.168.1.8:81;
   }
least_conn

根据最少连接数的节点去进行请求

upstream yyy {
	hash $request_uri;
	least_conn;

	server 192.168.1.6:81;
    server 192.168.1.7:81;
    server 192.168.1.8:81;
}

缓存

静态资源缓存到浏览器
上游缓存到nginx

server {
        listen       81;
        server_name  localhost;

        location / {
            root   /home/dist;
            index  index.html;
        }

        location /res {
            alias /home/resources;
            # 设置缓存过期时间10秒
            expires 10s;
        }
    }

expires 10s;表示10秒之后过期
expires @22h30m;表示晚上10:30过期
expires -1h;距离现在1个小时之前过期
expires epoch;缓存不生效
expires off;使用浏览器默认
expires max;永不过期(315360000)

反向代理缓存
upstream index-cluster {
        server 192.168.1.6:81 max_fails=2 fail_timeout=60s;
        server 192.168.1.7:81 weight=3;
        server 192.168.1.8:81 weight=2 ;
   }

# proxy_cache_path 设置缓存保存的目录
# keys_zone 共享内存以及占用空间的大小
# max_size 设置缓存大小
# inactive 超过此时间,则缓存自动清理
# use_temp_path 关闭临时目录,会有nginx的性能影响
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=seacache:5m max_size=1g inactive=8h use_temp_path=off;

server {
        listen       88;
        server_name  localhost;

        # 开启并使用缓存,名称用的是keys_zone所配置的
        proxy_cache seacache;
        # 针对状态码设置缓存过期时间
        proxy_cache_valid 200 304 8h;

        location / {
                proxy_pass http://index-cluster;
        }
    }

基于 IP 的访问控制(黑名单)

基于 ngx_http_access_module 模块

server {
        listen       81;
        server_name  localhost;

        location / {
            root   /home/dist;
            index  index.html;
            # 禁止某个 IP 访问
		    deny  192.168.1.1;
		    # 允许 192.168.1 网段中的所有 IP 访问
		    allow 192.168.1.0/24;
		    # 除上方允许 IP 网段外,禁止所有 IP 访问
		    deny  all;
        }
    }

使用 grep 删除注释与空行

grep -Ev ‘#|^$’ conf/nginx.conf

配置禁止通过IP访问

HTTP
 server {
    listen 80 default_server;
    listen [::]:80 default_server;
    server_name _;
    return 400;
}
HTTPS
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;
    ssl_certificate xxx.pem;
    ssl_certificate_key xxx.key;
    server_name _;
    return 400;
}
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值