用Nginx反代运行于Apache的Laravel

很早之前,我把自己的vps从apache切换到了nginx,那时候是因为vps性能不好,能省就省。

后来经常遇到php5-fpm挂掉等各种情况导致跑php程序经常会502,于是,从去年开始,我开始将我的php站点逐步切换至apache,并使用nginx进行反代。

这时候,其实很想吐槽php,还得弄个apache来跑….

后来,当开始反代一些laravel写的网站的时候,遇到了一些坑,所以写这篇文章记录下。

Apache配置

假设我们这里用9000端口在apache监听了一个vhost,具体配置就不写了XD

Nginx配置

http的vhost配置:

server {
        listen   80; 
        server_name example.com;  
        location / { 
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forward-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;   
        proxy_redirect      http://127.0.0.1:9000 http://example.com;
        }
}

如果是https反代,我们需要进行额外的配置:

    location / { 
        proxy_pass http://127.0.0.1:9000;
        proxy_set_header Host $host:$server_port;
        proxy_set_header X-Forward-For $remote_addr;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-Ssl on;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-SSL 1; 
        proxy_set_header SSL '1';    
        proxy_redirect      http://127.0.0.1:9000 https://example.com; 
        }

注意新增的几个ssl相关的配置来告诉Laravel是ssl访问哦,同时,我们还要配置下Laravel。

Laravel 配置

以下配置以Laravel5.2为例。

在 app\Providers\RouteServiceProvider.php 中,我们需要修改以下函数:

public function boot(Router $router)
    {
        //
        Request::setTrustedProxies( [
            '127.0.0.1',
            // 如果通过其他server进行反代,修改下面的ip段 
            '104.16.0.0/12', 
        ] );

        parent::boot($router);
    }

至此,反代的laravel app中,通过assets(),url()等函数产生的url都会是https.

Show Comments