Nginx是一个高性能的HTTP和反向代理web服务器,记录一下常用的nginx配置
一.反向代理
server {
listen port;
server_name domain
location / {
proxy_pass http://ip:port;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
二.静态文件代理
server{
listen port;
server_name domain
location /path {
root /dir;
index index.html;
}
}
解决刷新出现404情况:
location /path {
root /dir;
index index.html;
try_files $uri $uri/ /path/index.html
}
三.缓存
proxy_cache_path /var/cache/nginx/cache levels=1:2 keys_zone=cachename:300m inactive=5h max_size=10g;
server {
listen port;
server_name domain;
location ~* ^.+\.(css|js|ico|gif|jpg|jpeg|png)$ {
#关闭日志
log_not_found off;
access_log off;
#浏览器缓存时间7天
expires 7d;
proxy_pass http://localhost:56991;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_cache cachename;
proxy_ignore_headers Cache-Control;
#缓存过期管理
proxy_cache_valid 200 302 5h;
proxy_cache_valid 404 10m;
proxy_cache_valid any 1h;
proxy_cache_use_stale error timeout invalid_header updating http_500 http_502 http_503 http_504;
add_header X-Cache-Status $upstream_cache_status;
}
}
四.负载均衡
upstream backserver{
##ip_hash;fair;url_hash; ##ip_hash算法不支持backup、weight设置。默认权重为1。
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:7070 backup;
server 127.0.0.1:6060;
server 127.0.0.1:5050 max_fails=2 fail_timeout=10s;
}
分配规则:
1.默认轮询
2.weight 3; 加权
3.ip_hash; 根据ip的hash分配服务
4.url_hash; 根据url的hash分配服务
5.fair; 服务器的响应时间来分配请求
6.down; server不参与负载
7.backup; 非backup server停止时参与请求
8.max_fails; 请求失败次数(默认为1),返回proxy_next_upstream定义
9.fail_timeout; max_fails次失败后,暂停的时间
server {
listen port;
server_name domain
location / {
proxy_pass http://ip:port;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header REMOTE-HOST $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
五.限速限流
##并发控制
limit_conn_zone $binary_remote_addr zone=conname:10m;
##限流控制
limit_req_zone $binary_remote_addr zone=reqname:10m rate=10r/s;
##每秒10个请求(同一IP)
limit_req_zone $binary_remote_addr $uri zone=reqname:10m rate=10r/s;
##每秒10个请求,(同一IP访问相同uri)
limit_req_zone $binary_remote_addr $request_uri zone=reqname:10m rate=10r/s;
##每秒10个请求(同一IP访问相同uri,带客户端请求参数)
server {
location / {
proxy_pass http://ip:port;
#limit
limit_conn conname 3; ##一个会话只能进行3个连接
limit_req zone=reqname burst=20 nodelay; ##每个IP一秒钟只处理10个请求,burst:排队大小,nodelay:不限制单个请求时间
}
}
##限制传输速度
location /download {
limit_rate 128k;
}
#如果想设置用户下载文件的前10m大小时不限速,大于10m后再以128kb/s限速可以增加以下配内容,修改nginx.conf文件
location /download {
limit_rate_after 10m;
limit_rate 128k;
}
六.配置https代理
1.申请SSL证书
阿里云等云产品途径申请一年免费的
Let's Encrypt 使用生成证书
2.上传证书到服务器
/../nginx/cert
3.配置nginx
server {
listen 443;
server_name domain;
ssl on;
ssl_certificate 证书;
ssl_certificate_key 密钥;
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location / {
}
}
常见问题:
报错[emerg] the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:69解决
1.安装OpenSSL
yum -y install openssl openssl-devel
2.在nginx安装目录下执行
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
3.运行命令
make
4.然后备份原有已安装好的nginx
cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
5.关闭nginx
./nginx -s stop
6.将刚刚编译好的nginx覆盖掉原有的nginx(这个时候nginx要停止状态)
cp ./objs/nginx /usr/local/nginx/sbin/
7.通过命令查看是否已经加入成功
/usr/local/nginx/sbin/nginx -V
七.其他
1.http请求包体的最大值:
client_max_body_size 200m;
2.压缩
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
#gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain application/x-javascript application/javascript text/css text/xml application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png application/json;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
3.格式:location ??? {}
优先级:
a. = /error.html ##完整匹配
b. ^~ /images/ ##开头等于
c. ~* .(gif|jpg|jpeg|png|bmp|swf)$ ##不区分大小的正则
d. /static/ ##开头等于,优先级比第二种低
e. /
4.强转:
rewrite ^(.*) https://$server_name$1 permanent;
5.重启nginx
./nginx -s reload
或者:
./nginx -s quit
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
6.正则匹配
server {
listen 80;
server_name *.delpast.com;
set $head "test";
if ($http_host ~* "^(.*)\.delpast\.com$") {
set $head $1;
}
location / {
if ( $head = 'bushu' ) {
proxy_pass http://localhost:9050;
}
}
}
7.隐藏版本号
在http{} 添加
server_tokens off;
注意:本文归作者所有,未经作者允许,不得转载