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
- 检查环境
// 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
- 创建私钥
[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
- 配置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;