最近用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:\trunk\src\websit 】,只用了单‘\’,导致nginx 把'\t'解析成一个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+Apache Yii2.0 配置方案相关推荐

  1. nginx 1.14 php,nginx 1.14.0 配置部署 thinkphp 5.1

    开始接触NGINX,配置tp5配了半天,找不到具体原因,于是用网上搜索到的配置复制粘贴搞定. 感谢 https://blog.csdn.net/qq_36431213/article/details/ ...

  2. 修改thinkphp配置nginx服务器,thinkphp5.0配置nginx重写规则

    thinkphp5.0配置nginx重写规则 2018年07月06日 09:29:03阅读数:1529 server { listen 80; #端口号 server_name demo.aa.com ...

  3. nginx 1.14.0 配置部署 thinkphp 5.1

    开始接触NGINX,配置tp5配了半天,找不到具体原因,于是用网上搜索到的配置复制粘贴搞定. 感谢 https://blog.csdn.net/qq_36431213/article/details/ ...

  4. yii2 nginx php配置,求助-yii2在nginx上的rewrite配置

    本文讲的是nginx配置yii2.0重写的例子, apache和nginx比起来,我更倾向nginx,占用资源少,且性能高,不管是开发还是生产环境都很好用.那么,如何配置nginx让其支持yii2.0 ...

  5. 域名邮箱|Yii2.0使用QQ域名邮箱发送邮件

    当然是先有域名,我的域名是在腾讯云注册的 http://domain.mail.qq.com/ 点击创建域名邮箱,先登录一个QQ邮箱作为管理员 根据提示操作 完成上面这个,各自注册商方法不一样,一般都 ...

  6. [转]配置nginx+apache 其中动态由apache处理,静态由nginx处理

    转载自: http://blog.lubingit.com/post/86/  大 | 中 | 小   http://forum.ubuntu.org.cn/viewtopic.php?t=26084 ...

  7. 阿里云免费SSL证书申请与安装使用-附Nginx,Apache,IIS 6,IIS 8配置SSL教程

    大家直接跳转吧:http://www.07net01.com/2017/01/1795676.html 也许是看到了Https是未来发展的大趋势,Symantec 和GeoTrust 两大SSL公司最 ...

  8. Apache 2.0性能优化—MPM的选择与配置

    Apache 2.0性能优化-MPM的选择与配置 谈到Apache,大多数系统管理员对其稳定版1.3印象颇深.虽然Apache 2.0的系列开发版早已由Alpha.Beta发展到现在的GA(Gener ...

  9. php fpm apache nginx_安装配置Nginx/Apache+PHP-fpm服务环境

    最近上了一批debian7的机器,刚好有web项目要上,debian7中已经把php-fpm集成进去了,打算把以前的apache+mod_php模式换成nginx+php-fpm或者apache+ph ...

最新文章

  1. iOS 关于Blocks
  2. [20180627]测试bbed是否支持管道命令.txt
  3. Android之关于Intent的Flag属性的讲解
  4. 面向对象编程 封装 继承 多态(三大特征)(第三篇)
  5. SQL Server安装文件挂起错误解决办法
  6. 硬币找零问题,动态规划基础,百度面试题
  7. the dhc driver package_DHC智商低?不,它用1k阅读,444个好看证明了自己
  8. Qt总结之二十二:Qt控件QObject
  9. C语言——变量篇(一)变量关键字static、auto、extern、register
  10. jquery扩展 $.fn
  11. matplotlib绘图(折线图,直方图,柱状图,饼图,散点图,三维,动图)
  12. Unity外部资源无法拖入Unity
  13. 1口百兆光纤收发器工业导轨式发送机接收机1百兆光1百兆电工业以太网光纤收发器
  14. [转贴]馒头的N种吃法
  15. Visual Assist 配色
  16. VC中画基准线,随鼠标移动
  17. 【LeetCode】1905-统计子岛屿
  18. inventor如何钣金出弧面_Inventor钣金造型教程
  19. Ubcoin市场:加密货币-商品交易平台
  20. 微软小娜 服务器连不上网,win10小娜怎么连不上网 win10小娜没反应怎么回事

热门文章

  1. displaytag 导出
  2. C++负数、小数如何保存
  3. map函数的简单用法。
  4. 计算机 电脑 系统安装教程,安装电脑的操作系统的方法
  5. java中静态方法可以被继承_关于java:静态方法中的继承
  6. java 2分钟_java – 为什么我的应用程序启动时间超过2分钟?
  7. php和架构,结构和架构的区别是什么?
  8. java 默认数据库创建路径_无法创建数据库路径文件:/ user / hive /仓库错误
  9. fork() || fork() || fork() 与 fork() fork() fork()
  10. 初识Linux C线程