月度归档:2014年03月

WordPress文章或者页面中插入豆瓣FM

WordPress - WordPress文章或者页面中插入豆瓣FM

有的同学也许会和我一样,很喜欢用豆瓣FM来听歌,恩!有种上学时听收音机的感觉,而且豆瓣会更具你的习惯推荐歌曲,很不错!
这就是我的小站的效果

豆瓣fm

豆瓣fm

其实这个实现非常简单,新建文章或者页面,然后转到【文本】模式下编辑

wenben-douban

以下是插入的代码:

<iframe name="iframe_canvas" src="http://douban.fm/partner/baidu/doubanradio" scrolling="no" frameborder="0" width="420" height="190"></iframe>

效果查看:http://qulehe.com/music

WordPress各种标签调用集合

WordPress - WordPress各种标签调用集合

wordpress是一种使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL 数据库的服务器上架设自己的网志,插件众多,易于扩充功能。安装和使用都非常方便。目前 WordPress 已经成为主流的 Blog 搭建平台。本站就用的是WordPress构建的。

WordPress主体包含的主要文件

  • WordPress模板基本文件
  • style.css 样式表文件
  • index.php 主页文件
  • single.php 日志单页文件
  • page.php 页面文件
  • archvie.php 分类和日期存档页文件
  • searchform.php 搜索表单文件
  • search.php 搜索页面文件
  • comments.php 留言区域文件(包括留言列表和留言框)
  • 404.php 404错误页面
  • header.php 网页头部文件
  • sidebar.php 网页侧边栏文件
  • footer.php 网页底部文件
  • WordPress Header头部 PHP代码

注: 也就是位于和之间的PHP代码

网站标题

<?php wp_title(); ?>

日志或页面标题

<?php bloginfo(‘stylesheet_url’); ?>

WordPress主题样式表文件style.css的相对地址

WordPress博客的Pingback地址

WordPress主题文件的相对地址

博客的Wordpress版本

WordPress博客的Atom地址

WordPress博客的RSS2地址

WordPress博客的绝对地址

WordPress博客的名称

网站的HTML版本

网站的字符编码格式

WordPress 主体模板 PHP代码

日志内容
确认是否有日志

如果有,则显示全部日志

结束PHP函数”while”

结束PHP函数”if”

header.php文件的内容

sidebar.php文件的内容

footer.php文件的内容

显示格式为”02-19-08″的日期

显示一篇日志的留言链接

显示一篇日志或页面的标题

显示一篇日志或页面的永久链接/URL地址

显示一篇日志或页面的所属分类

显示一篇日志或页面的作者

显示一篇日志或页面的ID

显示一篇日志或页面的编辑链接

显示Blogroll中的链接

comments.php文件的内容

显示一份博客的页面列表

显示一份博客的分类列表

下一篇日志的URL地址

上一篇日志的URL地址

调用日历

显示一份博客的日期存档列表

显示较新日志链接(上一页)和较旧日志链接(下一页)

显示博客的描述信息

其它的一些Wordpress模板代码

/%postname%/ 显示博客的自定义永久链接
搜索表单的值

打印输出信息

显示注册链接

显示登入/登出链接

<!–next page–> 在日志或页面中插入分页

<!–more–> 截断日志

显示管理员的相关控制信息

显示载入页面的时间

显示载入页面查询

1. wordpress调用最新文章

WordPress最新文章的调用可以使用一行很简单的模板标签wp_get_archvies来实现. 代码如下:

(显示10篇最新更新文章)
或者


后面这个代码显示你博客中最新的20篇文章,其中format=custom这里主要用来自定义这份文章列表的显示样式。具体的参数和使用方法你可 以参考官方的使用说明- wp_get_archvies。(fromat=custom也可以不要,默认以UL列表显示文章标题。)

补充: 通过WP的query_posts()函数也能调用最新文章列表, 虽然代码会比较多一点,但可以更好的控制Loop的显示,比如你可以设置是否显示摘要。具体的使用方法也可以查看官方的说明。

2. wordpress调用随机文章
$rand_posts = get_posts(‘numberposts=10&orderby=rand’);

foreach( $rand_posts as $post ) :

?>

<!–下面是你想自定义的Loop–>

”>

3. wordpress调用最新留言

下面是我之前在一个Wordpress主题中代到的最新留言代码,具体也记不得是哪个主题了。该代码直接调用数据库显示一份最新留言。其中 LIMIT 10限制留言显示数量。绿色部份则是每条留言的输出样式。
global $wpdb;

$sql = “SELECT DISTINCT ID, post_title, post_password, comment_ID,

comment_post_ID, comment_author, comment_date_gmt, comment_approved,

comment_type,comment_author_url,

SUBSTRING(comment_content,1,30) AS com_excerpt

FROM $wpdb->comments

LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID =

$wpdb->posts.ID)

WHERE comment_approved = ’1′ AND comment_type = ” AND

post_password = ”

ORDER BY comment_date_gmt DESC

LIMIT 10″;

$comments = $wpdb->get_results($sql);

$output = $pre_HTML; foreach ($comments as $comment) {

$output .= “n

”.strip_tags($comment->comment_author)
.”:” . ” ID) .

“#comment-” . $comment->comment_ID . “” title=”on ” .

$comment->post_title . “”>” . strip_tags($comment->com_excerpt)

.”

”;

} $output .= $post_HTML;

echo $output;?>
4.wordpress调用相关文章

在文章页显示相关文章
$tags = wp_get_post_tags($post->ID);

if ($tags) {

$first_tag = $tags[0]->term_id;

$args=array(

‘tag__in’ => array($first_tag),

‘post__not_in’ => array($post->ID),

‘showposts’=>10,

‘caller_get_posts’=>1

);

$my_query = new WP_Query($args);

if( $my_query->have_posts() ) {

while ($my_query->have_posts()) : $my_query->the_post(); ?>

” rel=”bookmark” title=””>
endwhile;

}

}

wp_reset_query();

?>
5.wordpress调用指定分类的文章

” rel=”bookmark” title=””>

6.wordpress去评论者链接的评论输出
global $wpdb;

$sql = “SELECT DISTINCT ID, post_title, post_password, comment_ID,

comment_post_ID, comment_author, comment_date_gmt, comment_approved,

comment_type,comment_author_url,

SUBSTRING(comment_content,1,14) AS com_excerpt

FROM $wpdb->comments

LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID =

$wpdb->posts.ID)

WHERE comment_approved = ’1′ AND comment_type = ” AND

post_password = ”

ORDER BY comment_date_gmt DESC

LIMIT 10″;

$comments = $wpdb->get_results($sql);

$output = $pre_HTML;

foreach ($comments as $comment) {

$output .= “

”.strip_tags($comment->comment_author).”:” . ” ID) .
“#comment-” . $comment->comment_ID . “” title=”on ” .

$comment->post_title . “”>” . strip_tags($comment->com_excerpt).”

”;

}

$output .= $post_HTML;

echo $output;?>
7.wordpress调用含gravatar头像的评论输出
global $wpdb;

$sql = “SELECT DISTINCT ID, post_title, post_password, comment_ID, comment_post_ID, comment_author, comment_date_gmt, comment_approved,comment_author_email, comment_type,comment_author_url, SUBSTRING(comment_content,1,10) AS com_excerpt FROM $wpdb->comments LEFT OUTER JOIN $wpdb->posts ON ($wpdb->comments.comment_post_ID = $wpdb->posts.ID) WHERE comment_approved = ’1′ AND comment_type = ” AND comment_author != ‘郑 永’ AND post_password = ” ORDER BY comment_date_gmt DESC LIMIT 10″;

$comments = $wpdb->get_results($sql);

$output = $pre_HTML;

foreach ($comments as $comment)

{

$output .= “

”.get_avatar(get_comment_author_email(‘comment_author_email’), 18). ” ID) . “#comment-” . $comment->comment_ID . “” title=”” . $comment->post_title . ” 上的评论”>”. strip_tags($comment->comment_author) .”: “. strip_tags($comment->com_excerpt) .”
”;

}

$output .= $post_HTML;

$output = convert_smilies($output);

echo $output;

?>
上面代码把comment_author的值改成你的ID,18是头像大小,10是评论数量。
8.wordpress调用网站统计大全

1、日志总数:

publish;?>
2、草稿数目:

3、评论总数:

4、成立时间:

5、标签总数:

6、页面总数:

7、分类总数:

8、链接总数:

9、用户总数:

10、最后更新:

get_results(“SELECT MAX(post_modified) AS MAX_m FROM $wpdb->posts WHERE (post_type = ‘post’ OR post_type = ‘page’) AND (post_status = ‘publish’ OR post_status = ‘private’)”);$last = date(‘Y-n-j’, strtotime($last[0]->MAX_m));echo $last; ?>
9.wordpress判断语句

is_single()

判断是否是具体文章的页面

is_single(’2′)

判断是否是具体文章(id=2)的页面

is_single(‘Beef Stew’)

判断是否是具体文章(标题判断)的页面

is_single(‘beef-stew’)

判断是否是具体文章(slug判断)的页面

comments_open()

是否留言开启

pings_open()

是否开启ping

is_page()

是否是页面

is_page(’42′)

id判断,即是否是id为42的页面

is_page(‘About Me’)

判断标题

is_page(‘about-me’)

slug判断

is_category()

是否是分类

is_category(’6′)

id判断,即是否是id为6的分类

is_category(‘Cheeses’)

分类title判断

is_category(‘cheeses’)

分类 slug判断

in_category(’5′)

判断当前的文章是否属于分类5

is_author()

将所有的作者的页面显示出来

is_author(’1337′)

显示author number为1337的页面

is_author(‘Elite Hacker’)

通过昵称来显示当前作者的页面

is_author(‘elite-hacker’)

下面是通过不同的判断实现以年、月、日、时间等方式来显示归档

is_date()

is_year()

is_month()

is_day()

is_time()

判断当前是否是归档页面

is_archive()

判断是否是搜索

is_search()

判断页面是否404

is_404()

判断是否翻页,比如你当前的blog是http://domain.com 显示http://domain.com?paged=2的时候,这个判断将返 回真,通过这个函数可以配合is_home来控制某些只能在首页显示的界面,

例如:

//这里写你想显示的内容,包括函数

或者:

//这里写你想显示的内容,包括函数

10.wordpress非插件同步twitter
require_once (ABSPATH . WPINC . ‘/class-feed.php’);

$feed = new SimplePie();

$feed->set_feed_url(‘http://feeds.feedburner.com/agting′);

$feed->set_file_class(‘WP_SimplePie_File’);

$feed->set_cache_duration(600);

$feed->init();

$feed->handle_content_type();

$items = $feed->get_items(0,1);

foreach($items as $item) {

echo ‘@用户名: ‘.$item->get_description();

}

?>
代码中的agting改成你的twitter用户名,改成你的名字。

另一种调用方法需要你的空间是国外主机:
// Your twitter username.

$username = “wange1228″;

// Prefix – some text you want displayed before your latest tweet.

// (HTML is OK, but be sure to escape quotes with backslashes: for example href=”link.html”)

// Suffix – some text you want display after your latest tweet. (Same rules as the prefix.)

$suffix = “”;

$feed = “http://search.twitter.com/search.atom?q=from:” . $username . “&rpp=1″;

function parse_feed($feed) {

$stepOne = explode(“”, $feed);

$stepTwo = explode(“”, $stepOne[1]);

$tweet = $stepTwo[0];

$tweet = str_replace(“<”, “<”, $tweet); $tweet = str_replace(“>”, “>”, $tweet);

return $tweet;

}

$twitterFeed = file_get_contents($feed);

echo stripslashes($prefix) . parse_feed($twitterFeed) . stripslashes($suffix);

?>
总结一下这个方法的特点:

1、非插件.

2、不用验证用户名和密码,也就是说你可以指定调用任何一个人的 tweet.

3、可以自定义 tweet 信息后显示的文字,就是 $suffix = “”; 这里.

4、只能调用最新的一条 tweet,刚好满足我的需求。

5、大概只有国外空间才能使用.(经我验证,确实如此)

11.wordpress 非插件调用评论表情
<!–smilies–>
function wp_smilies() {

global $wpsmiliestrans;

if ( !get_option(‘use_smilies’) or (empty($wpsmiliestrans))) return;

$smilies = array_unique($wpsmiliestrans);

$link=”;

foreach ($smilies as $key => $smile) {

$file = get_bloginfo(‘wpurl’).’/wp-includes/images/smilies/’.$smile;

$value = ” “.$key.” “;

$img = “”;

$imglink = htmlspecialchars($img);

$link .= “{$img} ”;

}

echo ‘

’.$link.’
’;

}

?>

将以上代码复制到 comments.php 中合适的位置。

Wordpress 的 Tumblr 化:Post format 功能小试

WordPress - WordPress 的 Tumblr 化:Post format 功能小试

主机放在国外的一个好处就是升级 WordPress 变得很方便,看到 Dashboard 里提示有新的 WordPress 版本之后就随手点几下,新版本就自动装好了。这份方便也让 Lucifr 很少再去研究新版本的功能,以至于差点错过了 WordPress 3.1 中这个很不该忽视的 Post format (文章格式) 功能。

什么是 Post format

如果接触过 Tumblr 这个“不存在”的博客服务的话,可能会更加容易理解 Post format。简单来说 Post format 就像是一种针对主题的通用类别(Category),通过 Post format 可以将文章分为几类,从而方便主题(Theme)针对不同的类别采用相应的显示风格。

有哪些 Post format

目前 WordPress 3.1 已经支持的 Post format 分为以下几个:

  • aside
  • gallery
  • link
  • image
  • quote
  • status
  • video
  • audio
  • chat

实际上除了这些以外还有一个就是普通类型的 standard,通常可以作为传统意义上的长文章来对待,未指定 post format 的文章都被归为此类。

可以看出,和 Tumblr 类似,这些 Post format 基本上涵盖了各种文章类型,但与之前用户自定义的“类别”不同,Post format 是由 WordPress 官方定义的,也就是说主题创作者只可以从这些分类中进行选择,并为相应的分类制作出对应的风格来。这就确保了用户在不同主题之间切换时,Post format 保持了一致性。在这一点上和 Tumblr 的理念也是一样的。

如何为主题添加 Post format 功能

由于 Post format 基本上是为主题制作者设置的,对于普通用户来说,可能为既有主题添加 Post format 功能,并达到如 Tumblr 众多精美主题的风格水准并不是件很容易的事。所以以下的内容也只是供参考,并不是详细的教程。

添加主题支持

需要在主题的 function.php 中添加 add_theme_support() 来告诉 WordPress 主题中需要激活的 Post format 类型。如:

add_theme_support( 'post-formats', array( 'aside', 'gallery' ) );

这样就开启了对 aside 和 gallery 这两种 Post format 的支持。这时在 WordPress 后台的编辑文章页面就可以看到相应的 Post format 选项,并为文章指定相应的 Post format 了。

WordPress Post forma样式

WordPress Post forma样式

在主题中整合 Post format

经过上述这一步,只是添加了主题对 Post format 的支持而已,要在前台显示出不同 format 之间在风格上的区别,这才是主题制作上的重头戏,也留给了创作者很大施展的空间。

如何将不同的类型的文章展示出不同的风格呢?简单来说,就是通过条件语句加上 CSS 的控制来达到的。

目前 Lucifr 就在修改使用中的这个主题,以让其实现 Post format 功能,以 aside 类别的添加为例:

<?php if ( has_post_format( 'aside' )) { ?>
    <div>
        <a title="<?php the_title(); ?>" href="<?php the_permalink(); ?>">Permalink for this post</a>
        <div></div>
        <div>
        <?php the_content(); ?>
        </div>
    </div>
<?php }else { ?>

在显示文章列表的 entry.php 中添加了以上的代码之后,就为 aside 创建出了一个特殊的格式,配合一些 CSS:

.aside-entry {
    background: none repeat scroll 0 0 #FFFFFF;
    border-radius: 4px 4px 4px 4px;
    box-shadow: 1px 1px 1px #A0A0A0;
    padding: 12px 30px;
    color: #666666;
    font-size: 14px;
}

.aside-entry a {
    color: #3174A3;
}

.aside-pointer {
    background: url("images/aside-pointer.png") no-repeat scroll 0 0 transparent;
    display: block;
    height: 17px;
    margin: 12px 0 0 -13px;
    position: absolute;
    width: 13px;
}

就可以显示出与正常(standard)文章不同的风格:

正常文章样式

正常文章样式

去除侧边栏

去除侧边栏

 

同理,我们也可以为其它的 Post format 创造出独特的风格来。

只要按照这样的写法就可以了:

<?php if ( has_post_format( 'aside' )) { ?>
    这里写入 aside 的格式
<?php } else if (has_post_format('gallery')) { ?>
    这里写入 gallery 的格式
<?php } else if (has_post_format('link')) { ?>
    这里写入 link 的格式
...
<?php }else { ?>
    最后是普通格式
<?php } ?>

这样的写法适合各种 Post format 之间差别很大的情况,如果是可以通过 CSS 进行调整的小修改,也可以通过活用 post_class() 函数的方式配合 CSS 来达到目的.比如:

<div id="post-<?php the_ID(); ?>" <?php post_class(); ?>>
    <h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
    <?php the_content(); ?>
</div>

配合 CSS:

.format-aside .post-title {
    display:none;
}

就达到了只在 aside 类型中隐藏文章标题的作用,同理也可以调整字体、背景等等。

后记

Post format 功能是 WordPress 向 Tumblr 的一次学习,在我看来,这反映出开发者们认识到了 WordPress 在个人使用时还不够简单、纯粹。

目前已经有一些商用主题开始支持 Post format,相信之后个人用 WordPress 主题会涌现出更多的 Tumblr 风格吧。

原文链接:http://lucifr.com/2011/04/06/wordpress-3-1-getting-more-tumblrized-with-post-format/

NEXTGEN-GALLERY在WORDPRESS文章中的调用方式和显示效果

插件应用 - NEXTGEN-GALLERY在WORDPRESS文章中的调用方式和显示效果

再这篇文章中,我将详细介绍nextgen-gallery插件的详细使用方法。
一、 如何在文章中调用nextgen-gallery新建相册

安装完毕nextgen-gallery相册后,在wordpress中有两个地方可以直接调用相册图片。

第一种方式是调用方式是在wp后台的“小工具”里面,这里我们只需要通过拖拽的方式就可以实现显示效果。

第二种方式是在发布的页面(或文章)中可以调用nextgen-gallery中的相册图片。无忧主机www.51php.com认为这是一个很简单的问题,我们只需要在发布文章(页面)的时候,在html编辑状态下,插入如下任意一段的代码就可以实现调用了图片,不需要我们编辑网站程序中的php程序代码,使用非常简单。nextgen-gallery插件调用代码如下:

插入一个幻灯片效果: [slideshow id=x w=width h=height]

插入一个相册 : [album id=相册ID template=extend] or [album id=相册ID template=compact]

插入一个图集 : [nggallery id=图集ID]

插入一张图片 : [singlepic id=x w=width h=height mode=web20|watermark float=left|right]

插入图片浏览器 : [imagebrowser id=x]

按标签显示图集 : [nggtags gallery=mytag]

显示标签的相册 : [nggtags album=mytag]

上面的代码,已经在无忧php虚拟主机中进行过测试,可以正常使用。

二、nextgen-gallery相册显示效果欣赏

无忧主机在自建的测试平台上,获得了一些简单的nextgen-gallery相册显示效果,截图并分享给大家:

1、nextgen-gallery相册侧栏随机显示照片效果

NextGEN-Gallery相册、图集插入文章

NextGEN-Gallery相册、图集插入文章

2、nextgen-gallery相册图片列表显示效果

nextgen-gallery相册图片列表显示效果

nextgen-gallery相册图片列表显示效果

3、nextgen-gallery相册幻灯片显示效果

nextgen-gallery相册幻灯片显示效果

nextgen-gallery相册幻灯片显示效果

lsof 指令

系统应用 - lsof 指令

一、lsof简介

lsof(list open files),即:列出被进程所打开的文件的信息,而被打开的文件可以是:

1.普通文件
2.目录
3.网络文件系统的文件
4.字符或设备文件
5.(函数)共享库
6.管道,命名管道
7.符号链接
8.网络文件(例如:NFS file、网络socket,unix域名socket)
9.还有其它类型的文件,等等
二、lsof的使用

1、语法: lsof 参数 names

2、常用参数

lsof -a :表示两个参数都必须满足时才显示结果(-a:and的意思)

lsof -c string :显示COMMAND列中包含指定字符的进程所有打开的文件(-c:COMMAND的意思)
注意:-c 参数后面可以跟上一个正则表达式,如下例子
(1)lsof -c /^ssh?/i

LSOF指令

LSOF指令

注意:/regex/i,后面的i表示不区分大小写,此外还可以是b(普通正则表达式)、x(扩展表达式,默认为此项)

lsof -u username :显示所属user进程打开的文件(-u:user的意思)

lsof -t /path/file:显示/path/file的进程id号

lsof -U:显示所有unix domain socket files

lsof -g gid: 显示归属gid的进程情况

lsof -s:列出打开文件的大小,如果没有大小,则留下空白(-s:size的意思)

lsof [ -r | +r ] + 时间(s):表示每隔秒重新显示输出文件信息(例如:lsof -r 3 /bin/bash,表示每隔3秒重新列出打开/bin/bash该文件相关的进程)(-r:表示repeat的意思)
(1)-r:该参数会让lsof永远不断的执行,直到收到中断信号
(2)+r:该参数会让lsof一直执行,直到没有档案被显示

lsof +d /DIR/: 显示目录下被进程打开的文件

lsof +D /DIR/ :同上,但是会搜索目录下的所有目录,时间相对较长

lsof -d FD: 显示指定文件描述符的进程

lsof -n :不将IP转换为hostname,缺省是不加上-n参数

lsof -i :用以显示符合条件的进程情况
(1)如果-i后不跟任何参数,则表示显示所有Internet and x.25 (HP-UX) network files
(2)如果-i后跟一些参数,则表示相关的文件
lsof -i [4 | 6] [protocol] [@hostname|hostaddr][:service|port]
解析如下:
46 –> IPv4 or IPv6
protocol –> TCP or UDP
hostname –> Internet host name
hostaddr –> IPv4地址
service –> /etc/service中的 service name (可以不只一个)
port –> 端口号 (可以不只一个)

lsof 常见的用法:是查找应用程序打开的文件的名称和数目。可用于查找出某个特定应用程序将日志数据记录到何处,或者正在跟踪某个问题。例如,linux限制了 进 程能够打开文件的数目。通常这个数值很大,所以不会产生问题,并且在需要时,应用程序可以请求更大的值(直到某个上限)。如果你怀疑应用程序耗尽了文件描 述符,那么可以使用 lsof 统计打开的文件数目,以进行验证

三、lsof实例

1)列出所有打开的文件

lsof

备注:如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位,每行显示一个打开的文件,若不指定条件默认将显示所有进程打开的所有文件

LSOF指令2

LSOF指令2


lsof输出各列信息的意义如下:
COMMAND:进程的名称
PID:进程标识符
PPID:父进程标识符(需要指定-R参数)
USER:进程所有者
PGID:进程所属组
FD:文件描述符,应用程序通过文件描述符识别该文件。如cwd、txt等
(1)cwd:表示current work dirctory,即:应用程序的当前工作目录,这是该应用程序启动的目录,除非它本身对这个目录进行更改
(2)txt :该类型的文件是程序代码,如应用程序二进制文件本身或共享库,如上列表中显示的 /sbin/init 程序
(3)Lnn:library references (AIX);
(4)er:FD information error (see NAME column);
(5)jld:jail directory (FreeBSD);
(6)ltx:shared library text (code and data);
(7)Mxx :hex memory-mapped type number xx.
(8)m86:DOS Merge mapped file;
(9)mem:memory-mapped file;
(10)mmap:memory-mapped device;
(11)pd:parent directory;
(12)rtd:root directory;
(13)tr:kernel trace file (OpenBSD);
(14)v86 VP/ix mapped file;
(15)0:表示标准输出
(16)1:表示标准输入
(17)2:表示标准错误
一般在标准输出、标准错误、标准输入后还跟着文件状态模式:r、w、u等
(1)u:表示该文件被打开并处于读取/写入模式
(2)r:表示该文件被打开并处于只读模式
(3)w:表示该文件被打开并处于
(4)空格:表示该文件的状态模式为unknow,且没有锁定
(5)-:表示该文件的状态模式为unknow,且被锁定
同时在文件状态模式后面,还跟着相关的锁
(1)N:for a Solaris NFS lock of unknown type;
(2)r:for read lock on part of the file;
(3)R:for a read lock on the entire file;
(4)w:for a write lock on part of the file;(文件的部分写锁)
(5)W:for a write lock on the entire file;(整个文件的写锁)
(6)u:for a read and write lock of any length;
(7)U:for a lock of unknown type;
(8)x:for an SCO OpenServer Xenix lock on part of the file;
(9)X:for an SCO OpenServer Xenix lock on the entire file;
(10)space:if there is no lock.
TYPE:文件类型,如DIR、REG等,常见的文件类型
(1)DIR:表示目录
(2)CHR:表示字符类型
(3)BLK:块设备类型
(4)UNIX: UNIX 域套接字
(5)FIFO:先进先出 (FIFO) 队列
(6)IPv4:网际协议 (IP) 套接字
DEVICE:指定磁盘的名称
SIZE:文件的大小
NODE:索引节点(文件在磁盘上的标识)
NAME:打开文件的确切名称

2)查看谁正在使用某个文件,也就是说查找某个文件相关的进程

[root@Firewall ~]# lsof /bin/bash
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 2298 root txt REG 253,0 729292 1474563 /bin/bash
bash 2409 ruanxi txt REG 253,0 729292 1474563 /bin/bash

3)递归查看某个目录的文件信息

lsof +D /filepath/filepath2/

备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

4)比使用+D选项,遍历查看某个目录的所有文件信息 的方法

lsof | grep ‘/filepath/filepath2/’

5)列出某个用户打开的文件信息

lsof -u username

备注: -u 选项,u其实是user的缩写

6)列出某个程序进程所打开的文件信息

lsof -c mysql

备注: -c 选项将会列出所有以mysql这个进程开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了

7)列出多个进程多个打开的文件信息

lsof -c mysql -c apache

8)列出某个用户以及某个进程所打开的文件信息(注意:用户与进程可相关,也可以不相关)

lsof -u test -c mysql

9)列出除了某个用户外的被打开的文件信息

lsof -u ^root

备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

10)通过某个进程号显示该进行打开的文件

lsof -p 1

11)列出多个进程号对应的文件信息

lsof -p 1,2,3

12)列出除了某个进程号,其他进程号所打开的文件信息

lsof -p ^1

13)列出所有的网络连接

lsof -i

14)列出所有tcp 网络连接信息

lsof -i tcp

15)列出所有udp网络连接信息

lsof -i udp

16)列出谁在使用某个端口

lsof -i :3306

17)列出谁在使用某个特定的udp端口

lsof -i udp:55

特定的tcp端口

lsof -i tcp:80

18)列出某个用户的所有活跃的网络端口

lsof -a -u test -i

19)列出所有网络文件系统

lsof -N

20)域名socket文件

lsof -u

21)某个用户组所打开的文件信息

lsof -g 5555

22)根据文件描述列出对应的文件信息

lsof -d description(like 2)
例如:lsof -d txt
例如:lsof -d 1
例如:lsof -d 2
注意:0表示标准输入,1表示标准输出,2表示标准错误,从而可知:所以大多数应用程序所打开的文件的 FD 都是从 3 开始

23)根据文件描述范围列出文件信息

lsof -d 2-3

24)列出COMMAND列中包含字符串” perl “,且文件描符的类型为txt的文件信息

ruanxi@ubuntu:~$ lsof -c perl -a -d txt
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
perl 5249 sayuri txt unknown /proc/5249/exe (readlink: Permission denied)
perl 5376 sayuri txt unknown /proc/5376/exe (readlink: Permission denied)
perl 5463 sayuri txt unknown /proc/5463/exe (readlink: Permission denied)
perl 5567 sayuri txt unknown /proc/5567/exe (readlink: Permission denied)

25)列出被进程号为1234的进程所打开的所有IPV4 network files

lsof -i 4 -a -p 1234

25)列出目前连接主机ubuntu.unix-center上端口为:20,21,22,25,53,80相关的所有文件信息,且每隔3秒不断的执行lsof指令

lsof -i @ubuntu.unix-center:20,21,22,25,53,80 -r 3
例如:下图一个例子,由于主机Firewall上开启了FTP与SSH服务,所以通过lsof指令来查看所有连接到FirewallFTP与SSH服务且打开的文件信息列表

LSOF指令3

LSOF指令3


26)一些常用的例子

(1)To list all files using any protocol on any port of Firewall (Firewall is hostname)
lsof -i @Firewall

(2)To list all open files on device /dev/hd4
lsof /dev/hd4

(3)To list all open files for login name ‘‘abe’’, or user ID 1234, or process 456, or process 123, or process 789
lsof -p 456,123,789 -u 1234,abe

(4)To send a SIGHUP to the processes that have /usr/sbin/vsftpd open
kill -HUP `/usr/sbin/vsftpd` (即:杀死vsftpd服务)
kill -9 `/usr/sbin/vsftpd` (即:杀死vsftpd服务)

(5) To find any open file, including an open UNIX domain socket file, with the name /dev/log
lsof /dev/log

(6)To find processes with open files on the NFS file system named /nfs/mount/point whose server is inaccessible, and presuming your mount table supplies the device number for /nfs/mount/point
lsof -b /nfs/mount/point

(7)To do the preceding search with warning messages suppressed
lsof -bw /nfs/mount/point

四、lsof与文件恢复相关

实例 一:查找谁在使用文件系统在卸载文件系统时,如果该文件系统中有任何打开的文件,操作通常将会失败。那么通过lsof可以找出那些进程在使用当前要卸载的文件系统,如下:
# lsof /GTES11/
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
bash 4208 root cwd DIR 3,1 4096 2 /GTES11/
vim 4230 root cwd DIR 3,1 4096 2 /GTES11/
在这个示例中,用户root正在其/GTES11目录中进行一些操作。
(1)一个 bash是实例正在运行,并且它当前的目录为/GTES11
(2)另一个则显示的是vim正在编辑/GTES11下的文件
要成功地卸载/GTES11,应该在通知用户以确保情况正常之后,中止这些进程。 这个示例说明了应用程序的当前工作目录非常重要,因为它仍保持着文件资源,并且可以防止文件系统被卸载。这就是为什么大部分守护进程(后台进程)将它们的 目录更改为根目录、或服务特定的目录(如 sendmail 示例中的
/var/spool/mqueue)的原因,以避免该守护进程阻止卸载不相关的文件系统。

实例二:恢复删除的文件当Linux计算机受到入侵时,常见的情况是日志文件被删除,以掩盖攻击者的踪迹。管理错误也可能导致意外删除重要的文件,比如在清理旧日志时,意外地删除了数据库的活动事务日志,有时可以通过lsof来恢复这些文件。

当进程打开了某个文件时,只要该进程保持打开该文件,即使将其删除,它依然存在于磁盘中,这意味着:进程并不知道文件已经被删除,它仍然可以向打开该文件时提供给它的文件描述符进行读取和写入。除了该进程之外,这个文件是不可见的,因为已经删除了其相应的目录索引节点。 在/proc 目录下,其中包含了反映内核和进程树的各种文件,/proc目录挂载的是在内存中所映射的一块区域,所以这些文件和目录并不存在于磁盘中,因此当我们对这些文件进行读取和写入时,实际上是在从内存中获取相关信息。大多数与 lsof 相关的信息都存储于以进程的 PID 命名的目录中,即 /proc/1234 中包含的是 PID 为 1234 的进程的信息。每个进程目录中存在着各种文件,它们可以使得应用程序简单地了解进程的内存空间、文件描述符列表、指向磁盘上的文件的符号链接和其他系统信息。lsof 程序使用该信息和其他关于内核内部状态的信息来产生其输出。所以lsof 可以显示进程的文件描述符和相关的文件名等信息。也就是我们通过访问进程的文件描述符可以找到该文件的相关信息。 当系统中的某个文件被意外地删除了,只要这个时候系统中还有进程正在访问该文件,那么我们就可以通过lsof从/proc目录下恢复该文件的内容

假如由于误操作将/var/log/messages文件删除掉了,那么这时要将/var/log/messages文件恢复的方法如下: 首先使用lsof来查看当前是否有进程打开/var/logmessages文件,如下:
# lsof |grep /var/log/messages
syslogd 1283 root 2w REG 3,3 5381017 1773647 /var/log/messages (deleted)
从上面的信息可以看到 PID 1283(syslogd)打开文件的文件描述符为 2。同时还可以看到/var/log/messages已经标记被删除了。因此我们可以在 /proc/1283/fd/2 (fd下的每个以数字命名的文件表示进程对应的文件描述符)中查看相应的信息,如下: # head -n 10 /proc/1283/fd/2
Aug 4 13:50:15 holmes86 syslogd : restart.
Aug 4 13:50:15 holmes86 kernel: klogd 1.4.1, log source = /proc/kmsg started.
Aug 4 13:50:15 holmes86 kernel: Linux version 2.6.22.1-8 () (gcc version 4.2.0) #1 SMP Wed Jul 18 11:18:32 EDT 2007
Aug 4 13:50:15 holmes86 kernel: BIOS-provided physical RAM map:
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000000000 – 000 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 000 – 0000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0000000000100000 – 7d3800 (usable)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 7d3800 – 0000000020000000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 00000000e0000000 – 0007000 (reserved)
Aug 4 13:50:15 holmes86 kernel: BIOS-e820: 0008000 – 000 (reserved)
从上面的信息可以看出,查看 /proc/8663/fd/15 就可以得到所要恢复的数据。如果可以通过文件描述符查看相应的数据,那么就可以使用 I/O 重定向将其复制到文件中,如: cat /proc/1283/fd/2 > /var/log/messages
对于许多应用程序,尤其是日志文件和数据库,这种恢复删除文件的方法非常有

Nginx.conf介绍

VPS相关 - Nginx.conf介绍

在此记录下Nginx服务器nginx.conf的配置文件说明, 部分注释收集与网络.
#运行用户
user www-data;
#启动进程,通常设置成和cpu的数量相等
worker_processes 1;

#全局错误日志及PID文件
error_log /var/log/nginx/error.log;
pid /var/run/nginx.pid;

#工作模式及连接数上限
events {
use epoll; #epoll是多路复用IO(I/O Multiplexing)中的一种方式,但是仅用于linux2.6以上内核,可以大大提高nginx的性能
worker_connections 1024;#单个后台worker process进程的最大并发链接数
# multi_accept on;
}

#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/log/nginx/access.log;

#sendfile 指令指定 nginx 是否调用 sendfile 函数(zero copy 方式)来输出文件,对于普通应用,
#必须设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为 off,以平衡磁盘与网络I/O处理速度,降低系统的uptime.
sendfile on;
#tcp_nopush on;

#连接超时时间
#keepalive_timeout 0;
keepalive_timeout 65;
tcp_nodelay on;

#开启gzip压缩
gzip on;
gzip_disable “MSIE [1-6]\.(?!.*SV1)”;

#设定请求缓冲
client_header_buffer_size 1k;
large_client_header_buffers 4 4k;

include /etc/nginx/conf.d/*.conf;
include /etc/nginx/sites-enabled/*;

#设定负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
#本机上的Squid开启3128端口
server 192.168.8.1:3128 weight=5;
server 192.168.8.2:80 weight=1;
server 192.168.8.3:80 weight=6;
}

server {
#侦听80端口
listen 80;
#定义使用www.xx.com访问
server_name www.xx.com;

#设定本虚拟主机的访问日志
access_log logs/www.xx.com.access.log main;

#默认请求
location / {
root /root; #定义服务器的默认网站根目录位置
index index.php index.html index.htm; #定义首页索引文件的名称

fastcgi_pass www.xx.com;
fastcgi_param SCRIPT_FILENAME $document_root/$fastcgi_script_name;
include /etc/nginx/fastcgi_params;
}

# 定义错误提示页面
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /root;
}

#静态文件,nginx自己处理
location ~ ^/(images|javascript|js|css|flash|media|static)/ {
root /var/www/virtual/htdocs;
#过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置得小一点。
expires 30d;
}
#PHP 脚本请求全部转发到 FastCGI处理. 使用FastCGI默认配置.
location ~ \.php$ {
root /root;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /home/www/www$fastcgi_script_name;
include fastcgi_params;
}
#设定查看Nginx状态的地址
location /NginxStatus {
stub_status on;
access_log on;
auth_basic “NginxStatus”;
auth_basic_user_file conf/htpasswd;
}
#禁止访问 .htxxx 文件
location ~ /\.ht {
deny all;
}

}
}

以上是一些基本的配置,使用Nginx最大的好处就是负载均衡

如果要使用负载均衡的话,可以修改配置http节点如下:
#设定http服务器,利用它的反向代理功能提供负载均衡支持
http {
#设定mime类型,类型由mime.type文件定义
include /etc/nginx/mime.types;
default_type application/octet-stream;
#设定日志格式
access_log /var/log/nginx/access.log;

#省略上文有的一些配置节点

#。。。。。。。。。。

#设定负载均衡的服务器列表
upstream mysvr {
#weigth参数表示权值,权值越高被分配到的几率越大
server 192.168.8.1x:3128 weight=5;#本机上的Squid开启3128端口
server 192.168.8.2x:80 weight=1;
server 192.168.8.3x:80 weight=6;
}

upstream mysvr2 {
#weigth参数表示权值,权值越高被分配到的几率越大

server 192.168.8.x:80 weight=1;
server 192.168.8.x:80 weight=6;
}

#第一个虚拟服务器
server {
#侦听192.168.8.x的80端口
listen 80;
server_name 192.168.8.x;

#对aspx后缀的进行负载均衡请求
location ~ .*\.aspx$ {

root /root; #定义服务器的默认网站根目录位置
index index.php index.html index.htm; #定义首页索引文件的名称

proxy_pass http://mysvr ;#请求转向mysvr 定义的服务器列表

#以下是一些反向代理的配置可删除.

proxy_redirect off;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
client_max_body_size 10m; #允许客户端请求的最大单文件字节数
client_body_buffer_size 128k; #缓冲区代理缓冲用户端请求的最大字节数,
proxy_connect_timeout 90; #nginx跟后端服务器连接超时时间(代理连接超时)
proxy_send_timeout 90; #后端服务器数据回传时间(代理发送超时)
proxy_read_timeout 90; #连接成功后,后端服务器响应时间(代理接收超时)
proxy_buffer_size 4k; #设置代理服务器(nginx)保存用户头信息的缓冲区大小
proxy_buffers 4 32k; #proxy_buffers缓冲区,网页平均在32k以下的话,这样设置
proxy_busy_buffers_size 64k; #高负荷下缓冲大小(proxy_buffers*2)
proxy_temp_file_write_size 64k; #设定缓存文件夹大小,大于这个值,将从upstream服务器传

}

}
}

lnmp 配置不同端口号的域名

VPS相关 - lnmp 配置不同端口号的域名

1、首先用putty进去如192.168.18.67
2、 ps -ef | grep nginx 查看nginx位置和config位置
3、cd /usr/local/nginx/conf/ 进去 打开config 如vi nginx.conf
4、杀死之前的进程killall -9 /usr/local/nginx/sbin/nginx
5、/usr/local/nginx/sbin/nginx重新启动nginx

ngnix格式

server
{
listen 80;
server_name 192.168.2.67;
index index.html index.htm index.php;
root /home/wwwroot;

location ~ .*\.(php|php5)?$
{
try_files $uri =404;
fastcgi_pass unix:/tmp/php-cgi.sock;
fastcgi_index index.php;
include fcgi.conf;
}

location /status {
stub_status on;
access_log off;
}

location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 30d;
}

location ~ .*\.(js|css)?$
{
expires 12h;
}

access_log /home/wwwlogs/access.log access;
}