比尔盖子 博客

Category: 建站技术

Nginx导致CSS无法解析

比尔盖子最近在对服务器进行重构,在重构过程中,比尔盖子用Nginx取代了Apache,结果发现博客页面不正常了,像是主题文件损坏的样子。而换成Wordpress默认的主题Twenty Ten就没事了。

比尔盖子重新安装了主题,但依然不起作用,只好打看Firefox万能的错误控制台进行调试,结果发现了以下错误信息:

错误: 样式表单 http://biergaizi.info/wp-content/themes/philna2/style.css?v=201001171531 未载入,因为它的MIME类型 “text/plain” 不是 “text/css”。
源文件:http://biergaizi.info/
行:0

网上对这种错误众说纷纭,有的是IE的兼容性问题;还有是XHTML的问题。
最后发现,原来是配置Nginx的时候将/etc/nginx/nginx.conf的一行include /etc/nginx/mime.types;误删了,导致了Nginx无法正确识别CSS文件,因此向浏览器发送了错误的MIME类型。加上那行,然后重启Nginx守护进行就好了。

 

改进了博客在Linux下的字体显示

悲催的博客,在Windows下一却正常的字体,在Linux下就变成了不平滑不清晰的烂宋体,简直惨不忍睹啊!

一开始比尔盖子选择忍受,可是随着比尔盖子电脑中Windows的消失,我选择解决,用Firefox强制指定字体。后来用另一台Linux机器打开博客,又是烂宋体,看到那些Linux下字体比XP还平滑清晰的博客,羡慕嫉妒恨啊!

昨天,“比尔盖子技术站”解散了。我的“比尔盖子Linux”进入测试阶段,突然发现“Twenty Eleven”主题的字体在Linux下很不错,便查看了它的style.css,发现了以下代码:

font: 15px "Helvetica Neue", Helvetica, Arial, sans-serif;

这段代码就是控制字体的。原来“Twenty Eleven”主题会以此使用Helvetica Neue, Helvetica, Arial, sans-serif来达到良好的字体效果。

于是,将“比尔盖子 博客”的CSS中也修改为这种字体,保存一下,刷新一下。世界平滑了,世界清晰了!

在用户使用代理,或者服务器使用反向代理或CDN的情况下,获得访客的正确IP

这个方法既可以获得使用代理访问网站访客的真实IP,也可以在服务器使用反向代理或CDN的情况获取访客的真实IP。

由IP不正确想到的

最近,比尔盖子博客使用了Cloudflare的免费CDN服务来加速博客的访问,但是从昨天开始比尔盖子留意到这样一个问题:

由于Cloudflare CDN的本质是代理服务器(反向代理),因此,网站系统评论获取评论信息时,就会将用户的IP统统获取为CDN服务器的IP,导致了无法正确获得浏览者的IP。

 

因为比尔盖子常使用HTTP代理,所以对代理还是有一些了解的。

代理一般分为“透明代理、匿名代理、超级匿名代理”。如果使用透明代理,服务器将依旧可以通过一些方式来获取用户的真实IP;如果使用匿名代理,服务器可以通过一些方式发现用户可能在使用代理服务器,但无法确定用户的真实IP;使用超级匿名代理时,服务器无论如何也无法检测出用户使用了代理服务器。

那么,Cloudflare CDN的反向代理会不会也是一个透明代理呢?能否采用识别使用代理服务器用户真实IP的一般方法,来获取在服务器使用Cloudflare CDN或反向代理时获取正确的用户IP呢?

原理

在PHP中用户的IP有三个属性:HTTP_CLIENT_IP、
HTTP_X_FORWARDED_FOR、REMOTE_ADDR。

REMOTE_ADDR是和服务器连接时,服务器看到的IP地址(如果使用代理,就是最后一台代理的IP);HTTP_CLIENT_IP为代理服务器的IP,不使用代理就没数据;HTTP_X_FORWARDED_FOR是使用代理时,用户的真实IP,不使用代理就没数据(如果用户使用的多层代理,则 用户–> A –> B –> 网站,那么数据就为“用户IP,A的IP”,即最后一台代理服务器之前数据流经过的所有服务器的IP地址)。

这三个值均可伪造,不过如果不是匿名代理或超级匿名代理,是不会对其伪造的。

测试

因此,比尔盖子编写了一个PHP脚本来测试。这个脚本可以使用http://biergaizi.com/ipaddress.php访问。需要注意的是,为了知道Cloudflare CDN是不是透明代理,这个脚本也被CDN加速了,因此本质上是你是用一个代理访问的。

源码如下:

<?php

global $ip;
global $ip2;
global $ip3;
$ip = getenv("HTTP_CLIENT_IP");
$ip2 = getenv("HTTP_X_FORWARDED_FOR");
$ip3 = getenv("REMOTE_ADDR");

echo "HTTP_CLIENT_IP:     ","<br>",$ip,"<br><br>";
echo "HTTP_X_FORWARDED_FOR:     ","<br>",$ip2,"<br><br>";
echo "REMOTE_ADDR:     ","<br>",$ip3,"<br><br>";

?>

测试的结果是:REMOTE_ADDR是代理服务器的IP,HTTP_X_FORWARDED_FOR是访问者真实的IP!也就是说,Cloudflare CDN本质上是透明代理,可以用HTTP_X_FORWARDED_FOR来获得访问者真实的IP!但是唯一奇怪的是,HTTP_CLIENT_IP是没有数据的,请懂的同学解答一下。

实现

有了刚才测试的结果,实现起来就容易多了。

WordPress中获取IP是通过获取REMOTE_ADDR实现的。我们只需要修改Wordpress中获取访问者IP的函数,增加一个逻辑判断:如果HTTP_X_FORWARDED_FOR有数据,就用HTTP_X_FORWARDED_FOR代替REMOTE_ADDR,这样就实现了获得浏览者的正确IP。

但关键是找不到Wordpress获取IP的函数在哪个文件,因此又找到了这样一种方法:因为Wordpress的wp-config.php配置文件是一个公共文件,大部分文件都会调用它,所以只需要修改wp-config.php就行了。修改的方法也异常简单,只需要在wp-config.php开头加上

if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])) 
{
$list = explode(',',$_SERVER['HTTP_X_FORWARDED_FOR']);
$_SERVER['REMOTE_ADDR'] = $list[0];
}

就搞定了。这段代码的意思是:如果HTTP_X_FORWARDED_FOR有数据(那就肯定是用代理了),那么就用HTTP_X_FORWARDED_FOR里的IP替换REMOTE_ADDR的IP。这样真实IP就把代理服务器的IP替换掉了。

这个方法正如开头强调的,这个方法不仅可以获得使用代理访问网站访客的真实IP,也可以在服务器使用反向代理或CDN的情况获取访客的真实IP。

CentOS 6 LAMP搭建(服务器配置)

神马是LAMP?路灯?不对,是Linux+Apache+Mysql+PHP(或Perl、Python)。搭建LAMP就是配置Linux+Apache+Mysql+PHP(或Perl、Python)的Web服务器了。

而在这里,我们使用的是最新的CentOS 6。如果其它版本系统想要参考这个教程,对不起,由于软件源中软件版本低,因此不能参考。

LAMP各软件版本:
Linux:CentOS 6 Kernel 2.6.39.3
Apache:2.2.15
Mysql:5.1.52
PHP:5.3.2

和比尔盖子一起搭建LAMP

比尔盖子最近迁移网站到VPS,这正是制作LAMP教程的好机会,下面大家就跟我来吧!
(以下过程均使用管理员root操作)

 

#整个安装过程中可能需要输入y和回车来确定安装。

###准备工作

#安装“最快镜像源”插件,加速下载
yum install yum-plugin-fastestmirror.noarch

#升级系统
yum update

#安装两个软件源
rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/i386/epel-release-6-5.noarch.rpm
rpm -ivh http://dl.iuscommunity.org/pub/ius/stable/Redhat/6/i386/ius-release-1.0-8.ius.el6.noarch.rpm

###PHP安装与配置

#PHP安装与配置,Apache安装
#PHP依赖Apache,所以会自动安装哦!
yum install php-pear php php-cli php-common php-devel php-gd php-mbstring php-mcrypt php-mysql php-pdo php-soap php-xml php-xmlrpc php-bcmath php-pecl-apc php-pecl-memcache php-snmp

#修改配置文件
#找到short_open_tag = Off,将其改成short_open_tag = On
#vim用法:点一下键盘上的斜杠(/),输入要查询的内容(区分大小写),按回车即可搜索
#找到内容后按一下键盘上的“Insert”,就可以像记事本一样编辑了
#编辑完后,按"Esc",然后输入" :wq “就可保存退出。
vim /etc/php.ini

###Mysql安装与配置

#安装Mysql
yum install mysql mysql-server mysql-devel

#启动服务
service mysqld start

#修改Mysql root密码
/usr/bin/mysqladmin -u root password '新密码'

###Apache配置
#Apache已经被PHP依赖安装,因此我们已经安装好Apache,我们只需要配置一下

#让Apache支持.htaccess
#vim用法:点一下键盘上的斜杠(/),输入要查询的内容(区分大小写),按回车即可搜索
#找到内容后按一下键盘上的“Insert”,就可以像记事本一样编辑了
#编辑完后,按"Esc",然后输入" :wq “就可保存退出。

#查找Options FileInfo AuthConfig Limit
vim /etc/httpd/conf/httpd.conf

###Xcache模块优化性能(可不装)
#安装过程中如果提示“XX not fount",就yum install XX

#安装编译工具以编译
yum install gcc make

#下载Xcache
wget http://xcache.lighttpd.net/pub/Releases/1.3.2/xcache-1.3.2.tar.bz2

#解压缩Xcache
tar -xvf xcache-1.3.2.tar.bz2

#切换到Xcache目录
cd xcache-1.3.2

#根据php配置Xcache
phpize

#编译安装
mkdir ../xcache-build
cd ../xcache-build
~/xcache-1.3.2/configure -enable-xcache
make
make install

#新增Xcache.ini配置文件
vim /etc/php.d/xcache.ini
#增加内容:
[xcache-common]
;; install as zend extension (recommended), normally "$extension_dir/xcache.so"
zend_extension = /usr/lib/php/modules/xcache.so
;; or install as extension, make sure your extension_dir setting is correct
; extension = xcache.so

[xcache.admin]
xcache.admin.auth = On
xcache.admin.user = "mOo"
; xcache.admin.pass = md5($your_password)
xcache.admin.pass = ""

[xcache]
xcache.shm_scheme =        "mmap"
xcache.size   =             32M
xcache.count =                 1
xcache.slots =             8K
xcache.ttl =              3600
xcache.gc_interval =       300

; Same as aboves but for variable cache
; If you don't know for sure that you need this, you probably don't
xcache.var_size   =          0M
xcache.var_count =          1
xcache.var_slots =          8K
xcache.var_ttl =          0
xcache.var_maxttl =       0
xcache.var_gc_interval =     300

; N/A for /dev/zero
xcache.readonly_protection = Off

xcache.mmap_path = "/dev/zero"

xcache.cacher =             On
xcache.stat =             On
###重启服务器

#重启服务器
reboot

 

 

最后说一下配置文件的路径:
PHP:  /etc/php.ini
Apache: /etc/httpd/conf/httpd.conf

Copyright © 2023 比尔盖子 博客

Theme by Anders NorenUp ↑