目录
1、Nginx反向代理配置
nginx 默认的配置文件是nginx.conf,进入nginx配置文件目录下打开配置文件
刚安装完的nginx.conf配置内容如下:
#user nobody;
worker_processes 1; #配置工作进程数目,根据硬件调整,通常等于CPU数量或2倍于CPU数量#error_log logs/error.log; #制定日志路径,级别。这个设置可以放入全局块,http块,server块,级别以此为:debug|info|notice|warn|error|crit|alert|emerg
#error_log logs/error.log notice;
#error_log logs/error.log info;#pid logs/nginx.pid; #指定nginx进程运行文件存放地址
events {
worker_connections 1024; #最大连接数,默认为512
}
http {
include mime.types; #文件扩展名与文件类型映射表
default_type application/octet-stream; #默认文件类型,默认为text/plain#配置日志格式
#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; #配置access.log日志及存放路径,并且使用上面定义的main日志格式
sendfile on; #允许sendfile方式传输文件,默认为off,可以在http块,server块,location块。
#tcp_nopush on; #防止网络阻塞#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。#gzip on; #是否开启gzip压缩输出
#以下是配置跨域(Nginx设置响应头信息给浏览器)
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Credentials true;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
add_header Access-Control-Allow-Headers DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type;server { #服务,可以有多个server,对应多个服务
listen 80; #监听端口 ,此项如果不配置则默认80端口
server_name localhost; #配置服务名#charset koi8-r; #配置字符集
#access_log logs/host.access.log main; #配置本虚拟主机的访问日志
#默认的匹配斜杠/的请求,当访问路径有斜杠,会被该location匹配并且进行处理
location / {
root html; #root是配置服务器的默认网站根目录位置,默认为nginx安装主目录下的html目录
index index.html index.htm; #配置首页文件的名称
}#error_page 404 /404.html; #配置404页面
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html; #配置50x错误页面
location = /50x.html {
root html;
}#PHP 脚本请求全部转发到Apache处理
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}#PHP 脚本请求全部转发到FastCGI处理
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
#location ~ \.php$ {
# root html;
# fastcgi_pass 127.0.0.1:9000;
# fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
# include fastcgi_params;
#}#禁止访问.htaccess 文件
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
#location ~ /\.ht {
# deny all;
#}
}#配置另外一台虚拟主机
# another virtual host using mix of IP-, name-, and port-based configuration
#
#server {
# listen 8000;
# listen somename:8080;
# server_name somename alias another.alias;# location / {
# root html;
# index index.html index.htm;
# }
#}#配置https服务
# HTTPS server
#
#server {
# listen 443 ssl;
# server_name localhost;# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;# ssl_session_cache shared:SSL:1m;
# ssl_session_timeout 5m;# ssl_ciphers HIGH:!aNULL:!MD5;
# ssl_prefer_server_ciphers on;# location / {
# root html;
# index index.html index.htm;
# }
#}}
nginx 文件结构说明:
Nginx的核心配置文件主要由三个部分构成:
1)基本配置(全局模块)
2)events配置
3)http配置
http{}模块包含server{}块和location{}块;而server{}块又包含location{}块。
1、全局块:配置影响nginx全局的指令。一般有运行nginx服务器的用户组,nginx进程pid存放路径,日志存放路径等。
2、events块:配置影响nginx服务器或与用户的网络连接。有每个进程的最大连接数,选取哪种事件驱动模型处理连接请求,是否允许同时接受多个网路连接,开启多个网络连接序列化等。
3、http块:
直接隶属于http{}块内的配置项称为main配置项
可以嵌套多个server,配置代理,缓存,日志定义等绝大多数功能和第三方模块的配置。如连接超时时间,单连接请求数等。
4、server块:
直接隶属于server{}块内的配置项称为srv配置项
配置虚拟主机的相关参数,一个http中可以有多个server,可以有多个server,对应多个服务。
5、location块:
直接隶属于location{}块内的配置项称为loc配置项
配置请求的路由,以及各种页面的处理情况。
配置例子:
#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 {undefined
worker_connections 1024; #最大连接数,默认为512
}
http {undefined
include mime.types;
default_type application/octet-stream;
#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;
#keepalive_timeout 0;
keepalive_timeout 65; #连接超时时间,默认为75s,可以在http,server,location块。
#gzip on;
//以下是负载均衡配置包含多个配置项,主要有backup,weight,down,max_fails,fail_timeout.. proxy_next_upstream,
如:upstream:www.aaaaa.com{}指定了三个服务器,其中8082端口服务器因为带有backup标识,作为备用服务器存在,也就是说当8081服务器正常时,8082服务器是不参与工作的,仅当8081服务器遇到了proxy_next_upstream指定的错误类型( error | timeout | http_502 | http_503 | http_504),nginx才会切换到备用服务器。
weight: #指定了服务器的权重, 其中8080服务器的流量将会是8081服务器的2倍。
max_fails: #允许请求失败的次数,默认为1。当超过最大次数时,返回proxy_next_upstream 模块定义的错误
fail_timeout:# 默认值10s,代表超时时间。
down: #表示当前的server暂时不参与负载
ip_hash: #每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session不能跨服务器的问题,如果后端服务器down掉,要手工down掉。
upstream www.aaaaa.com {
server 127.0.0.1:8080; weight=2 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
server 127.0.0.1:8082 weight=1 max_fails=3 fail_timeout=30s backup;
}
upstream www.bbbbb.net {
server 127.0.0.1:9999;
}
upstream www.ccccc.cn {
server 127.0.0.1:8888;
}
upstream weixin.ddddd.com {
server 127.0.0.1:8080;
}
upstream weixin.eeeee.com {
server 127.0.0.1:8899;
}
upstream 105.26.224.50 {
server 127.0.0.1:8899;
}
upstream 105.26.224.52 {
server 127.0.0.1:8899;
}
upstream demo.wly.fffff.com {
server 127.0.0.1:7777;
}
//以下是多站点多应用配置,各自有不同的域名,www.aaaaa.com将被自动代理到http://www.aaabb.com:8080服务器上, 而www.bbbbb.net:8081则被自动代理到http://www.bbbcc.net:8082服务器上。
域名情况下,proxy_name,upstream
server {
listen 80;
server_name www.aaaaa.com;
charset utf-8; #编码格式
#location是nginx配置文件中的一个配置项, 当需要在一个域名下面部署多个不同服务器,可使用该方案,配置如下
# http://www.aaaaa.com:80/mail/ 下的请求转发到 http://www.wly.com:80/protmail/
location /mail/ {
index index.html index.jsp;
proxy_pass http://www.wly.com:80/protmail/; #指定要代理的服务器
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
# http://www.aaaaa.com:80/mail/ 下的请求转发到 http://www.wly.com:80/protmail/mail/
location /com/ {
index index.html index.jsp;
proxy_pass http://www.wly.com:80/protmail/mail/;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
# 将其它所有请求转发到 http://www.aaabb.com:8080
location / {
index index.html index.jsp;
proxy_pass http://www.aaabb.com:8080;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.bbbbb.net;
location / {
index index.html index.jsp;
proxy_pass http://www.bbbcc.net;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name www.ccccc.cn;
location / {
index index.html index.jsp;
proxy_pass http://www.ccccc.cn:8081;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 8082;
server_name weixin.ddddd.com;
location / {
index index.html index.jsp;
proxy_pass http://weixin.ddddd.com:8083;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name weixin.eeeee.com;
location / {
index index.html index.jsp;
proxy_pass http://weixin.eeeee.com;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name demo.wly.fffff.com;
location / {
index index.html index.jsp;
proxy_pass http://demo.wly.fffff.com;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name 105.26.224.50;
location / {
index index.html index.jsp;
proxy_pass http://105.26.224.51;
proxy_set_header Host 105.26.224.50;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
server {
listen 80;
server_name 105.26.224.52;
location / {
index index.html index.jsp;
proxy_pass http://105.26.224.53;
proxy_set_header Host 105.26.224.52; #这一行的作用是把原http请求的Header中的Host字段也放到转发的请求,如果不加nginx转发的请求header里就不会有Host字段
proxy_set_header X-Real-IP $remote_addr; # 在web服务器端获得用户的真实ip
以下两行是nginx反向代理配置websocket
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection upgrade;
以下三行是nginx设置超时配置
proxy_connect_timeout 75; 链接
proxy_read_timeout 600; 读取
proxy_send_timeout 600; 发请求
以下一行配置是客户端请求服务器最大允许大小
client_max_body_size 4098m
设置HTTP协议版本
proxy_http_version 1.1
proxy_cookie_domain参数的作用是转换response的set-cookie header中的domain选项,由后端设置的域名domain转换成你的域名replacement,来保证cookie的顺利传递并写入到当前页面中,注意proxy_cookie_domain负责的只是处理response set-cookie头中的domain属性,如果set-cookie本身就没有domain内容则无需加
proxy_cookie_domain 10.23.1.1 10.23.1.2;client_max_body_size 100m;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
配置https请求
server {
listen 443;
server_name localhost; #本机的IP地址
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/证书名称.pem; 如:/etc/nginx/server.crt;
ssl_certificate_key cert/证书名称.key; 如:/etc/nginx/server.key;
ssl_session_timeout 5m;
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 html;
#index testssl.html index.html index.htm;
proxy_redirect off;
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_pass http://IP地址/ssl/;
}
}
}
其他常用配置
配置1:
location /test/ {
proxy_pass http://10.23.2.96:8082/;
}
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/login
配置2:
location /test {
proxy_pass http://10.23.2.96:8082;
}
访问:http://127.0.0.1/test 转发到:http://10.23.2.96:8082/test
访问: http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/test/
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/test/login
配置3:
location /test{
proxy_pass http://10.23.2.96:8082/define;
}
访问:http://127.0.0.1/test 转发到:http://10.23.2.96:8082/define
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/define/
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/define/login
配置4:
location /test/ {
proxy_pass http://10.23.2.96:8082;
}
访问:http://127.0.0.1/test 转发到:http://192.168.2.96:8082/test/
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/test/
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/test/login
配置5:
location /test/ {
proxy_pass http://10.23.2.96:8082/define;
}
访问:http://127.0.0.1/test 转发到:http://192.168.2.96:8082/test/
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/define
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/definelogin #define与login之间不会有/ ,会直接拼接起来
配置6:
location /test{
proxy_pass http://10.23.2.96:8082/;
}
访问:http://127.0.0.1/test 转发到:http://10.23.2.96:8082/
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082//
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082//login
配置7:
location /test {
proxy_pass http://10.23.2.96:8082/define/;
}
访问:http://127.0.0.1/test 转发到:http://10.23.2.96:8082/define/
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/define//
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/define//login
配置8:
location /test/ {
proxy_pass http://10.23.2.96:8082/define/;
}
访问:http://127.0.0.1/test 转发到:http://127.0.0.1:8082/test/
访问:http://127.0.0.1/test/ 转发到:http://10.23.2.96:8082/define/
访问:http://127.0.0.1/test/login 转发到:http://10.23.2.96:8082/define/login
备注:proxy_pass 后的URL如果符合 protocol://ip:port 同时结尾不加"/",则nginx会代理匹配路径部分,否则不代理匹配路径,同时自动添加不匹配路径"部分",比如/testone/login的/login部分
2、目录白名单配置
配置1:校验一级目录
nginx.conf配置如下:
server {
#配置校验一级路由白名单样例
location /{
set $urlacl $uri;
if($urlacl ~ ^(/\w*).*)
{
set $urlacl /nginx/nginx/nginx/urlacl$1;
}
if(!-d $urlacl)
{
return 401;
}
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://21.13.245.185:8090; (转发地址)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires -l;
}
}
对应目录配置如下:
访问:http://xxx.xxx.xx.xx:8443/reader/open 无法转发到:http://21.13.245.185:8090/reader/open
访问:http://xxx.xxx.xx.xx:8443/reader 无法转发到:http://21.13.245.185:8090/reader
访问:http://xxx.xxx.xx.xx:8443/minio/open 转发到:http://21.13.245.185:8090/minio/open
访问:http://xxx.xxx.xx.xx:8443/minio 转发到:http://21.13.245.185:8090/minio
配置1:校验二级目录
nginx.conf配置如下:
server {
#配置校验二级路由白名单样例
location /minio{
set $urlacl $uri;
if($urlacl ~ ^(/minio\w*).*)
{
set $urlacl /nginx/nginx/nginx/urlacl$1;
}
if(!-d $urlacl)
{
return 401;
}
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_pass http://wly.test.com:8090/wps_result/open; (转发地址)proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
expires -l;
}
}
对应目录配置如下:
访问:http://127.0.0.1:8080/minio/test 无法转发到:http://wly.test.com:8090/wps_result/open/minio/test
访问:http://127.0.0.1:8080/minio/test/aa 无法转发到:http://wly.test.com:8090/wps_result/open/minio/test/aa
访问:http://127.0.0.1:8080/minio/adapter 转发到:http://wly.test.com:8090/wps_result/open/minio/adapter
访问:http://127.0.0.1:8080/minio/adapter/aa 转发到:http://wly.test.com:8090/wps_result/open/minio/adapter/aa