橘子Blog Loading

Nginx

Nginx常用变量

变量名称 含义
$uri 当前请求的uri,不带参数
$request_uri 请求的uri,带完整参数
$host 请求头中的host
$hostname nginx server_name名称
$remote_addr 客户端ip
$binary_remote_addr 二进制的客户端ip
$remote_port 客户端端口
$remote_user 使用用户认证时客户端
$request_filename 请求映射的本地文件的路径
$request_method 用户请求方法
$server_addr 服务器地址
$server_protocol 响应的协议
$scheme 约束(http)
$http_HEADER 匹配请求头中指定的header
$http_host 请求头中的host
$document_root 请求所映射的root配置

Nginx站点目录下载

server {

		listen 80;  # 监听端口

		server_name download.juzi.com;  # 主机名

		location /download {

			alias    /root/download;   # 别名   如果请求的路径匹配download,那么会直接到/root/download路径下

			autoindex  on;    # 允许开放目录			

			autoindex_exact_size off;         #  不显示文件的具体大小(byte)

			autoindex_local_time on;   # 显示文件在服务器的时间

		}

}

Nginx请求限制

limit_req_zone $binary_remote_addr zone=limit_req:10m rate=10r/s;

server {

	listen 80;

	server_name www.juzi.com;

	location / {

		root /root;

		limit_req zone=limit_req burst=3 nodelay;  # burst 突发流量 nodelay 立即响应	

	}

}

Nginx用户访问控制

先通过httpd工具生成用户认证文件 user_auth

htpasswd -c user_auth username [回车]

password: 密码

server {

	listen 80;

	server_name www.juzi.com;

	location /auth {

		root /root;

		auth_basic on;

		auth_basic_user_file user_auth;
	}

}

Nginx基于IP访问控制

server {

	listen 80;

	server_name www.juzi.com;	

	location /allow {

		allow 192.168.25.131;  # 允许该ip进行访问

		# allow all                       # 允许所有ip访问 

		deny 192.168.25.1;       # 禁止该ip访问;

		# deny all                        # 禁止所有ip方法

	}

}

Nginx状态监控

server {

	listen 80;

	server_name www.juzi.com;

	location /status {

		stub_status on;  

		access_log off; # 关闭日志

	}	

}

Nginx客户端缓存

server {

	# server_name  ... ;    listen 80;

	location ~* html$ {

		root /root/html;

		expires  45s; 1m 1h 3d 

	} 

}

Nginx静态资源压缩

server {

	# listen 80 ; server_name www.juzi.com;

	location ~* (\.img|\.png|\.jpg)$ {

		root /root/img;

		gzip on;      # 开启压缩 实时压缩

		gzip_http_version 1.1;    # 压缩协议

		gzip_comp_level 2;          # 1 - 9 

		# gzip_static on                # 将以压缩好的文件相应给客户端

		gzip_types text/plain application/json application/x-javascript application/css   application/xml application/xml+rss text/javascript application/x-httpd-php image/jpeg image/gif  image/png;  # 可以压缩的文件类型			

	}

}

Nginx静态资源跨域访问

server {

	# server_name origin.juzi.com; listen 80;

	location /html {

		root /root/html;

		add_header Access-Control-Allow-Origin www.juzi.com (允许的域名);

		add_header Access-Control-Allow-Methods GET,PUT,POST,DELETE,OPTIONS; # 允许该域名请求方式

	}

}

Nginx静态资源防盗链

server {

	# server_name image.juzi.com; listen 80;

	location ~* (\.png|\.jpg|\.png) {

		valid_referers none blocked www.juzi.com (允许的域名);

		if ($invalid_referer) {
			return 403;
		}

		root /root/img;  

	}

}

Nginx正向代理

server {

	# server_name origin.juzi.com; listen 80;

	resolver 235.5.5.5;  # DNS

	location / {

		proxy_pass http://$http_host$request_uri;

		proxy_set_header Host $http_host;     

		proxy_set_header X-Real-IP $remote_addr; 

		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for

	}

}

Nginx反向代理

server {

	# listen 80; server_name www.juzi.com;

	location / {

		proxy_pass http://192.168.25.131$request_uri;

		proxy_redirect default;

		proxy_set_header Host $http_host;

		proxy_set_header X-Real-IP $remote_addr;

		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		proxy_connect_timeout 30;

		proxy_send_timeout 60s;

		proxy_read_timeout 60s;

		proxy_buffer_size 32k;

		proxy_buffering on;

		proxy_buffers 4 128k;

		proxy_busy_buffers_size 256k;

		proxy_max_temp_file_size 256k;

	}

}

负载均衡: 负载均衡分为GLSB全局负载均衡 LSB负载均衡

Nginx属于 SLB

SLB负载均衡又分为两种 4层负载均衡 7层负载均衡

Nginx属于 7层负载均衡 SLB

Nginx 7层 负载均衡

# 虚拟服务池

upstream server_poll{ 

	server 192.168.25.131:8880;  # backup

	server 192.168.25.131:8881 weight=5;

	server 192.268.25.131:8882 down;

}

server {

	# listen 80; server_name www.juzi.com;

	location / {

		proxy_pass http:// server_poll;

	        # 代理参数

		proxy_redirect default;

		proxy_set_header Host $http_host;

		proxy_set_header X-Real-IP $remote_addr;

		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

		proxy_connect_timeout 30;

		proxy_send_timeout 60s;

		proxy_read_timeout 60s;

		proxy_buffer_size 32k;

		proxy_buffering on;

		proxy_buffers 4 128k;

		proxy_busy_buffers_size 256k;

		proxy_max_temp_file_size 256k;

	}	

}
负载均衡状态配置
参数 概述
backup 备份节点, 当所有节点挂掉才会启用
down 当前server不参与负载均衡
max_fails 允许请求失败的次数
fail_timeout 经过max_fails失败的次数,服务暂停时间
max_conns 限制的最大连接数
Nginx负载均衡算法
调度算法 概述
轮询 将用户的请求轮流分配到每个服务器
weight 加权轮询, 改变用户请求分配到服务器的几率
ip_hash 根据访问的ip的hash结果分配,这样同一ip的请求会固定的访问一个服务器
least_conn 最少连接数, 哪个机器的连接数少就分配到哪台机器上

Nginx 负载均衡 4层代理 TCP

stream {

	upstream mysql_proxy {

		server 127.0.0.1:3306;

		hash $remote_addr consistent;  # 同一ip会固定的访问同一台机器

	}

	server {

		listen 8899;

		proxy_pass mysql_proxy;

		proxy_timeout 6s;  # 超时时间

	}

}

Nginx 代理缓存服务

upstream server_poll {

	server 192.168.25.131:8888; # backup weight=5 down

	server 192.168.25.131:8888;

	server 192.168.25.131:8888;

}

# proxy_path 缓存文件路径 levels=两层目录 keys_zone=命名空间:size max_size=最大存储容量 inactive=超过60分钟没有被访问就删除  use_temp_path=off 临时目录

proxy_cache_path /soft/cache  levels=1:2 keys_zone=cache_zone:10m max_size=5g inactive=60m use_temp_path=off;

server {

	# listen 80; server_name www.juzi.com;

	location / {

		proxy_pass http:// server_poll;

		proxy_cache cache_zone;

		proxy_cache_valid 200 302  10m; # 响应状态码为 200 302都缓存10分钟

		proxy_cache_valid any 1m; # 其他的都缓存一分钟

		add_header Nginx-Cache $upstream_cache_status;  # 添加响应头 Nginx-Cache 查看缓存命中情况

		proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504; # 出现502-504或错误, 会跳过此台服务器器访问下台

		include proxy_params;  # 可以将代理参数放到文件中, 在此处引用即可

	}

}

Nginx Rewrite

rewriet作用: 用于重写url路径, url路径临时跳转,永久跳转

正则表达式
表达式 含义
. 匹配除换行符之外的任意字符
? 重复0次或1次
+ 重复1次或更多次
* 任意次
\d 匹配数字
^ 匹配字符串的开发
$ 匹配字符串的结尾
重复n次, n为数字
重复n次或更多次
[abc] 匹配abc中任意一个字符
[a-z] 匹配a-z小写字母中的任意一个匹配a-z小写字母中的任意一个
rewrite flag
flag 概述
break 停止rewrite检测,寻找对应资源
last 停止rewrite检测,重新发送一个请求
redirect 302 临时重定向
permanent 301 永久重定向
  • break

    server {
    
    	# listen 80; server_name www.juzi.com;
    
    	location /2020-10-28/nginx.html {
    
    		rewrite /(\d{4})-(\d{2,})-(\d{2})/(.*)   /$1/$2/$3/html/$4 break;  # break 会直接根据rewrite重写后的路径去寻找对应的资源
    
    		root /root/html;
    
    	}
    
    }
    
  • redirect

    server {
    
    	listen 80;
    
    	server_name www.juzi.com;
    
    	location / {
    
    		rewrite ^(.*)$ https://www.juzi.com$1 redirect;  # 临时重定向 永久重定向, 客户端会将其路径缓存
    
    	}
    
    }
    
    server {
    
    	listen 443 ssl;
    
    	server_name www.juzi.com;
    
    }
    

  • permanent

    server {
        listen 80;
    
        server_name www.juzi.com;
    
        location / {
    
            rewrite ^(.*)$ https://www.juzi.com$1 redirect;  # 临时重定向  permanent永久重定向, 客户端会将其路径缓存
    
    	}
    }
    
    server {
        listen 443 ssl;
        server_name www.juzi.com;
        
    }
    

Nginx HTTPS

HTPP缺点:

​ 1.传输数据被中间⼈人盗⽤用, 信息泄露
2.数据内容劫持, 篡改

Nginx 配置Https

  1. 检查环境
// openssl必须是1.0.2
[root@Nginx ~]# openssl version
	OpenSSL 1.0.2k-fips 26 Jan 2017
//nginx必须有ssl模块
[root@Nginx ~]# nginx -V
--with-http_ssl_module

[root@Nginx ~]# mkdir /etc/nginx/ssl_key -p
[root@Nginx ~]# cd /etc/nginx/ssl_key
  1. 创建私钥
[root@Nginx ssh_key]# openssl genrsa -idea -out server.key 2048
Generating RSA private key, 2048 bit long modulus
.....+++
//记住配置密码, 我这⾥里里是1234
Enter pass phrase for server.key:
Verifying - Enter pass phrase for server.key:

3.生成使⽤用签名请求证书和私钥生成自签证书

[root@Nginx ssl_key]# openssl req -days 36500 -x509 \
-sha256 -nodes -newkey rsa:2048 -keyout server.key -out server.crt
-- 下面的是配置信息
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:WH
Locality Name (eg, city) [Default City]:WH
Organization Name (eg, company) [Default Company Ltd]:ltd
Organizational Unit Name (eg, section) []:SA
Common Name (eg, your name or your server's hostname) []:juzi
Email Address []:1943622045@qq.com
  1. 配置nginx
[root@Nginx ~]# cat /etc/nginx/conf.d/ssl.conf
server {
    listen 443 ssl;
    server_name www.juzi.com;
    # ssl on;
    index index.html index.htm;
    #ssl_session_cache share:SSL:10m;
    ssl_session_timeout 10m;
    ssl_certificate ssl_key/server.crt;
    ssl_certificate_key ssl_key/server.key;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers on;
    
    location / {
        root /soft/code;
        access_log /logs/ssl.log main;
	}
}

# 配合rewrite 实现http向https强制跳转
server {
    
    listen 80;
    server_name www.juzi.com;
    
    location / {
        rewrite ^(.*)$ https://$server_name$1 break;
    }
    
}

以上是个人私钥配置, 公网https需要到各大云服务器平台购买, 获得私钥文件,只需要修改此处配置即可

    ssl_certificate ssl_key/server.crt;
    ssl_certificate_key ssl_key/server.key;
posted @ 2020-10-30 11:36  juziia  阅读(143)  评论(0编辑  收藏  举报