1 正向代理与反向代理
1.1 正向代理
正向代理,用通俗的方式来说,就是代理服务器只起到转发的作用,例如,在顾客进商店购买东西,商店就是一个正向代理,起到的作用就是把商品从厂家代理售卖到顾客手中。
1.2 反向代理
反向代理,就是顾客的请求是确定的,但将商品的需求信息发送给代理商之后,代理商通过各种方式寻找不同的供货商,再把供货商提供的商品转交给顾客。顾客是不知道代理商背后的供货商是谁的。这种方式有点类似于目前的“三只松鼠”等网络直销平台的逻辑,顾客发送芒果干的请求给三只松鼠,三只松鼠从全国进行供货商的选择,拿到货品后再打上三只松鼠的logo转交给顾客,实现反向的代理,代理的是供货商,顾客不知道具体的供应商是谁(所以才会要求包装上需要印上供应商的名称和地址,要不然出问题都不知道找谁。)
2 Nginx如何实现反向代理
2.1 Nginx的基本配置
Nginx的安装网络有很多资源,包括Linux和Windows的,在此不表。主要关注一下如何进行配置,来看看nginx.conf.default
中的配置信息:
#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;
}
http {
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;
#gzip on;
server { # 配置服务器访问信息
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location / { # 配置访问路由
root html;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# 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;
#}
# 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 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;
# }
#}
}
可以看到,主要的几个配置模块:
- main:用于进行nginx全局信息的配置
- events:用于nginx工作模式的配置
- http:用于进行http协议信息的一些配置
- server:用于进行服务器访问信息的配置
- location:用于进行访问路由的配置
- upstream:用于进行负载均衡的配置
- server:用于进行服务器访问信息的配置
下面主要讲讲经常使用的server以及location的配置。
2.2 server
listen 监听
listen
监听代理服务器的端口,如果设置成80,则监听80端口上的请求。server_name
gzip压缩
为了加快网络传输速度,一般会采用gzip压缩将资源进行压缩后传输
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css text/xml;
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;
gzip压缩中
2.3 location
- 静态文件
alias
location /abc/ {
alias /root/webdeploy/abc/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
- 服务或者代理地址
proxy_pass
location / {
proxy_pass http://yourIP:1080;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
- 跨域配置
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
- 重定向
rewrite
proxy_redirect
3 Nginx搭建网站实战
3.1 WordPress Docker如何进行域名跳转
首先,目前采用WordPress的部署方式为docker部署,详见:5分钟使用docker搭建WP博客系统快速教程
-
这种部署方式,docker容器中的WordPress已经是采用apache2发布的网站,在服务器上有一个Nginx进行反向代理,实现docker中wordpress的1080端口的反向代理。同时申请的域名由阿里云DNS进行解析。示意图如下:
在本次实例中,以
abc.com
作为示例域名。
3.2 阿里云域名解析配置
对于阿里云上的配置,我们直接使用一级域名abc.com
解析阿里云服务器的IP地址:
- 主机记录为空
-
记录值为ECS的IP地址
3.3 Nginx配置
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name www.abc.com abc.com; #解析地址
root /usr/share/nginx/html;
include /etc/nginx/default.d/*.conf;
# 根地址
location / {
# 当Host设置为$http_host时,则不改变请求头的值
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_pass http://15.6.77.3:1080; # 代理的docker服务地址
# 设置允许跨域
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
# 媒体信息存放代理
location /media/ {
# 存放地址映射
alias /root/webdeploy/media/;
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
}
# 打开gzip压缩
gzip on;
gzip_buffers 32 4K;
gzip_comp_level 6;
gzip_min_length 100;
gzip_types application/javascript text/css text/xml;
gzip_disable "MSIE [1-6]\."; #配置禁用gzip条件,支持正则。此处表示ie6及以下不启用gzip(因为ie低版本不支持)
gzip_vary on;
error_page 404 /404.html;
location = /40x.html {
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
}
}
3.4 WordPress中的配置
- 使用
docker exec -it wp bash
进入docker的控制台,在主目录,可以使用ls
命令查看,在该目录下有文件wp-config.php
,需要在该文件中添加如下命令(需要安装vim):
$home = 'http://'.$_SERVER['HTTP_HOST']; #获取当前访问的域名
$siteurl = 'http://'.$_SERVER['HTTP_HOST'];
define('WP_HOME', $home);
define('WP_SITEURL', $siteurl);
- 保存完成之后,重启wp的docker服务,这样就可以通过
abc.com
对WordPress进行访问了。 - 需要https的可以进一步进行设置。