当前位置: 首页 > 编程日记 > 正文

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:\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

相关文章:

RobotFramework下的http接口自动化Set Request Body 关键字的使用

Set Request Body关键字用来设置http 请求时的body 信息&#xff0c;尤其是在post 请求时&#xff0c;经常需要用到这个关键字。 该关键字接收一个参数&#xff0c;[ body ] 示例1&#xff1a;登录博客园&#xff08;http://www.cnblogs.com/&#xff09;时&#xff0c;设置登录…

JDK11使用IDEA,配置JavaFX

JDK11使用IDEA&#xff0c;配置JavaFX1.下载javaFX相关的包2.在实际Demo中试验哪里少了添加哪里导入lib文件夹&#xff0c;之后点击OK配置VMoption配置成功3.运行&#xff0c;大功告成1.下载javaFX相关的包 需要下载对应的包&#xff0c;进入openjfx.cn网站下载 https://gluon…

写了一个PPT,用于公司内部培训

匆忙写成&#xff0c;以后会慢慢补充请用力一击中等规模的并发程序设计http://files.cnblogs.com/jobs/2007-5-9-concurrent-ppt.rar2007-5-10修改版&#xff08;带参考文档&#xff09;http://files.cnblogs.com/jobs/2007-5-10-concurrent-ppt.rar转载于:https://www.cnblogs…

终端bash美化(FC)

终端bash美化(FC) 用Linux也已经一年多了&#xff0c;感觉几乎还是什么都不会。大概是一直再做一些没多大意义的事的缘故吧&#xff0c;就像今天些的内容一样。以前搞了一段时间的GENTOO&#xff0c;发现里面的bash提示&#xff08;也就是&#xff3b;userhostname directory]$…

List and ArrayList

List<> and ArrayList Class DiagramsUsing the Bit Complement of the BinarySearch() Result代码1using System; 2using System.Collections.Generic; 3class Program 4{ 5 static void Main() 6 { 7 List<string> list new List<string>();…

spring boot jpa 整合

1&#xff0c;Eclipse JPA Tool配置 https://www.cnblogs.com/wgslucky/p/10109300.html 2&#xff0c;项目地址 https://gitee.com/wgslucky/springboot-jpa 转载于:https://www.cnblogs.com/wgslucky/p/10109869.html

安装JDK1.8+环境配置

安装JDK1.8环境配置1.下载JDK2.安装JDK3.环境配置3.1 新建系统变量3.2 添加Path路径3.3 使用cmd命令行验证是否环境配置成功1.下载JDK 直接官网下载&#xff1a;http://www.oracle.com 下载链接https://www.oracle.com/java/technologies/javase-downloads.html#JDK8 选择自己…

Nodejs.热部署方法

在开发中我们修改了一点代码后要去重启服务器才能看到结果&#xff0c;为了省去这个过程我们以往经常使用热部署代码的方法 下面是使用“supervisor”来达到热部署能力的方法: sudo npm install -g supervisor #安装 supervisor app.js #启动 如果碰到如下提示, 则表示路径没…

SortedList 泛型类

SortedList 泛型类 请参见 示例 成员 全部折叠 全部展开 语言筛选器&#xff1a; 全部 语言筛选器&#xff1a; 多个 语言筛选器&#xff1a; Visual Basic 语言筛选器&#xff1a; C# 语言筛选器&#xff1a; C语言筛选器&#xff1a; J# 语言筛选器&#xff1a; JScri…

中国现代化进程专题讲座——有感

最近有上段治文老师的中国现代化进程这门课&#xff0c;感觉受益颇多。 从国外到国内&#xff0c;从古代到如今&#xff0c;讲论点、论据&#xff0c;评论历史人物、历史事件&#xff0c;讲的很宏大&#xff0c;很深刻。我并没有特意捧他&#xff0c;而是深深被其思想的深刻、言…

java运行出现JNI错误,JDK8和JDK11都安装了

java运行出现JNI错误&#xff0c;JDK8和JDK11都安装了1. 问题描述2. 尝试办法3. 解决办法3.1 解决方法&#xff1a;3.2 测试结果成功1. 问题描述 因为编程的需要&#xff0c;所以我安装了JDK8和JDK11&#xff0c;在安装好了之后配置好了环境变量&#xff0c;之后打开Eclipse的…

爱不释手(Typingfaster)1.78beta,重大升级,欢迎试用,期待反馈。

爱不释手1.78测试版主要有以下改进&#xff1a;1、改进内核&#xff0c;大幅度提高了屏显速度&#xff1b;2、增加文章分段显示功能&#xff1b;3、增加每秒按键次数统计&#xff1b;4、测试结果中划分了实际速度与名义速度&#xff0c;即实际速度&#xff1d;名义速度准确率&a…

php 网站内容采集器 Snoopy

Snoopy转载于:https://www.cnblogs.com/buxiangxin/p/7245580.html

[转]笑话: 耐力惊人的三只乌龟

某日&#xff0c;龟爸、龟妈、龟儿子三只乌龟&#xff0c;决议去郊游。带了一个山东大饼&#xff0c;和两罐海底鸡出发到XX山去。 苦爬十年&#xff0c;终於到了。席地而坐&#xff0c;卸下装备&#xff0c;准备进食。****~~~该死&#xff01;&#xff01;没带开罐器&#xff0…

如何解决代码中if…else 过多的问题

前言 if...else 是所有高级编程语言都有的必备功能。但现实中的代码往往存在着过多的 if...else。虽然 if...else 是必须的&#xff0c;但滥用 if...else 会对代码的可读性、可维护性造成很大伤害&#xff0c;进而危害到整个软件系统。现在软件开发领域出现了很多新技术、新概念…

Facial keypoints detection Kaggle 竞赛系列

3.2# Facial keypoints detection 作者&#xff1a;Stu. RuiQQ: 1026163725原文链接&#xff1a;http://blog.csdn.net/i_love_home/article/details/51051888该题主要任务是检測面部关键点位置 Detect the location of keypoints on face images 问题表述 在本问题中。要求计算…

Error:java: 无效的源发行版: 11

Error:java: 无效的源发行版: 111.问题描述2.原因查找3.解决办法3.1 打开IDEA的File—Project Structure设置3.2 修改Project SDK为自己想要切换的版本3.3 修改project languang level1.问题描述 在我的电脑中同时安装了JDK8和JDK11&#xff0c;之前本来调试好了的&#xff0c…

今天看论坛,有这样一句话,深有同感,还是家里好

就像孟宣后来对这个城市的评价&#xff1a;“这里的人活的才像人……就像那么发达国家的小城市&#xff0c;不用背负那么大的生存压力。在北京&#xff0c;如果你每天生活要30个馒头&#xff0c;那么你要挣到200到300个。而在这里&#xff0c;只需要30个馒头就可以了……”转载…

面对别人强行关机你怎么办与 定时关机

面对这个图你的第一感觉是什么?肯定是有人.....那你怎么办呢?让它继续下去!不能绝对不能!以前比较幸运的打开了几个记事本没有保存逃过了一关,可是屡试不爽呐!直到我同学出现这种情况时,幸亏我眼快,呵呵 所以问他一下!知道了这个玩意出来的命令是在运行里敲入shutdown -s如果…

iOS开发实战-基于SpriteKit的FlappyBird小游戏

写在前面 最近一直在忙自己的维P恩的事情 公司项目也是一团乱 于是...随手找了个游戏项目改了改就上线了,就当充数了. SpriteKit简介 SpriteKit是iOS 7之后苹果推出的2D游戏框架。它支持2D游戏中各种功能&#xff0c;如物理引擎&#xff0c;地图编辑&#xff0c;粒子&#xff0…

2018年12月14日 函数 总结

map() 处理序列中每个元素&#xff0c;得到迭代器&#xff0c;该迭代器 元素个数和位置与原来一致 filter() 遍历序列中的每个元素&#xff0c;判断每个元素得到布尔值&#xff0c;如果是true则留下来 people[{name:"abc","age":100},{"name":&…

UML类图新手入门级介绍

UML类图新手入门级介绍 看了大话设计模式&#xff0c;觉得很生动形象&#xff0c;比较适合于我这种初学者理解面向对象&#xff0c;所以就记录了一下。 举一个简单的例子&#xff0c;来看这样一副图&#xff0c;其中就包括了UML类图中的基本图示法。 首先&#xff0c;看动物矩形…

SQL中获取刚插入记录时对应的自增列的值

--创建数据库和表create database MyDataBaseuse MyDataBasecreate table mytable(id int identity(1,1),name varchar(20))--执行这个SQL,就能查出来刚插入记录对应的自增列的值insert into mytable values(李四)select identity转载于:https://www.cnblogs.com/bnjbl/archive…

SQL Server开发人员应聘常被问的问题妙解汇总

目前在职场中很难找到非常合格的数据库开发人员。我的一个同事曾经说过:“SQL开发是一门语言&#xff0c;它很容易学&#xff0c;但是很难掌握。” 在面试应聘的SQL Server数据库开发人员时&#xff0c;我运用了一套标准的基准技术问题。下面这些问题是我觉得能够真正有助于淘汰…

little w and Soda(思维题)

链接&#xff1a;https://ac.nowcoder.com/acm/contest/297/A 来源&#xff1a;牛客网 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 不知道你听没听说过这样一个脑筋急…

[导入]实时数据库的经典书

有个朋友给我来了一封邮件&#xff0c;在邮件中&#xff0c;他这样写到&#xff1a;“国外的实时数据库来势汹汹&#xff0c;价格一路上扬&#xff1b;想当初eDNA 2003年刚到中国时也就是二、三十万左右&#xff0c;现在报价已经百万以前了。心里也总个一个结&#xff0c;难道这…

关于CSS(3)

盒子模型 盒子 盒子关系&#xff08;标准文档流&#xff09; 行内元素。 只可以设置左右外边距。 上下内边距会影响相邻的圆块状元素呢 垂直margin会合并(margin坍陷)元素嵌套的时候&#xff0c;设置子元素的上margin会被父元素抢走&#xff0c; 解决方案&#xff1a;设置父元素…

jMonkey Engine SDK3 中文乱码问题

1. 升级到了jMonkey Engine SDK 3之后出现了一些方框&#xff0c;乱码问题 官方推荐初学者使用jME3 SDK来开发游戏。官方下载地址为&#xff1a; https://github.com/jMonkeyEngine/sdk/releases 2. 问题分析和解决办法 在jME3.1.0之后SDK就有一个bug&#xff0c;菜单上的中文…

第四天上午 休闲假日

第四天晚上要离开沙巴&#xff0c;赶往吉隆坡了&#xff0c;所以这天的活动安排非常简单。 睡了一个舒服觉&#xff0c;起床吃早饭&#xff0c;我胃口还是不好&#xff0c;吃不下Magellan的美味早餐。早餐后我们来到酒店的游泳池旁休息&#xff0c;晒晒太阳、吹吹海风、看看风景…

expect--自动批量分发公钥脚本

1.在使用之前&#xff0c;先安装epel源&#xff0c;yum install expect -y2.写分发脚本&#xff0c;后缀为exp #!/usr/bin/expect set host_ip [lindex $argv 0] spawn ssh-copy-id -i /root/.ssh/id_rsa.pub $host_ip expect {-timeout 60"(yes/no)?" { send "…