nginx作为web服务器一个重要的功能就是反向代理。
nginx反向代理的指令不需要新增额外的模块,默认自带proxy_pass指令,只需要修改配置文件就可以实现反向代理。配置前的准备工作,后端跑apache服务的ip和端口,也就是说可以通过http://ip:port能访问到你的网站。
参考:http://www.ttlsa.com/nginx/use-nginx-proxy/
https://www.cnblogs.com/xiaoruilin/p/7782214.html
https://www.cnblogs.com/yanyuji/p/6688979.html(主要参考注释)
https://blog.csdn.net/chen_________/article/details/68489433
https://www.cnblogs.com/Miss-mickey/p/6734831.html(重点参考,还有更详细的注释)
一、nginx反向代理设置
目标:在浏览器中输入xxx123.tk能访问到内网机器192.168.10.38的3000端口,输入xxx456.tk能访问到内网机器192.168.10.40的80端口。
1.修改配置文件
vim nginx.conf
user www www;# 运行用户
worker_processes 1;#启动进程,通常设置成和cpu的数量相等
error_log logs/error.log;# 全局错误日志及PID文件
pid logs/nginx.pid;
worker_rlimit_nofile 65535;
# 工作模式及连接数上限
events {
use epoll;#epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 65535; #单个后台worker process进程的最大并发链接数
}
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
include mime.types;#设定mime类型,类型由mime.type文件定义
default_type application/octet-stream;#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy)来输出文件,对于普通应用, #必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
include /usr/local/nginx/conf/reverse-proxy.conf;
#把reverse-proxy.conf配置引用进来,如果server参数配置在此文件则需要配置此项,如果不要此项,则需要把server参数配置在当前下面的server中
sendfile on;
keepalive_timeout 65;#连接超时时间
gzip on;#开启gzip压缩
client_max_body_size 50m; #缓冲区代理缓冲用户端请求的最大字节数,可以理解为保存到本地再传给用户
client_body_buffer_size 256k;#缓冲区代理缓冲用户端请求的最大字节数
client_header_timeout 3m;
client_body_timeout 3m;
send_timeout 3m;
#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_connect_timeout 300s; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_read_timeout 300s; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_send_timeout 300s; #后端服务器数据回传时间(代理发送超时)
proxy_buffer_size 64k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传递请求,而不缓冲到磁盘
proxy_ignore_client_abort on; #不允许代理端主动关闭连接
server {
listen 80;#侦听80端口
server_name localhost;# 定义使用www.xx.com访问
charset utf-8;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;#前端静态文件物理路径 通过http://localhost/html/来访问当前目录下的html下的文件夹
}
}
}
2.编辑反向代理服务器配置文件,被配置负载均衡:
vim /usr/local/nginx/conf/reverse-proxy.conf
upstream monitor_server {
server 192.168.0.131:80;
server 192.168.0.132:80;#131与132为负载均衡服务器
}
server
{
listen 80;#侦听80端口
server_name xxx123.tk;# 定义使用www.xxx123.tk访问
location / {
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://monitor_server;
}
access_log logs/xxx123.tk_access.log;
}
server
{
listen 80;
server_name xxx456.tk;
location / {
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://192.168.10.40:80;
}
access_log logs/xxx456.tk_access.log;
}
3. 设置完成后执行/usr/local/nginx/sbin/nginx -t 检查配置是否正常
如果显示:the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok configuration file /usr/local/nginx/conf/nginx.conf test is successful 则正常,否则按错误提示进行修改。
4. 杀死Nginx进程,重启nginx,使修改生效,再把xxx123.tk域名指向公司静态IP
# /usr/local/nginx/sbin/nginx -s reload 或 # /etc/init.d/nginx reload
或者/etc/init.d/nginx restart
另外,由于http请求最后都是由反向代理服务器传递给后段的机器,所以后端的机器原来的访问日志记录的访问IP都是反向代理服务器的IP。
要想能记录真实IP,需要修改后端机器的日志格式,这里假设后端也是一台nginx:
在后端配置文件里面加入这一段即可:
log_format access '$HTTP_X_REAL_IP - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" $HTTP_X_Forwarded_For';
access_log logs/access.log access;
二、nginx配置指向本地路径(目录)
参考:https://www.cnblogs.com/freeweb/p/5446632.html(linux例子)
https://blog.csdn.net/lovelovelovelovelo/article/details/75038594(windows例子)
http://desert3.iteye.com/blog/1169326(windows例子:root D:/resin-pro-3.1.9; )
附Nginx Location指令URI匹配规则:https://blog.csdn.net/xyang81/article/details/51989079
改nginx.conf中对应的server {}下添加location规则,配置如下:
location /image/ {
root /;
rewrite ^/image/(.*)$ /image_data/$1 break;
}
root /;设定作用的根目录,rewrite就是真正的跳转规则,设置以image为开头的请求跳转到/image_data开头的根目录,后面的参数原封不动的添加过去,这样就实现了目录的映射,