1.文件上传大小

http {
	# 设置nginx文件上传大小限制
	client_max_body_size 200M;
	client_body_buffer_size 50M;
	fastcgi_intercept_errors on;
}

2.http 转 https

方式①:http端口

server {
	rewrite ^(.*)$ https://$host$1 permanent;
}

方式②:同时http、https端口
转载:

server {
        listen       80;
        listen       443 ssl;
        server_name  localhost;

        if ($scheme = http) {
                return 301 https://$host$request_uri;
        }
}

java redirect重定向https跳转http问题,如果https访问nginx通过nginx proxy_pass到http的tomcat服务正常能够访问,但是java redirect就跳转到http,导致报错“400 Bad Request: The plain HTTP request was sent to HTTPS port”。

解决方法:

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
proxy_pass http://172.17.6.114:8082;
proxy_redirect http:// https://;

实现流程是根据nginx的不同执行阶段,来完成Location http到https。

1)proxy_pass执行前,先设置了request head host 为https外网访问的域名+端口
2)proxy_pass执行后,tomcat结果返回response
3)proxy_redirect修改response中的location中的协议http为https外网访问的协议。

注:java redirect重定向主要是通过访问tomcat服务的请求head项来决定的,默认是http协议,域名是通过读取host地址,默认host中不包括访问端口。

方式③:错误页从定向

server {
        listen 8009 ssl;
        server_name localhost;

        error_page 497 https://$host:8009$uri?$args;
}

3.隐藏版本号

http {
	 server_tokens off;
}

4.负载均衡(upstream)

upstream cszhi.com {
	ip_hash;
	server 192.168.8.11:80;
	server 192.168.8.12:80 down;
	server 192.168.8.13:8009 max_fails=3 fail_timeout=20s;
	server 192.168.8.146:8080;
}

注意,当负载调度算法为ip_hash时,后端服务器在负载均衡调度中的状态不能是weight和backup。

upstream是Nginx的HTTP Upstream模块,这个模块通过一个简单的调度算法来实现客户端IP到后端服务器的负载均衡。
在上面的设定中,通过upstream指令指定了一个负载均衡器的名称cszhi.com。这个名称可以任意指定,在后面需要的地方直接调用即可。

Nginx的负载均衡模块目前支持4种调度算法,下面进行分别介绍,其中后两项属于第三方的调度方法。

  • 轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器,如果后端某台服务器宕机,故障系统被自动剔除,使用户访问不受影响;
  • Weight:指定轮询权值,Weight值越大,分配到的访问机率越高,主要用于后端每个服务器性能不均的情况下;
  • ip_hash:每个请求按访问IP的hash结果分配,这样来自同一个IP的访客固定访问一个后端服务器,有效解决了动态网页存在的session共享问题;
  • fair:比上面两个更加智能的负载均衡算法。此种算法可以依据页面大小和加载时间长短智能地进行负载均衡,也就是根据后端服务器的响应时间来分配请求,响应时间短的优先分配。Nginx本身是不支持fair的,如果需要使用这种调度算法,必须下载Nginx的upstream_fair模块;
  • url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,可以进一步提高后端缓存服务器的效率。Nginx本身是不支持url_hash的,如果需要使用这种调度算法,必须安装Nginx 的hash软件包。

在HTTP Upstream模块中,可以通过server指令指定后端服务器的IP地址和端口,同时还可以设定每个后端服务器在负载均衡调度中的状态。常用的状态有:

  • down:表示当前的server暂时不参与负载均衡;
  • backup:预留的备份机器。当其他所有的非backup机器出现故障或者忙的时候,才会请求backup机器,因此这台机器的压力最轻;
  • max_fails:允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误;
  • fail_timeout:在经历了max_fails次失败后,暂停服务的时间。max_fails可以和fail_timeout一起使用

5.禁止文件缓存

开发环境可使用

location ~* \.(js|css|png|jpg|gif)$ {
    add_header Cache-Control no-store;
}

6.防盗链

防止文件被其他网站使用

location ~* \.(gif|jpg|png)$ {
    # 只允许 192.168.0.1 请求资源
    valid_referers none blocked 192.168.0.1;
    if ($invalid_referer) {
       rewrite ^/ http://$host/logo.png;
    }
}

7.文件压缩

server {
    # 开启gzip 压缩
    gzip on;
    # 设置gzip所需的http协议最低版本 (HTTP/1.1, HTTP/1.0)
    gzip_http_version 1.1;
    # 设置压缩级别,压缩级别越高压缩时间越长  (1-9)
    gzip_comp_level 4;
    # 设置压缩的最小字节数, 页面Content-Length获取
    gzip_min_length 1000;
    # 设置压缩文件的类型  (text/html)
    gzip_types text/plain application/javascript text/css;
}

8.指定定错误页面

# 根据状态码,返回对于的错误页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
    root /source/error_page;
}

9.解决跨域

现在http://xx_domainhttps://github.com发起请求一定会出现跨域。
常规代理转发

## 配置反向代理的参数
server {
    listen    8080;
    server_name xx_domain

    ## 1. 用户访问 http://xx_domain,则反向代理到 https://github.com
    location / {
        proxy_pass  https://github.com;
        proxy_redirect     off;
        proxy_set_header   Host             $host;        # 传递域名
        proxy_set_header   X-Real-IP        $remote_addr; # 传递ip
        proxy_set_header   X-Scheme         $scheme;      # 传递协议
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
    }
}

直接在服务端进行跨域配置

location / {
	add_header Access-Control-Allow-Origin 'https://xx';
	add_header Access-Control-Allow-Methods *;
	#add_header Access-Control-Allow-Headers *;
	add_header Access-Control-Allow-Headers 'authority, content-type, version-info, X-Requested-With';

	# 是否允许后续请求携带认证信息(cookies),该值只能是true,否则不返回
	add_header Access-Control-Allow-Credentials 'true';

	if ($request_method = 'OPTIONS') {
			return 204;
	}
}

10.常用nginx.conf

#user  nobody;
worker_processes  1;

#error_log  logs/error.log;
#error_log  logs/error.log  notice;
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;


events {
    worker_connections  1024;
}



#stream {
#   upstream pgsql {
#        server 192.168.0.5:5432;
#   }
#    server {
#        listen 8777;
#        proxy_connect_timeout 30s;
#        proxy_timeout 30s;
#        proxy_pass pgsql;
#    }
#}


http {
    include       mime.types;
    default_type  application/octet-stream;
    client_max_body_size 500M;
    #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;
    #tcp_nopush     on;
    server_tokens off;
    #keepalive_timeout  0;
    keepalive_timeout  65;

    gzip  on;
    gzip_min_length 1k;
    gzip_comp_level 5;
    gzip_buffers 16 8k;
    gzip_http_version 1.1;
    gzip_types font/ttf font/otf image/svg+xml text/plain application/javascript application/x-javascript text/css application/xml text/javascript application/x-httpd-php image/jpeg image/gif image/png;
    gzip_vary on;
    gzip_disable "MSIE [1-6]\.";

    include ./conf.d/*.conf;

}

11.其他

server {
	# 监听端口 HTTPS
	listen 443 ssl;
	server_name ably.com;

	# 配置域名证书
	#填写证书文件绝对路径
	ssl_certificate cert/<cert-file-name>.pem;
	#填写证书私钥文件绝对路径
	ssl_certificate_key cert/<cert-file-name>.key;
	ssl_session_cache shared:SSL:1m;
	ssl_session_timeout 5m;
	#自定义设置使用的TLS协议的类型以及加密套件(以下为配置示例,请您自行评估是否需要配置)
	#TLS协议版本越高,HTTPS通信的安全性越高,但是相较于低版本TLS协议,高版本TLS协议对浏览器的兼容性较差。
	ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!EDH-DSS-DES-CBC3-SHA:!EDH-RSA-DES-CBC3-SHA:!KRB5-DES-CBC3-SHA;
	ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
	#表示优先使用服务端加密套件。默认开启
	ssl_prefer_server_ciphers on;

	index index.html index.htm index.php;
	root /data/www/;
	
	location ~ .*\.(php|php5)?$ {
		fastcgi_pass 127.0.0.1:9000;
		fastcgi_index index.php;
		include fastcgi.conf;
	}

	# 配置地址拦截转发,解决跨域验证问题
	location /oauth/ {
		proxy_pass https://localhost:13580/oauth/;
		proxy_set_header HOST $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
	}

	# 图片缓存时间设置
	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ {
		expires 10d;
	}

	# JS和CSS缓存时间设置
	location ~ .*\.(js|css)?$ {
		expires 1h;
	}


	# 设定查看Nginx状态的地址.StubStatus模块能够获取Nginx自上次启动以来的工作状态,此模块非核心模块,需要在Nginx编译安装时手工指定才能使用
	location /NginxStatus {
		stub_status on;
		access_log on;
		auth_basic "NginxStatus";
		auth_basic_user_file conf/htpasswd;
		#htpasswd文件的内容可以用apache提供的htpasswd工具来产生.
	}
}