首页 > Nginx+Apache Yii2.0 配置方案

Nginx+Apache Yii2.0 配置方案

  最近用Yii2.0框架做了个小项目,虽然项目本身业务逻辑不复杂,但是由于本身业务逻辑的特殊性,在上午9点到12点之间系统访问量会突然上升(浏览量和用户上传文件量)。导致系统单纯的部署在Apache下,支撑不了这么多的并发数;单独部署Nginx又由于用户频繁的提交数据,出现大量的502错误。然后又由于各方面的原因,就想通过Nginx+Apache的方式来暂时性的解决这个问题。

  安装apache和nginx的过程就跳过了。apache 监听的是 8080 端口,nginx 监听的是80端口。先贴出apache和nginx的配置内容,再来说下踩过的几个坑。

  apache vhost 相关配置

1 <VirtualHost *:8080>
2     DocumentRoot "/www/wwwroot/website/web"
3     DirectoryIndex index.php
4     ServerName crm.yangcoder.com
5     ErrorLog "logs/crm-error.log"
6     CustomLog "logs/crm-access.log" common
7 VirtualHost>

  nginx 相关配置

 1 upstream crm_cluster{
 2     server crm.yangcoder.com:8080;
 3     #server crm.yangcoder.com:81;
 4     #server crm.yangcoder.com:82;
 5 }
 6 server {
 7     listen       80;
 8     server_name  crm.yangcoder.com;
 9 
10     #charset koi8-r;
11     access_log logs/crm.yangcoder.access.log;
12     error_log  logs/crm.yangcoder.error.log;
13     root E:\projects\project\trunk\intracompany\crm\backend\web;
14     index  index.php index.html index.htm;
15     
16     location / {
17         #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
18         proxy_set_header Host $host;                    
19         proxy_set_header X-Real-IP $remote_addr;
20         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
21         proxy_set_header  X-Forwarded-Protocol  $scheme;
22         proxy_set_header  PATH-INFO $request_uri;
23         add_header backendIP $upstream_addr;
24         add_header backendCode $upstream_status;
25    
26         #禁用缓存
27         proxy_buffering off;
28         #反向代理的地址
29         proxy_pass   http://crm_cluster;
30         
31         if ($request_filename ~* ^.*?.(txt|pdf|doc|xls|xlsx)$){ 
32             add_header Content-Disposition: 'attachment;'; 
33 
34         } 
35     }
36 
37 
38     #error_page  404              /404.html;
39 
40     # redirect server error pages to the static page /50x.html
41     #
42     error_page   500 502 503 504  /50x.html;
43     location = /50x.html {
44         root E:\projects\project\trunk\intracompany\crm\backend\web;
45     }
46 
47     # proxy the PHP scripts to Apache listening on 127.0.0.1:80
48     #
49     #location ~ .php$ {
50     #    try_files $uri =404;
51     #    proxy_redirect   off;
52     #    #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
53     #    proxy_set_header Host $host;                    
54     #    proxy_set_header X-Real-IP $remote_addr;
55     #    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
56     #    proxy_set_header  X-Forwarded-Protocol  $scheme;
57     #    proxy_set_header  PATH-INFO $request_uri;
58     #    add_header backendIP $upstream_addr;
59     #    add_header backendCode $upstream_status;
60     #
61     #    #禁用缓存
62     #    proxy_buffering off;
63     #    #反向代理的地址
64     #    proxy_pass   http://crm_cluster;
65     #}
66 
67     
68     
69     location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$
70     {
71         expires 30d;
72     }
73     
74     location ~ .*.(js|css)?$
75     {
76         expires 30d;
77     }
78 }

 

      通过测试,能够成功实现动态访问走apache,静态资源访问走nginx。稍微缓解了,项目的压力。

  踩过的坑:

  1、在本机调试时,访问动态内容没又问题,但是访问静态资源时出现500的错误。找了好久,最后发现是:【root D: runksrcwebsit 】,只用了单‘’,导致nginx 把' '解析成一个tab空格了。相当的囧。换成'\'就可以了。

  2、Yii2.0 开启了Url美化功能后,导致转发的动态访问出现404或者只能访问默认首页。找了官方教程和网上的方法,用nginx或者apahce单独部署是可以的。但是使用nginx+apache结合就不行。

    比如:如下解决方案

    

1 location / {  
2 
3     if (!-e $request_filename){  
4 
5         rewrite ^/(.*) /index.php last;  
6 
7     }  
8 
9 }

  通过日志分析:假设我们访问:crm.yangcoder.com/system/msg 这个时候nginx转发给apache的是:crm.yangcoder.com/index.php/system/msg 。很明显程序处理不了这个路由。

  后来在顺着这个思路在网上找到了一个方法。就是添加如下配置:

  

 1 location / {
 2                 #设置主机头和客户端真实地址,以便服务器获取客户端真实IP
 3                 proxy_set_header Host $host;                    
 4                 proxy_set_header X-Real-IP $remote_addr;
 5                 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
 6                 proxy_set_header  X-Forwarded-Protocol  $scheme;
 7                 proxy_set_header  PATH-INFO $request_uri;
 8            
 9                 #禁用缓存
10                 proxy_buffering off;
11                 #反向代理的地址
12                 proxy_pass   http://crm_cluster;
13         
14             if ($request_filename ~* ^.*?.(txt|pdf|doc|xls|xlsx)$){ 
15                 add_header Content-Disposition: 'attachment;'; 
16 
17             } 
18         }

  这样就可以正常访问了。

  访问结果如下图:

  图1,访问首页,显示请求被转发到了8080端口上。

  

  图2,访问静态资源

  

 

  3、在同一台电脑上还测试了负载均衡的效果。唯一的问题是,由于项目后台部分,使用了Yii2.0的资源管理,在访问的时候,不同的服务器生成的静态资源路径不统一。导致有时候静态资源加载出现404错误。如果前端要解决该问题,个人觉得可行的方法除了同步多服务器代码文件外,还有就是静态资源文件单独存放。

1 upstream crm_cluster{
2     server crm.yangcoder.com:8080;
3     server crm.yangcoder.com:81;
4     server crm.yangcoder.com:82;
5 }

  4、当然针对当前项目的逻辑而言,这个方案并不是最优解决方案。其实通过分析,我们的瓶颈并不是出现在程序、数据查询上,而是出现在用户同一时间段大量上传图片占用大量上行带宽上。这一方案目前还能支撑住当前访问量,8M带宽,6000+活跃用户在同一时间段内上传图片,统计发现在上午9点到12点之间带宽的上行带宽统计是一条平行线。下一步我们想在目前的基础上介入第三方对象存储和CDN服务,来优化当前方案。

  

 

转载于:https://www.cnblogs.com/yangcoder/p/10109629.html

更多相关:

  • 软件包如下:nginx-1.10.0.tar.gznginx-http-concat-master.zipngx_cache_purge-2.3.tar.gzopenssl-1.0.2h.tar.gzpcre-8.39.tar.gzzlib-1.2.8.tar.gz ngin部署方法:上面的安装包都存放在/apps/svr/soft目...

  • 知识点:   server的语法:   upstream语法:     upstream中192.168.100.1不是ip只是个标识,只要和下面的proxy_pass 对应即可。   基于IP的虚拟主机:     listen和server_name中多加上端口也没问题     listen可以监听在虚拟ip上面   代码: ups...

  • 编译Apache时要进行的设置./configure --enable-mods-shared="all proxy"1>修改 httpd.conf 文件中:LoadModule proxy_module modules/mod_proxy.soLoadModule proxy_connect_module modules/mod_p...

  • 目录结构:client:#!/usr/bin/env python# -*-coding:utf-8 -*-import socket, struct, jsondownload_dir = r'D:Pythonpython_learninggdcodepart32网络编程文件传输clientdownload'gd...

  • 1. set的初始化 set可以这样初始化 set iset{ 1,2,3 }; set iset2 = { 1,2,3 }; 在初始化set的时候,若出现重复的元素 set iset3{ 1,2,3,3,3 }; set iset4 = { 1,2,3,3,3 };...

  •     Set 对象存储的值总是唯一的 Set 对象方法 方法描述add添加某个值,返回Set对象本身。clear删除所有的键/值对,没有返回值。delete删除某个键,返回true。如果删除失败,返回false。forEach对每个元素执行指定操作。has返回一个布尔值,表示某个键是否在当前 Set 对象之中。 Set 对象...

  • 我现在的vimrc配置文件 runtime! debian.vim "设置编码 set encoding=utf-8 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936 set fileencodings=utf-8,ucs-bom,chinese"语言设置...

  • ACCEPT acm作业 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=204 因为老师是在集合那里要我们做这道题。所以我很是天真的就以为要用集合做,结果发现网上都是用数组简单明了地实现了,显得我的代码,特么地超级恶心!!!!!!! 在这里存档一下,别人就不要看了...

  • USE [svnhost]GO/****** 对象:  StoredProcedure [dbo].[up_Page2005]    脚本日期: 05/21/2008 11:27:05 ******/SET ANSI_NULLS ONGOSET QUOTED_IDENTIFIER ONGOCREATE proc [dbo].[up_P...