nginx 做laravel的https前代

前两天出去一趟,发现在国外竟然无法通过http连接国内的动态ip的服务器了,即使是非标准的都不可以,但https却无问题,那么,来加密吧。

弄了之后,发现了两个问题

  • 跳转的链接还是http的

这个在网上找了下,发现了下面的函数可以强制走https

URL::forceSchema("https");
  • 在登录后跳转到指定目标地址,自动转换为http了

经过不断的调试排错,最后发现是关于反向代理的时候,需要设置一个信任代理的列表,这个列表默认为空的,最简单的方式就是使用下面的,信任所有ip

Request::setTrustedProxies(['0.0.0.0/0']);

其他的关于nginx的配置,随便抄个就行

canphp小补丁一枚

我在应用中使用多级目录,但按照canphp的解析,函数名字中就带了’/’字符,比如/a/b/c,变成调用a::’b/c’这个函数,而b/c并不能作为一个函数声明,至少我不会 ::问题

通过分析canphp,在执行一步,函数会调用method_exists函数来确定是否存在函数,如果不 存在的话,则抛出异常

解决的方式

在php中存在一个__call函数,可以将函数拦截,转而调用真实的函数,我不精通php,不知 道在php中该如何称呼,我一般成为函数的拦截。

需要修改的地方

canphp文件core/cpApp.class.php中,下面的一处,小修改一下:

throw new Exception(self::$action."操作方法在" . $mo    dule . "模块中不存在");

修改后的代码:

try {
$object->$action();
} catch( Exception $e) {
 throw new Exception(self::$action."操作方法在" . $mo    dule . "模块中不存在");
}

使用的方法

比如/a/b/c,在aMod.class.php函数中,实现如下代码:

class aMod {
function startsWith($haystack, $needle)
         {
                     return $needle === "" || strpos($haystack, $needle) ===     0;
         }

function b_c_fun()
{
echo "call here";
}
function __call($method, $args)
{
if ($this->startsWidth($method, "b/c")) {
$this->b_c_fun();
}
}
}

nginx使用rewrite机制实现缓存

问题起始的需求

为了某个傻傻的想法,将所有的动态的页面变成静态页面。因为图像之类的保存位置也是在 数据库中,因此,这些统统都变成了php的访问请求

碰到的问题症状

进行了问题解决之后,发现图像之类的每次都需要从服务器上下载,这样对服务器的压力比 较大,而这些图片大部分都没有进行过任何更改

解决的思路

通过在服务器上创建一个缓存的文件,如果缓存文件不存在的时候,再请求php执行,在php 执行过程中,顺便将新的文件放置到缓存文件中,这样 下次的下次 的请求的时候,就会 出现文件未修改(服务器返回304),就不需要从服务器上再次下载了。

nginx的配置

if (!-f $latex request_filename) {
  rewrite "^/dev/getfile/(.+)$" /dev/getfile.php?$1& last;
 }

我在getfile.php中将所有允许缓存的文件都放在/dev/getfile目录下,因此,在请求时, 如果缓存文件存在的话,就不调用getfile.php文件,如果不存在的话,则调用getfile.php, 而在getfile.php中,会将不存在的文件重新创建到指定目录下,这样依赖,在 下次 调 用的时候,由于是新文件,则不调用getfile.php文件而重新传输,在 下次的下次 调用 的时候,文件未更改则不用重新传输了。

openwrt相关配置(2):http服务器相关配置

我的openwrt上运行的http服务器是nginx,相比lighthttp,nginx更高
效些,占用资源感觉更少些。对于自带的uhttp服务,只能保留,不然路由
器的网络界面就没办法进入了。如上篇所说,修改了默认的uhttpd服务器
端口号,这样nginx作为主要的http服务器界面出来了。

以下是nginx的相关配置,这里我将文件分开存放了,这样比较直观,
而且,配置的nginx,只支持一个站点,毕竟,路由器的资源很有限。

       user nobody nogroup;
       worker_processes  1;
       #error_log  logs/error.log;
       #error_log  logs/error.log  notice;
       #error_log  logs/error.log  info;
       #pid        logs/nginx.pid;
       events {
       worker_connections  1024;
       use epoll; #使用epoll,更高效,我在实际使用过程中,感受不到,获取是自己从来不曾注意
       multi_accept on;
       }

       http {
       include       mime.types;
       include wordpress.conf; #wordpress的相关配置,会引用php的配置文件
       default_type  application/octet-stream;
       sendfile        on;
       keepalive_timeout  65; #修改超时时间
       }
       

其他的内容都删除或者注释掉了。下面是核心的wordpress配置相关的
内容了:

继续阅读openwrt相关配置(2):http服务器相关配置

openwrt相关配置(1):软件列表及杂项配置

先记录在这里,以后有了新的再更新:

       opkg update
       opkg install
bash   #shell
blkid   #查看磁盘ID,挂载磁盘使用
block-mount #挂载磁盘
coreutils
coreutils-ls #emacs需要
coreutils-stty #emacs需要
curl           #下载
ddns-scripts #动态dns
fdisk        #察看磁盘分区
kmod-fs-ext4 #U盘分区格式支持
kmod-gre     #vpn分流使用
kmod-mppe    #pptp vpn使用
kmod-nls-base #忘了,好像是文件系统依赖
kmod-nls-utf8 ##忘了,好像是文件系统依赖
kmod-ppp      #vpn使用
kmod-pptp     #vpn使用
kmod-scsi-core #挂载磁盘
kmod-usb-core  #挂载磁盘
kmod-usb-ohci  #挂载磁盘
kmod-usb-storage #挂载磁盘
kmod-usb-storage-extras #挂载磁盘
kmod-usb2               #usb2.0 挂载磁盘
luci-app-ddns           #网页配置ddns
luci-app-samba          #网页配置samba服务器
luci-app-upnp           #网页配置upnp服务
luci-i18n-chinese       #网页中文语言支持
miniupnpd               #upnp支持
mysql-server            #mysql服务器
nginx                   #nginx http服务器
openssh-keygen          #openssh服务器需要
openssh-server          #openssh服务器,关键是支持端口转发等可用来翻墙的功能
openssh-sftp-server     #openssh自带的sftp服务
php5                    #php5
php5-fastcgi            #php5-fastcgi,nginx需要
php5-mod-ctype          #php模块
php5-mod-curl           #php模块
php5-mod-exif           #php模块
php5-mod-fileinfo       #php模块
php5-mod-ftp            #php模块
php5-mod-gd             #php模块
php5-mod-gettext        #php模块
php5-mod-hash           #php模块
php5-mod-iconv          #php模块
php5-mod-json           #php模块
php5-mod-libevent       #php模块
php5-mod-mbstring       #php模块
php5-mod-mcrypt         #php模块
php5-mod-mysql          #php模块
php5-mod-openssl        #php模块
php5-mod-session        #php模块
php5-mod-sockets        #php模块
php5-mod-xml            #php模块
php5-mod-xmlreader      #php模块
php5-mod-xmlwriter      #php模块
php5-mod-zip            #php模块
ppp-mod-pptp            #vpn的pptp模式
samba36-server #nfs服务器
subversion-client #subversion库,定时检查hosts文件的脚本需要使用subversion
subversion-libs #subversion库,定时检查hosts文件的脚本需要使用subversion
swap-utils #swap分区工具
vsftpd #ftp服务其
zlib #压缩与解压做
zoneinfo-asia #亚洲区域支持
zoneinfo-core #php需要
       

软件的各部分功能就像注释中所写,里面最多的就是php部分了,一些模块并不是必须的,只是我有时会随便检查一下什么的,就将常用的都安装了。

安装完软件最好直接重启下,相关服务先都不要启用。

ssh服务器的相关配置

修改dropbear服务器的端口为非22端口(/etc/dropbear),因为我使用openssh服务器,而不是自带的。

修改openssh服务器配置(/etc/ssh/sshd_config),添加GatewayPorts yes和Compression yes两项,前一个打开端口转发,后一个启用压缩,可以提高传输速度

http服务器相关配置

修改uhttpd服务器的端口为非80端口(/etc/uhttpd),因为我要将nginx的服务器作为主要使用的http服务器

其他的零碎配置根据自己需要了。

关于翻墙的配置可参照《openwrt vpn自动分流翻墙》

我用的是Buffalo WZR-HP-AG300H,如果刷成了砖,可参照《openwrt的一些设置》

如果网络像我现在的网络一样的非常频繁的抽风,可修改/etc/ppp/options中的lcp-echo-failure和lcp-echo-interval两个值,默认分别为5和1,这样的话,如果网络卡住5秒钟的话,路由器就会判断掉线,进行重播,增大这两个值其实是降低判断的严格性。