agon-网站相关

Archive for the ‘网站相关’ Category

windows64位下python3配合apache与wsgi部署django项目

October 26th, 2013, Posted by: agon   

初学django,想在windows下,用apache和mod_wsgi部署一个简单的django学习环境,没想到由于操作系统用的是win8 64位和python3,安装的并不顺利,本文即对安装过程的总结。

搭建环境及准备

  • 操作系统;win8.1 64位
  • python版本:pyton3.3.2 64位
  • django版本:django-1.5.4
  • 准备一个可以runserver下正常用的django project

注意上面python安装的版本是64位的。

安装apache

这里需要安装apche64位版本,否则wsgi会不认,无法加载,造成apche无法启动。可以直接到awamp下载一个套件,或者到aapachelounge下载已经编译好的单独的64位apache,本文的apache版本是2.4.4。wamp正常的安装就可以了,apachelounge的应该是绿色版的。

安装mod_wsgi

官方最新的版本是3.4,只有python2.6和2.7的,没有python3的。我们不用自己编译(在windows下几乎没有编译成功过),有现成的,到http://www.lfd.uci.edu/下载需要的版本(这里有很多windows下的编译好的扩展),根据本文环境选择mod_wsgi-3.4.ap24.win32-py3.3.zip,之后搭建成功后,访问网页,得到的http头里的server显示是mod_wsgi/3.5-BRANC。

解压压缩包,把mod_wsgi.so文件拷进apache安装路径的modules文件夹下,打开httpd.conf,添加一行LoadModule wsgi_module modules/mod_wsgi.so。cmd命令行窗口,执行apache的bin目录下的httpd,如果没有任何报错,应该就正常加载了。

部署django项目

假设你用django-admin.py startproject mysite,创建一个mysite的项目,它的目录结构如下:

项目目录结构

假设你的项目在D盘根目录,我们就此来配置项目。

添加程序入口文件

在mysite项目根目录,新建apche目录,这个目录在manage.py那个文件所在的目录,在其下面新建django.wsgi,将来WSGI连接它来代替默认的mange.py,作为网站的入口配置。在其内添加如下代码:

import os
import sys

#添加setting文件地址
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
#添加项目路径到sys.path
sys.path.append('D:/mysite')
 
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

上面的代码只修改为你项目的地址和对应名称,后面conf配置的时候用到这个文件的地址。

配置虚拟主机

因为可能同时要运行多个项目,而且还有其他语言的项目,所以用vhost来配置是最方便的。到apache安装目录的conf\extra里找到httpd-vhosts.conf文件,这个文件是虚拟主机的配置文件【1】,编辑打开,贴入如下代码:

#如果是80端口这句不用写,主配置文件httpd.conf已经有了
#Listen 80 
#这句貌似也不用,2.4的不需要这句
#NameVirtualHost *:80 

#配置端口号,*可以换成主机ip,如果ip不固定,就有*就好了,很方便
<VirtualHost *:80> 
	#配置访问的域名
	ServerName example.com
	#配置主目录权限
	<Directory />
	    Options FollowSymLinks 
	    AllowOverride 
	    Order allow,deny 
	    Allow from all 
	</Directory>

	#配置项目配置文件目录权限,禁止访问
	<Directory "D:/mysite/mysite/"> 
	    Order Deny,Allow 
	    Deny from all 
	</Directory> 

	#关键一句配置项目入口点
	WSGIScriptAlias / "D:/mysite/apache/django.wsgi"

	#配置管理员静态文件目录,及其权限
	Alias /static/admin D:/Python33/Lib/site-packages/django-1.5.4-py3.3.egg/django/contrib/admin/static/admin
	<Directory "D:/Python33/Lib/site-packages/django-1.5.4-py3.3.egg/django/contrib/admin/static/admin/"> 
	    Order allow,deny 
	    Allow from all 
	</Directory> 

	#配置静态文件目录,及其权限
	Alias /static D:/mysite/static/
	<Directory "D:/mysite/static/"> 
	    Order allow,deny 
	    Allow from all 
	</Directory> 

</VirtualHost>

下面说一说上面代码里应该注意的地方:

  • 首先,项目结构如前面图片,假设保存在D盘,前面几句是主机地址、域名以及涉及目录权限的相关设置,到达WSGIScriptAlias这里,就填上刚才添加的django.wsgi的地址,这里是配置成功与否的关键。
  • 凡是不想让wsgi处理,按实际文件夹结构访问的,都可以用Alias来添加,这样访问的时候就不会去找urls里配view了。添加的时候注意Alias第一个目录后面不要用/结尾。 【2】 本例以static目录为静态文件夹
  • 本例使用static为静态文件目录,因为django1.5的admin的静态文件地址为域名/stacic/admin/*。另外注意的是django1.5不在使用media文件存放静态文件,改为contrib/admin/static/admin了。如果你想把其他静态文件也放在static下面,记住Alias /static一定要在Alias /static/admin后面,要不然由于优先级造成短路,登陆admin的时候,admin的静态文件永远也不会加载的。
  • 最后到编辑httpd.conf文件,取消Include conf/extra/httpd-vhosts.conf的注释,并保存。

至此,部署完成,当然这只是windows下用python3学django的一个学习环境,仅供学习用。另外,wsgi有两种运行模式:一种是daemon mode,一种是embedded mode。在daemon mode下,每次修改不用重启apche,windows下不支持,修改完代码只能重启apche,还有就是不要忘了吧settings.py里的ALLOWED_HOSTS填上你的域名。

Not() Selector排除content counter计数

October 5th, 2013, Posted by: agon   

利用css的content counter【1】自动生成目录编号,可以节省不少排版编序号的时间。但是有一个问题,content counter默认把所有层级里的<ol>都计入编号,如果页面里有些ol里li不希望计入目录编号该怎么办呢(例如代码段里的行号),Not() Selector可以很好的解决这个问题【2】

/*设置content counter*/
.entry ol {
counter-reset: section;
list-style-type: none;
}
 
/*计数所有的li除了class为.codeline的li元素*/
.entry ol li:not(.codeline):before {
/*这里的.codeline可以是元素或者选择器*/
counter-increment: section;
content: counters(section , ".") " ";
}

我用的代码高亮生成的行号每个class名字都不一样(如L0,L1),可以通过改高亮代码js,为每一行增加一个class,然后再not这个class名。

CSS content counters 在ie低版本使css解析错误

October 5th, 2013, Posted by: agon   

用css的content counter【1】来为blog文章自动添加章节,是一件很方便的事情,但ie低版本不支持,不支持也就算了,还把原来正常的侧边栏和菜单栏弄乱了,以下低版本是产生错误的css代码:

	.entry ol li:not(.codeline):before {
	counter-increment: section;
	content: counters(section, ".") " ";
	}

在Stack Overflow发现有人遇到同样的问题,有人给出了解决方法【2】,很简单只需要把上面代码里section和后面的逗号之间加一个空格就行了。

另外如果文章里原先代码有用ol生成的行号,在低版本ie也不会显示,计入下面的css就行了:

	.entry ol {
	*list-style-type: number
	}

其实ie低版本现在应该无视,最多布局完全凌乱时,动动

解决旧链接跳转错误

May 29th, 2011, Posted by: agon   

好像从wordpress3.0以来,修改permalink(固定链接)不会导致旧链接失效。也就是说旧的链接仍然可以通过wordpress 301跳转到新的permalink页面。于是哪天当你发现自己的permalink不友好时或者发现更改后permalink还不理想又更改,却发现自己的旧链接并不像wordpress3说的那样会自动跳转到新的自定义链接上来,而是变成了404页面。下面说一下常见的跳转错误的解决办法(以下内容是针对wordpress3之后的版本)。

一、使用单个%postname%或者默认方式?p=id结尾
你的旧链接的结尾是一个单纯的结构标签,例如:
http://yourdomain.com/中间部分/日志名称,是以%postname%标签结尾
http://yourdomain.com/中间部分/?p=日志id,是以%post_id%标签结尾
而非多个标签复合,例如:
①http://yourdomain.com/中间部分/日志id_日志名称,是以%post_id%_%postname%复合标签后缀
或者含有自定义文字后缀,例如
②http://yourdomain.com/中间部分/日志名称.html,是以%postname%.html方式自定义链接
或者/后直接是id号,例如
③http://yourdomain.com/中间部分/日志id,是以/%post_id%方式自定义链接非默认的/?p=id
凡是自定义旧链接末尾使用的是单个名称标签或者默认的?p=id,wordpress3之后的版本会自动转向到你定义的任何形式的新链接,不需要你做任何多余的设置。如果没有自动跳转,请查看你的.htaccess里是否有以下rewrite代码

# BEGIN WordPress
RewriteEngine On
#RewriteBase根据wordpress目录是否是域名根目录而不同
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
# END WordPress

是否支持mod_rewrite模块,一般情况下,你保存新链接形式后,wordpress会自动更新.htaccess添加以上代码,如果没有则可能是权限问题,依次尝试给.htaccess的owner、group、world, 添加写权限,直到.htaccess可以自动更新,然后再把.htaccess权限改为660或664。

二、非单个名称标签结尾或者单纯/id结尾

如果旧链接的末尾有自定义后缀,如html或其他自定义字母后缀;两个结构标签复合而成;单纯的/id结尾(例子见第一点),这样格式的旧链接会直接跳转到404页面。解决方法有两种:

1.安装插件。

1.1如果你只改过一次链接,那么就用dean‘s migration 插件,使用的时候请注意先激活插件,设置旧链接格式,再保存一下新的固定链接。

1.2如果你很蛋疼有很多格式的旧链接,强烈推荐使用Permalink Redirec的最新版,当通过旧链接访问时就会触发这个插件,从而跳转到正确的链接。这个插件不仅支持多个旧链接格式的跳转还支持feeder跳转、域名跳转以及定义不进行跳转的链接。使用方法很简单,下载完最新版,上传到pluguin目录,激活插件,在下图红线框处输入旧链接的格式,保存,测试一下,所有的旧链接都搞定了。

permalink redirect

2.修改.htaccess。

这个解决起来比简洁快速,就是弄正则式麻烦,打开你wordpress目录下的.htaccess,在“RewriteRule ^index\.php$ – [L]”下方添加自己的RewriteRule,下面是一些rewriterule例子

#把下面规则里目录修改为你的wordpress相对于域名的目录名称,如果是根目录用/
#1 旧链接的后缀和现在不同,例如以前是.htm,现在则是.html
  #1.1 以前的自定义结尾的结尾是单结构标签
    RewriteRule  ([\w-]+)\.htm$  /目录/$1 [R,L]    #以前以/%postname%.htm结尾
    RewriteRule  ([0-9]+)\.htm$  /agon/?p=$1 [R,L]    #以前以/%post_id%.htm结尾
  #1.2 以前的自定义结尾是复合结构
    RewriteRule  ([0-9]+)-([\w-]+)\.htm$  /agon/?p=$1 [R,L]   #以前以%post_id%-%postname%.htm方式结尾
    RewriteRule  -([0-9]+)\.htm$  /agon/?p=$1 [R,L]   #以前以%postname%-%post_id%.htm方式结尾
#2 以前的自定义后缀和现在的相同,例如以前的是.html,现在还是html,这种情况需要根据前后两个链接格式的结构区别,写出更详尽的正则式,这个比较麻烦,下面给几个例子
  #2.1  如果以前的是/%year%/%month%/%postname%.html,而现在最末端前面的/…/地址结构为非数字
     RewriteRule  [0-9]{4}/[0-9]{2}/([\w-]+)\.html$  /目录/$1 [R,L]
  #2.2 如果以前的是/%year%/%month%/%post_id%-%postname%.html
    RewriteRule  [0-9]{4}/[0-9]{2}/([0-9]+)-([\w-]+)\.html$  /目录/?p=$1 [R,L]
  #2.3 如果以前的是/%year%/%month%/%postname%-%post_id%.html
     RewriteRule  [0-9]{4}/[0-9]{2}/([\w-]+)-([0-9]+)\.html$  /目录/?p=$2 [R,L]
#3 以单纯的/id结尾,如wordpress提供的archives/%post_id%
  RewriteRule  [/]?([0-9]+)$  /agon/?p=$1 [R,L]

另外,如果你的博客的数据库折腾过很多次,可能会发现一个怪问题,一些涉及到id的跳转,一些跳转正确(尤其是刚发布的),一些没有跳转到先对应的日志(另一篇不同的日志),一些跳转到404页面,这种现象可能是数据库里wp_posts表的guid和id不相等,登录到phmyadmin,查看那些跳转错误的日志的guid和id是否相等,例如ID是5,guid却可能是http://agong.org/?p=4,只需使guid里的数字等于ID就可以正常跳转了。解决的办法是在phpmyadmin的sql里输入:

update wp_posts
set guid = concat('http://www.yourdomain.com/?p=',ID) where post_status = 'publish' and post_type = 'post';

如果页面的跳转也有这种错误,那么输入:

update wp_posts
set guid = concat('http://www.yourdomain.com/?page_id=',ID) where post_status = 'publish' and post_type = 'page';

至此,关于wordpress的旧链接跳转基本上就没什么问题了。

如果不记得以前的旧链接是什么结构,可以使用google的管理员工具的诊断->爬行错误里查看哪些链接引起错误的,更改完跳转设置,再访问这些链接看看是不是已经能跳转到正确的页面,如果错误,选择人以上合适的方法。

当然了最好不要随意改自己的链接结构,一开始就选择一个比较恰当的结构。首先从性能上说,为了提高页面载入速度,一般都要做静态化,推荐wp-super-cathe全站静态化,所以/%postid%/%postname%的结构没多大意义,尽量选择层次比较浅的结构,直接域名加日志名称,一般个人博客不会有几万篇日志,顶多几百篇,一个文件夹下放置这么多静态页面应该不会影响速度,另外最好给日志链接价格html结尾,据说搜索引擎偏好这个,所以推荐全站静态化,然后用%postname%.html结构链接。如果要加一个目录结构最好是数字性能好些,%year%相对好些,然而有争论说要加目录的话最好是/%category%/%postname%,说这个结构确实对seo有好处,然而如果还没想好目录最终的样式,更改分类名会使链接地址相应改变。关于加一级目录,请根据自己空间的实际情况选择。

部分内容参考链接:

http://codex.wordpress.org/Using_Permalinks

http://scott.yang.id.au/2007/02/change-wordpress-permalink/

换机房成功

January 7th, 2011, Posted by: agon   

因为……发威,网页打不开,美国又是大半夜,要换好ip有一阵子呢,正好试试homezz的转换机房,非常顺利,还是折腾了一个多小时。日那个校长

开一天qq,和好几个好几年没说过话的朋友,聊了几句:忙啥,blabla

好多人都娶妻生子了,自闭的时间太长了,过头了,忽然觉得,今年如果能完成几个计划应该会不错的……

与电脑脸做斗争,下班应该马上回家,恩,发首歌,回去……
Pale Blue Eyes

地下丝绒的Pale Blue Eyes:

最后诅咒天杀的肌肤网

Page 1 of 712345...Last »