经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » Nginx » 查看文章
Nginx-反向代理实现别来无恙-
来源:cnblogs  作者:别来无恙-  时间:2019/4/10 8:36:01  对本文有异议

Nginx 反向代理操作案例

Nginx反向代理的组件模块

upstream模块介绍->点我<

环境准备

 

1)四台服务器都需操作如下步骤:

  1. # systemctl stop firewalld //关闭防火墙
  2. # sed -i 's/^SELINUX=.*/SELINUX=disabled/' /etc/sysconfig/selinux //关闭selinux,重启生效
  3. # setenforce 0 //关闭selinux,临时生效
  4. # ntpdate 0.centos.pool.ntp.org //时间同步

2)LB节点源码安装nginx:

  1. # yum install openssl openssl-devel pcre pcre-devel gcc gcc-c++ make autoconf automake -y //安装依赖工具包

  2. //编写安装脚本
  3. # cat >installNginx.sh<<EOF    
  4. mkdir /home/tools
  5. cd /home/tools
  6. wget -q http://nginx.org/download/nginx-1.12.2.tar.gz
  7. ls -l nginx-1.12.2.tar.gz
  8. useradd nginx -s /sbin/nologin -M
  9. tar xf nginx-1.12.2.tar.gz
  10. cd nginx-1.12.2
  11. ./configure --user=nginx --group=nginx --prefix=/application/nginx-1.12.2 --with-http_stub_status_module --with-http_ssl_module
  12. make
  13. make install
  14. ln -s /application/nginx-1.12.2/ /application/nginx
  15. EOF
  16. # bash installNginx.sh //执行安装脚本

说明:上面源码安装的nginx,配置文件路径:/application/nginx/conf/nginx.conf    二进制启动命令路径:/application/nginx/sbin/nginx

3)web节点yum安装nginx及准备测试文件:

  1. # yum install nginx -y //安装nginx
  2. # mkdir /application/nginx/html/{www,bbs,blog} -p //创建web站点目录
  3. # for dir in www bbs blog; do echo "`hostname` $dir" >/application/nginx/html/$dir/index.html;done //创建站点目录测试文件
  4. # vim /etc/nginx/nginx.conf //编辑配置文件
  5. user nginx;
  6. worker_processes auto;
  7. error_log /var/log/nginx/error.log;
  8. pid /run/nginx.pid;
  9. include /usr/share/nginx/modules/*.conf;
  10. events {
  11. worker_connections 1024;
  12. }
  13. http {
  14. log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  15. '$status $body_bytes_sent "$http_referer" '
  16. '"$http_user_agent" "$http_x_forwarded_for"';
  17. access_log /var/log/nginx/access.log main;
  18. sendfile on;
  19. tcp_nopush on;
  20. tcp_nodelay on;
  21. keepalive_timeout 65;
  22. types_hash_max_size 2048;
  23. include /etc/nginx/mime.types;
  24. default_type application/octet-stream;
  25. include /etc/nginx/conf.d/*.conf;
  26. server {
  27. listen 80;
  28. server_name www.etiantian.org;
  29. location / {
  30. root /application/nginx/html/www;
  31. }
  32. access_log /var/log/nginx/access_www.log main;
  33. }
  34. server {
  35. listen 80;
  36. server_name bbs.etiantian.org;
  37. location / {
  38. root /application/nginx/html/bbs;
  39. }
  40. access_log /var/log/nginx/access_bbs.log main;
  41. }
  42. server {
  43. listen 80;
  44. server_name blog.etiantian.org;
  45. location / {
  46. root /application/nginx/html/blog;
  47. }
  48. access_log /var/log/nginx/access_blog.log main;
  49. }
  50. }
  51. # systemctl start nginx //启动nginx
  52. # systemctl enable nginx //加入开机自启动

4)web站点配置hosts解析及测试nginx是否能够正常访问

  1. //web1站点编辑后的/etc/hosts文件
  2. [root@centos7-3 ~]# tail -3 /etc/hosts
  3. 192.168.3.103 www.etiantian.org
  4. 192.168.3.103 bbs.etiantian.org
  5. 192.168.3.103 blog.etiantian.org
  6. //web2站点编辑后的/etc/hosts文件
  7. [root@centos7-4 ~]# tail -3 /etc/hosts
  8. 192.168.3.104 www.etiantian.org
  9. 192.168.3.104 bbs.etiantian.org
  10. 192.168.3.104 blog.etiantian.org
  11. //web1站点测试
  12. [root@centos7-3 ~]# curl www.etiantian.org
  13. centos7-3 www
  14. [root@centos7-3 ~]# curl bbs.etiantian.org
  15. centos7-3 bbs
  16. [root@centos7-3 ~]# curl blog.etiantian.org
  17. centos7-3 blog
  18. //web2站点测试
  19. [root@centos7-4 ~]# curl www.etiantian.org
  20. centos7-4 www
  21. [root@centos7-4 ~]# curl bbs.etiantian.org
  22. centos7-4 bbs
  23. [root@centos7-4 ~]# curl blog.etiantian.org
  24. centos7-4 blog

案例

完成上面的lb节点的软件安装及web节点的测试文件准备后,下面开始配置案例,说明,先配置单节点的lb,也就是先只在(centos7-1)lb1 上面进行配置。

案例一:最基本的负载均衡

编辑lb1(192.168.3.101)配置文件,编辑之前记得将默认配置文件进行备份

  1. # cp /application/nginx/conf/nginx.conf /application/nginx/conf/nginx.conf.default //备份配置文件
  2. # sed -i '/^[ ]*$/d' /application/nginx/conf/nginx.conf //去掉配置文件中的注释及空行
  3. # vim /application/nginx/conf/nginx.conf //编辑配置文件
  4. worker_processes 1;
  5. events {
  6. worker_connections 1024;
  7. }
  8. http {
  9. include mime.types;
  10. default_type application/octet-stream;
  11. sendfile on;
  12. keepalive_timeout 65;
  13. upstream myapp1 {
  14. #<== upstream 是关键字必须要有,后面的myapp1为一个Upstream集群组的名字,可以自定义,调用时就用这个名字。
  15. server 192.168.3.103 weight=1;
  16. #<==server 关键字是固定的,后面可以接域名或IP,如果不指定端口,默认是80端口。weight 代表权重,数值越大被分配到请求越多,默认值为1,所以此处可写可不写。结尾有分号,别忘了;
  17. server 192.168.3.104 weight=1;
  18. }
  19. server {
  20. listen 80;
  21. server_name localhost;
  22. location / {
  23. proxy_pass http://myapp1;
  24. }
  25. }
  26. }
  27. # /application/nginx/sbin/nginx -t //检查语法是否错误
  28. # /application/nginx/sbin/nginx -s reload //重新加载配置文件

我们用lb2机器来测试(用任何一台都可以),测试结果可以看出,会轮循调度到后端web节点上

  1. [root@centos7-2 ~]# curl 192.168.3.101
  2. centos7-3 www
  3. [root@centos7-2 ~]# curl 192.168.3.101
  4. centos7-4 www
  5. [root@centos7-2 ~]# curl 192.168.3.101
  6. centos7-3 www
  7. [root@centos7-2 ~]# curl 192.168.3.101
  8. centos7-4 www

案例二:基于权重(wrr)

修改配置文件 upstream 段为以下内容

  1. upstream myapp1 {
  2. server 192.168.3.103 weight=1;
  3. server 192.168.3.104 weight=2;
  4. }

同样使用lb2机器来进行测试,可以发现调度后端节点编程了1:2,调度到web2节点上面总是会多一次。

  1. [root@centos7-2 ~]# curl 192.168.3.101
  2. centos7-3 www
  3. [root@centos7-2 ~]# curl 192.168.3.101
  4. centos7-4 www
  5. [root@centos7-2 ~]# curl 192.168.3.101
  6. centos7-4 www
  7. [root@centos7-2 ~]# curl 192.168.3.101
  8. centos7-3 www
  9. [root@centos7-2 ~]# curl 192.168.3.101
  10. centos7-4 www
  11. [root@centos7-2 ~]# curl 192.168.3.101
  12. centos7-4 www

案例三:较完整的 upstream 配置案例

修改配置文件 upstream 段为以下内容

  1. upstream myapp1 {
  2. server 192.168.3.103 weight=1 max_fails=3 fail_timeout=20s;
  3. server 192.168.3.104 weight=1 max_fails=3 fail_timeout=20s;
  4. }
  5. //max_fails 尝试连接后端主机失败的次数; fail_timeout 在max_fails定义的失败次数后,距离下次检查的间隔时间。

同样使用lb2机器来进行测试,在测试过程中,关闭其中一个web节点,会发现只是调度到另外一个节点上面,然后再重启关闭的节点,观察测试输出内容,会发现尝试的时间。

  1. [root@centos7-2 ~]# for n in {1..100}; do curl 192.168.3.101 ; date +%T; sleep 1; done

案例四:基于域名的负载

修改配置文件为以下内容

  1. worker_processes 1;
  2. events {
  3. worker_connections 1024;
  4. }
  5. http {
  6. include mime.types;
  7. default_type application/octet-stream;
  8. sendfile on;
  9. keepalive_timeout 65;
  10. upstream myapp1 {
  11. server 192.168.3.103 weight=1 max_fails=3 fail_timeout=20s;
  12. server 192.168.3.104 weight=1 max_fails=3 fail_timeout=20s;
  13. }
  14. server {
  15. listen 80;
  16. server_name www.etiantian.org;
  17. location / {
  18. proxy_pass http://myapp1;
  19. proxy_set_header Host $host;
  20. }
  21. }
  22. server {
  23. listen 80;
  24. server_name bbs.etiantian.org;
  25. location / {
  26. proxy_pass http://myapp1;
  27. proxy_set_header Host $host;
  28. }
  29. }
  30. server {
  31. listen 80;
  32. server_name blog.etiantian.org;
  33. location / {
  34. proxy_pass http://myapp1;
  35. proxy_set_header Host $host;
  36. }
  37. }
  38. }

编辑/etc/hosts文件,进行域名解析,此处为了方便,直接在lb1节点上面编辑并测试(如果需要在别的节点进行测试,那么进行域名解析即可)

  1. # vim /etc/hosts
  2. 192.168.3.101 www.etiantian.org bbs.etiantian.org blog.etiantian.org

测试发现基于域名ok,因为上面配置的权重都为1,所以不论我们访问哪一个域名,都会轮循去调度后端web节点。

  1. [root@centos7-1 ~]# curl www.etiantian.org
  2. centos7-4 www
  3. [root@centos7-1 ~]# curl www.etiantian.org
  4. centos7-3 www
  5. [root@centos7-1 ~]# curl bbs.etiantian.org
  6. centos7-4 bbs
  7. [root@centos7-1 ~]# curl bbs.etiantian.org
  8. centos7-3 bbs
  9. [root@centos7-1 ~]# curl blog.etiantian.org
  10. centos7-4 blog
  11. [root@centos7-1 ~]# curl blog.etiantian.org
  12. centos7-3 blog

案例五:记录客户端真实IP

先到web节点上面查看访问日志

  1. [root@centos7-3 ~]# tailf /var/log/nginx/access_www.log
  2. 192.168.3.101 - - [08/Apr/2019:00:18:14 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" "-"
  3. 192.168.3.101 - - [08/Apr/2019:00:18:16 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" “-"

通过观察日志发现,记录的都负载均衡器节点的IP,实际生产环境中都是记录真实客户端IP。

进行修改配置文件(lb节点)将location 段加上 proxy_set_header X-Forwarded-For $remote_addr;

  1. location / {
  2. proxy_pass http://myapp1;
  3. proxy_set_header Host $host;
  4. proxy_set_header X-Forwarded-For $remote_addr;
  5. }

使用lb2节点进行测试(我们将lb2当做一个客户端访问),然后我们再去查看日志就可以发现,记录了客户端的真实IP地址。

  1. [root@centos7-3 ~]# tailf /var/log/nginx/access_www.log
  2. 192.168.3.101 - - [08/Apr/2019:00:36:06 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" "192.168.3.102"
  3. 192.168.3.101 - - [08/Apr/2019:00:36:07 +0800] "GET / HTTP/1.0" 200 14 "-" "curl/7.29.0" "192.168.3.102"

案例六:根据不同的URI 调度到不同的服务器

常见架构图

梳理:1、当用户请求 www.etiantian.org/upload/xx 地址时,实现由upload上传服务器池处理请求;2、当用户请求 www.etiantian.org/static/xx 地址时,实现由静态服务器池处理请求;3、除此之外,对于其它访问请求,全部由默认的动态服务器池处理请求。如下图:

在wab服务器上面准备测试文件

  1. //准备测试文件web1的80 upload
  2. [root@centos7-3 ~]# mkdir /application/nginx/html/www/upload
  3. [root@centos7-3 ~]# echo "upload web01 192.168.3.103 " > /application/nginx/html/www/upload/index.html
  4. //准备测试文件web2的80 static
  5. [root@centos7-4 ~]# mkdir /application/nginx/html/www/static
  6. [root@centos7-4 ~]# echo "static web02 192.168.3.104 " > /application/nginx/html/www/static/index.html
  7. //准备测试文件web2的8080 default
  8. [root@centos7-4 ~]# mkdir /application/nginx/www_8080
  9. [root@centos7-4 ~]# vim /etc/nginx/conf.d/www_8080.conf
  10. server {
  11. listen 80;
  12. server_name localhost;
  13. access_log /var/log/nginx/access.log main;
  14. location / {
  15. root /application/nginx/www_8080;
  16. index index.html index.htm;
  17. }
  18. }
  19. [root@centos7-4 ~]# echo "default web02 192.168.3.104 " > /application/nginx/www_8080/index.html
  20. //在lb1服务器测试后端web服务器是否能够正常访问
  21. [root@centos7-1 ~]#curl 192.168.3.103/upload/index.html
  22. upload web01 192.168.3.103
  23. [root@centos7-1 ~]# curl 192.168.3.104/static/index.html
  24. static web02 192.168.3.104
  25. [root@centos7-1 ~]# curl 192.168.3.104:8080/index.html
  26. default web02 192.168.3.104

配置LB,修改lb1配置文件进行配置

  1. sendfile on;
  2. keepalive_timeout 65;
  3. upstream upload_pools {
  4. server 192.168.3.103:80;
  5. }
  6. upstream static_pools {
  7. server 192.168.3.104:80;
  8. }
  9. upstream default_pools {
  10. server 192.168.3.104:8080;
  11. }
  12. server {
  13. listen 80;
  14. server_name www.etiantian.org;
  15. location / {
  16. proxy_pass http://default_pools;
  17. proxy_set_header Host $host;
  18. proxy_set_header X-Forwarded-For $remote_addr;
  19. }
  20. location /upload {
  21. proxy_pass http://upload_pools;
  22. proxy_set_header Host $host;
  23. proxy_set_header X-Forwarded-For $remote_addr;
  24. }
  25. location /static {
  26. proxy_pass http://static_pools;
  27. proxy_set_header Host $host;
  28. proxy_set_header X-Forwarded-For $remote_addr;
  29. }
  30. }

在lb2(模拟客户端)节点上面进行测试,结果可以看到根据不同的url调度到不同的服务器上面了。

  1. [root@centos7-2 ~]# curl 192.168.3.101
  2. default web02 192.168.3.104
  3. [root@centos7-2 ~]# curl 192.168.3.101/upload/index.html
  4. upload web01 192.168.3.103
  5. [root@centos7-2 ~]# curl 192.168.3.101/static/index.html
  6. static web02 192.168.3.104

 

  

 

原文链接:http://www.cnblogs.com/yanjieli/p/10670773.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号