文章目录
安装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-path | http日志 |
–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_module | SSL |
执行完上面的命令之后,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个
根据字面意思就可以理解,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后
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;
}