美文网首页我爱编程
nginx+php坏境搭建+nginx实现代理以及负载均衡

nginx+php坏境搭建+nginx实现代理以及负载均衡

作者: 其实我很dou | 来源:发表于2018-02-04 11:03 被阅读0次

    本文主要内容包括

    • 源码安装nginx(可以下载更高版本的nginx)
    • 安装php-fpm以及配置nginx将php动态请求转发至php-fpm
    • nginx做代理服务器
    • nginx做负载均衡

    一. 安装nginx

    • 下载nginx安装包
      wget http://nginx.org/download/nginx-1.10.3.tar.gz

    • 安装依赖
      挂载光盘, 执行
      yum -y install gcc gcc-c++ openssl openssl-devel cyrus-sasl-md5 zlib

    • 安装nginx需要指定zlib和pcre的源码位置

    下载源码包wget http://zlib.net/zlib-1.2.11.tar.gz
    wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz
    tar -zxvf  zlib-1.2.11.tar.gz
    tar -zxvf pcre-8.41.tar.gz
    
    tar -zxvf nginx-1.10.3.tar.gz
    cd nginx-1.10.3
    ./configure --prefix=/usr/local/nginx --with-openssl=/usr/local/src/openssl-1.0.2q --with-http_ssl_module --with-pcre=/usr/local/src/pcre-8.41 --with-zlib=/usr/local/src/zlib-1.2.11
    make && make install
    
    • 如果使用stream四层负载均衡, 加入配置 --with-stream

    二. 常用配置

    • 创建nginx用户useradd -r web
    • 修改配置文件,
    cd /usr/local/nginx
    vi ./conf/nginx.conf  #./以web运行, 
    user  web;
    
    • 启动nginx
      ./sbin/nginx
    • 浏览器访问, 192.168.1.132, 即能看到nginx欢迎页面

    启动:sbin/nginx
    立即停止:sbin/nginx –s stop
    平滑停止:sbin/nginx –s quit
    重载配置:sbin/nginx –s reload
    重开日志:sbin/nginx –s reopen

    三. nginx运行php

    1.安装php, 开启php-fpm

    • 获取源码包解压
    wget http://cn2.php.net/get/php-7.2.1.tar.gz/from/this/mirror
    #解压
    mv mirror php-7.2.tar.gz
    tar -zxvf php-7.2.1.tar.gz
    cd php-7.2.1
    
    • 安装依赖
    yum -y install libxml2 libxml2-devel autoconf libjpeg libjpeg-devel libpng libpng-dev freetype freetype-devle zlib zlib-devel glibc glibc-devel glib2 glib2-devel libxml2-devel libcurl-devel libpng-devel freetype-devel
    
    • 安装libmcrypt
    获取源码包
    https://pan.baidu.com/s/1bBfG6z9TlErw5y58eGe8Hw 密码:wlld
    解压
    tar jxf libmcrypt-2.5.8.tar.bz2
    
    编译配置
    cd libmcrypt-2.5.8
    ./configure --prefix=/usr/local/libmcrypt
    
    编译
    make
    
    安装
    make install
    
    • 编译安装
    ./configure --prefix=/usr/local/php-fpm --enable-fpm --with-openssl --with-mysqli --with-pdo-mysql  --enable-mbstring  --with-zlib   --enable-sockets --with-curl --with-pcre-regex --with-mcrypt=/usr/local/libmcrypt --with-gd --with-png-dir --with-freetype-dir --enable-gd-native-ttf  --enable-opcache
    
    make && make install
    
    # 拷贝配置文件
    cp php.ini-development /usr/local/php-fpm/lib/
    

    2. 管理PHP-FPM

    PHP的FPM需要独立运行, 有自己的独立的配置文件. 等等.
    默认情况下, FPM监听某个(127.0.0.1:9000)端口, 等待nginx(或者其他的web服务器)将请求转过来.

    由于PHP独立运行了, 再修改PHP的配置, 就不需要重启web服务器(nginx)了, 重启PHP-FPM即可.

    • fpm配置文件
     cd /usr/local/php-fpm/
    
     # 生成配置文件
     cp etc/php-fpm.conf.default etc/php-fpm.conf
     
     cp etc/php-fpm.d/www.conf.default etc/php-fpm.d/www.conf
    
    • 修改配置文件
    vi etc/php-fpm.conf 如下
    daemonize = yes
    
    vi etc/php-fpm.d/www.conf
    user = web
    group = web
    listen = 127.0.0.1:9000
    
    • 开启: sbin/php-fpm

    3.配置Nginx将PHP请求转发给PHP-FPM

    nginx的配置文件结构:
    http段的server段, 就表示一台主机(虚拟主机).

    在每台虚拟主机, server段中, 提供对请求脚本的解析工作:
    location指令, 匹配请求的URL脚本. 以.php结尾的请求, 交给PHP-FPM处理

    编辑nginx配置文件,
    cd /usr/local/nginx/
    vi conf/nginx.conf
    将配置文件如下内容注释去掉, 以php结尾的文件, 转发到127.0.0.1:9000处理,

    user  web;
    location ~ \.php$ {
                root           html;
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                #修改如下内容(重要)
                fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                include        fastcgi_params;
            }
    
    
    • 重新加载nginx ./sbin/nginx -s reload
    • 在html下建立phpinfo.php文件, 输入
    <?php
    phpinfo();
    

    四. 虚拟主机的配置

    1. 增加虚拟主机

    http中的server就是一个虚拟主机
    增加server段, 就是增加虚拟主机

    • 在nginx.conf配置文件中 增加如下内容
    server {
            listen 8080;
            root /usr/local/nginx/html/shop;
    
            server_name shop.test.com;
            access_log logs/shop.log;
            error_page 404  /404.html;
            error_page 500 502 503 504 /50x.html;
    
            location / {
                    index   index.html      index.htm;
            }
            location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    include        fastcgi_params;
            }
        } 
    
    • 在./html/下创建shop文件夹,
    mkdir html/shop
    chown web:web html/shop/
    vi html/shop/phpinfo.php
    

    2. 支持pathinfo, 重写index.php规则

    nginx默认不支持pathinfo.
    pathinfo: URL的一部分, 请求脚本到请求参数间的部分, 称之为pathinfo.
    PHP程序要处理pathinfo, 前提是web服务器支持URL的pathinfo部分才可以.
    通过额外的解析pathinfo指令可以完成:

    location / {
                try_files $uri $uri/ /index.php?$query_string;
                index  index.html index.htm;
            }
    
    

    在 location ~ .php$ 解析段中, 增加分析pathinfo的功能

    location ~ \.php$ {
                    fastcgi_pass   127.0.0.1:9000;
                    fastcgi_index  index.php;
                    fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
                    # 增加如下两行
                    fastcgi_split_path_info ^(.+\.php)(.*)$;
                    fastcgi_param PATH_INFO $fastcgi_path_info;
                    
                    include        fastcgi_params;                
            }
    
    
    • 完整配置示例如下()
    server {
            listen       8888;
            server_name  localhost;
    
            root   /usr/local/nginx/html/shop;
            #charset koi8-r;
    
            #access_log  logs/host.access.log  main;
    
            location / {
                #重要
                try_files $uri $uri/ /index.php?$query_string;
                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$ {
                fastcgi_pass   127.0.0.1:9000;
                fastcgi_index  index.php;
                #fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
                fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_split_path_info ^(.+\.php)(/.+)$;
                fastcgi_param PATH_INFO $fastcgi_path_info;
                include        fastcgi_params;
            }
    
            # deny access to .htaccess files, if Apache's document root
            # concurs with nginx's one
            #
            #location ~ /\.ht {
            #    deny  all;
            #}
        }
    
    • 重新加载nginx

    五. 代理服务器Nginx

    浏览器会请求nginx服务器, nginx将请求转发给web服务器. 此时 站在浏览器的角度, nginx就代替(代理)了web服务器的功能, 称之为反向代理服务器.
    测试环境
    web02:nginx(192.168.1.132)
    web01:nginx(192.168.1.131)

    1. 配置

    • nginx支持的 proxy_pass的指令, 可以完成代理转发. 直接转发Http请求数据.
      演示如下: 在linux的nginx配置, 将请求抓发到别的web服务器上, 例如代理转发到web01的apache上.
    • 修改nginx的配置文件, 添加如下内容:
    server {
            # 监听8888端口
            listen 8888;
            # 配置域名
            server_name proxy.nginx.com;
            # 所有请求都转发到http://192.168.1.131:80上
            location / {
                    proxy_pass      http://192.168.1.131:80;
               proxy_next_upstream error timeout invalid_header http_500 http_502 http_503;
               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_redirect off;
    
            }
        }
    
    
    proxy_set_header Host $host; 请求的主机域名
    proxy_set_header X-Real-IP $remote_addr; 转的目标IP
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 转发的目标IP
    proxy_buffing off; 关闭nginx代理缓冲..
    

    2. 通过配置转发, 帮助ajax请求获取外域数据

    配置如下

    server {
            listen 8888;
            server_name proxy.nginx.com;
            location / {
                // 正常处理
            }
            #以ajax开头的请求, 做转发
            #其他正常处理
            location /ajax {
                    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://api.other.com;
            }
        }
    

    六. 负载均衡配置

    upstream 可以配置一个服务器集群
    通过配置, 可以实现动静分离

    #配置负载均衡
        server {
            listen 8999;
            server_name lb.nginx.com;
            location / {
                    root    html;
                    index   index.html index.htm;
                    # 定义规则
                    # 如果是html结尾, 就转发到html服务器上
                    # php转发到php上
                    # 其他, 则转发到静态资源上
                    # if和括号之间, 要有空格
                    if ($uri ~* \.html$){
                            # 服务器池
                            proxy_pass http://htmlservers;
                    }
                    if ($uri ~* \.php$){
                            proxy_pass http://phpservers;
                    }
    
                    proxy_pass http://picservers;
    
            }
        }
        # 定义服务器集群
        upstream htmlservers {
            server 192.168.1.131:80 weight=2;
            server 192.168.1.133:80 weight=1;
        }
        upstream phpservers {
            server 192.168.1.131:80;
            server 192.168.1.133:80;
        }
        upstream picservers {
            server 192.168.1.131:80;
            server 192.168.1.133:80;
        }
    
    

    相关文章

      网友评论

        本文标题:nginx+php坏境搭建+nginx实现代理以及负载均衡

        本文链接:https://www.haomeiwen.com/subject/ephmzxtx.html