服务器的简单反代

啥是反代

反向代理
其中一个作用就是隐藏源服务器,比如你的服务器存储着大量的盗版数据,你就很有必要把你的DCMA ignore的主机给隐藏起来。当然顺带还可以做缓存相关啦,好处多多。。。

上游源服务器

server
{
listen 80;
server_name www.example.com;
index index.html index.htm index.php;
root /home/wwwroot/movie/public;

charset utf-8;
location / {
allow 2.3.4.5; //仅允许反代服务器过来获取数据
deny all;
try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt { access_log off; log_not_found off; }

location ~ .*\.(js|css|png|jpg|ico)?$
{
allow 2.3.4.5;
deny all;
expires 2h;
}

error_page 404 /index.php;

sendfile off;

location ~ \.php$ {
allow 2.3.4.5;
deny all;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fastcgi.conf;
}

location ~ /\.ht {
deny all;
}
access_log /home/wwwlogs/movie.log access;
error_log /home/wwwlogs/error_movie.log;
}

下游反代服务器

proxy_temp_path   /var/www/temp 1 2;
proxy_cache_path /var/www/cache levels=1:2 keys_zone=one:100m inactive=1d max_size=10g;
upstream source_server_alias {
server 1.2.3.4 max_fails=3 fail_timeout=10s; # 上游IP地址
}
server {
listen 80;
server_name www.new-example.com; # 对用户访问的域名
# 采用一定的缓存策略
location / {
proxy_cache one;
proxy_cache_valid 200 302 10m;
proxy_cache_valid 404 10m;
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com"; # 带上源站域名访问(隐藏源服务器)
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_cache_key $host$request_uri;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie; # 忽略上游提供的缓存头部,由反代服务器自行决定缓存逻辑
add_header X-Cache-Status $upstream_cache_status; # 显示缓存命中情况
expires 10m; 缓存过期时间
}

# 不缓存某些请求域,直接请求源站
location ^~ /dt/ {
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
}

location /resource/ {
proxy_cache one;
proxy_cache_valid 200 302 1d;
proxy_cache_valid 404 10m;
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_cache_key $host$request_uri;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
add_header X-Cache-Status $upstream_cache_status;
expires 1d;
}

# 图片相关的均缓存10天
location ~ .*\.(js|css|png|jpg|ico)?$ {
proxy_cache one;
proxy_cache_valid 200 302 10d;
proxy_cache_valid 404 10m;
proxy_pass http://source_server_alias;
proxy_set_header Host "www.example.com";
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header User-Agent $http_user_agent;
proxy_cache_key $host$request_uri;
proxy_ignore_headers X-Accel-Expires Expires Cache-Control Set-Cookie;
add_header X-Cache-Status $upstream_cache_status;
expires 10d;
}
}

NFS简单折腾

NFS是干什么用的

简单的解释A服务器可以直接把B服务器的磁盘或文件映射到A服务器自己的文件系统中,这样A服务器就可以像操作本地文件一来操作其他服务器上面的文件

Server端

以CentOS 6.5为例

安装相关nfs相关软件

yum install nfs-utils nfs-utils-lib

配置nfs开机自启动

chkconfig nfs on 
service rpcbind start
service nfs start

设置共享目录

创建或编辑配置文件:/etc/exports
添加如下一行配置文件

/home/wwwroot/movie/public/ 106.186.99.222(rw,sync,anongid=501,anonuid=501,no_subtree_check)

  • 目录地址表示待共享的目录
  • IP地址表示客户端的IP
  • rw 表示允许客户端读写NFS上的文件
  • sync 表示同步确认
  • anongid 表示文件所属组ID
  • anonuid 表示文件所属用户ID
  • no_subtree_check 表示关闭子目录权限检查

注意上面的是anongid和anonuid是用户指定在clicnt端新增或修改的文件的权限,统一压成Server机上的uid为501,组id为501的权限。
设置完配置的时候,重新导入配置文件

exportfs -a

Client端

以Ubuntu 14.04为例

安装相关软件包

sudo apt-get update
sudo apt-get install nfs-common

新建挂载点

mkdir /mnt/nfs/movie/public/

挂载远端目录到本地

mount 162.243.128.43:/home/wwwroot/movie/public /mnt/nfs/movie/public/

查看是否挂载成功

df -h

测试

这个时候如果在Client上面修改或添加文件均会在Server上做对应的修改

服务器crontab时区问题

系统级

服务器时间统一调整成UTC时间

一般VPS默认使用UTC时间

根据业务需要设置服务器的时区

使用tzselect命令进行交互式方式选择时区

业务级

以php为例,使用

ini_set('date.timezone','Asia/Shanghai');

nginx 403 Forbidden

问题来源一

目录权限设置不对

问题来源二

目录树下缺少index.php, index.html等

问题来源三

SELINUX没有关闭,这个晚上碰到真心是个坑啊
判断SELINUX是否开启

getenforce

临时关闭SELINUX,修改selinux配置文件
修改前:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=enforcing
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

修改后:

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - SELinux is fully disabled.
SELINUX=disabled
# SELINUXTYPE= type of policy in use. Possible values are:
# targeted - Only targeted network daemons are protected.
# strict - Full SELinux protection.
SELINUXTYPE=targeted

巨人的肩膀

Resolving “403 Forbidden” error
Nginx 403 forbidden for all files

pillow无法调用libjpeg的问题

问题

#!/usr/bin/python
from PIL import Image

im = Image.open('test.jpg')
print(im.format, im.size, im.mode)
im.resize((128, 128))
out = im.rotate(45)

执行后的结果如下:

(movies)[vagrant@crawler tutorial]$ python test.py
('JPEG', (1920, 1200), 'RGB')
Traceback (most recent call last):
File "test.py", line 7, in <module>
im.resize((128, 128))
File "/home/vagrant/dev/movies/lib/python2.7/site-packages/PIL/Image.py", line 1557, in resize
self.load()
File "/home/vagrant/dev/movies/lib/python2.7/site-packages/PIL/ImageFile.py", line 203, in load
d = Image._getdecoder(self.mode, d, a, self.decoderconfig)
File "/home/vagrant/dev/movies/lib/python2.7/site-packages/PIL/Image.py", line 420, in _getdecoder
raise IOError("decoder %s not available" % decoder_name)
IOError: decoder jpeg not available

阅读全文 »

Laravel 5.1事件系统

事件系统有啥用?

  • 解耦,抽出与核心业务关联不大的代码逻辑
  • 异步执行耗时长任务,加快页面响应速度

事件使用样例

现在需要完成这样一件事,当一个图片被用户收藏到一个专辑内时,专辑的封面会自动根据最新的4张图片来生成一个新的专辑封面。因为所有的图片均存储在第三方云存储上,每次都需要下载回来4张图片,在服务器上处理后再回传到云存储上,所以采用Laravel的事件系统来做。

创建事件触发器

php artisan make:event imageAddedToAlbum

这个时候会在app/Events里面生成对应的imageAddedToAlbum.php文件,当然手工创建也可以

阅读全文 »

requireJS实战

为什么需要requireJS

  • 减少网络请求数
  • 压缩js, css减轻服务器负担(当然了,小站点压缩不压缩问题不大)
  • 混淆代码,增加扒站的成本

代码结构

├── build.js // r.js 配置文件
├── r.js // 分发工具
├── src //本地开发目录
│   ├── css
│   │   ├── website.css
│   │   ├── reset.css
│   └── js
│   ├── app
│   │   ├── some_page.js //页面内前端实现逻辑
│   ├── common.js // 通用配置
│   ├── config.js // 用于后端传递数据到前端
│   ├── some_page.js // requireJS 的data-main 域所指定的文件,此文件主要调用通用配置+上面具体实现的some_page.js模块
│   ├── lib
│   │   ├── jquery
│   │   │   └── 1.8.3
│   │   │   └── jquery-1.8.3.js
│   │   ├── layer
│   │   │   ├── extend
│   │   │   │   └── layer.ext.js
│   │   │   ├── layer.min.js
│   │   │   └── skin
│   │   │   ├── default
│   │   │   │   ├── icon_ext.png
│   │   │   │   ├── textbg.png
│   │   │   │   ├── xubox_ico0.png
│   │   │   │   ├── xubox_loading0.gif
│   │   │   │   ├── xubox_loading00.gif
│   │   │   │   ├── xubox_loading1.gif
│   │   │   │   ├── xubox_loading3.gif
│   │   │   │   └── xubox_title0.png
│   │   │   ├── layer.css
│   │   │   └── layer.ext.css
│   │   └── webuploader
│   │   ├── README.md
│   │   ├── Uploader.swf
│   │   ├── webuploader.css
│   │   ├── webuploader.custom.js
│   │   ├── webuploader.custom.min.js
│   │   ├── webuploader.fis.js
│   │   ├── webuploader.flashonly.js
│   │   ├── webuploader.flashonly.min.js
│   │   ├── webuploader.html5only.js
│   │   ├── webuploader.html5only.min.js
│   │   ├── webuploader.js
│   │   ├── webuploader.min.js
│   │   ├── webuploader.noimage.js
│   │   ├── webuploader.noimage.min.js
│   │   ├── webuploader.nolog.js
│   │   ├── webuploader.nolog.min.js
│   │   ├── webuploader.withoutimage.js
│   │   └── webuploader.withoutimage.min.js
│   ├── other_page.js
├── dist //线上分发的目录
│   ├── css
│   │   ├── website.css //多个CSS同时也会压缩成一个
│   └── js
│   ├── some_page.js // 将所有依赖压缩在此文件内
├── img // 图片目录
阅读全文 »

vsftpd虚拟用户配置

需求点

每一个站点目录,需要一个有一个独立的FTP用户可以访问,上传及修改代码,如下所示

/home/wwwroot/website1    FTP用户: website1
/home/wwwroot/website2 FTP用户: website2
/home/wwwroot/website3 FTP用户: website3

所需条件

  • 一个新建用户(这个是系统内真实存在的用户)
  • PAM(Pluggable Authentication Modules)(这个来生成多个不同的虚拟用户)

vsftpd 安装

sudo yum install vsftpd

默认centos 6.5下,安装的版本为2.2.2

阅读全文 »

程序员的呐喊小记

摘除书中的几点有意思的

  1. 大学毕业(或者高中毕业)的时候,你会有两个选择:要么继续深造,要么停止学习。
  2. 不想学习,因为学习很难。
  3. 自由派:all errors are warnings, 保守派:all warnings are errors.
  4. 菜鸟才需要代码着色
  5. 驱使大家去做正确的事的动因是感激,这超过了所有因素,甚至你所有的因素加在一起还要多。你会忍不住想做的更好,因为Google对你的照顾无微不至,让人觉得好像欠了它似的。
  6. 项目管理技术更需要润滑油而不是汽油。

使用xhprof对PHP代码进行性能分析

xprof PHP扩展安装

参考php常用扩展安装

xhgui 的安装

xhgui 在国内安装会有点小困难,需要折腾以下玩意:

  • composer 国内网络环境比较恶心,你懂的
  • mongodb 服务端,就是数据库
  • mongodb 客户端,就是php扩展
阅读全文 »