正在筛选分类:菜鸟Linux笔记 下的文章 清除筛选 ✕
2013
08
15
08:24

samba passwd的几种方式

passdb backend就是用户后台的意思。目前有三种后台:smbpasswd、tdbsam和ldapsam。sam应该是security account manager(安全账户管理)的简写。

 

1.smbpasswd

 

passdb backend = smbpasswd

 

该方式是使用smb自己的工具smbpasswd来给系统用户(真实用户或者虚拟用户)设置一个Samba密码,客户端就用这个密码来访问Samba的资源。smbpasswd文件默认在/etc/samba目录下,不过有时候要手工建立该文件。

 

smbpasswd -a 用户名 #添加一个samba用户

smbpasswd -d 用户名 #禁用一个samba用户

smbpasswd -e 用户名 #恢复一个samba用户

smbpasswd -x 用户名 #删除一个samba用户

 

2.tdbsam

 

passdb backend = tdbsam

 

该方式则是使用一个数据库文件来建立用户数据库。数据库文件叫passdb.tdb,默认在/etc/samba目录下。passdb.tdb 用户数据库可以使用smbpasswd –a来建立Samba用户,不过要建立的Samba用户必须先是系统用户。我们也可以使用pdbedit命令来建立Samba账户并由其pdbedit管 理。

 

用户的建立可以先用mksmbpasswd建立一个smppasswd文件,然后用pdbedit将文件里的用户导入数据库。

 

cat /etc/passwd | mksmbpasswd > /etc/samba/smbpasswd

 

pdbedit命令的参数很多,我们列出几个主要的:

 

pdbedit -i smbpasswd:/etc/samba/smbpasswd

pdbedit -a username:新建Samba账户。

pdbedit -x username:删除Samba账户。

pdbedit -L:列出Samba用户列表,读取passdb.tdb数据库文件。

pdbedit -Lv:列出Samba用户列表的详细信息。

pdbedit -c “[D]” –u username:暂停该Samba用户的账号。

pdbedit -c “[]” –u username:恢复该Samba用户的账号。

 

3.ldapsam

 

passdb backend = smbpasswd

 

该方式则是基于LDAP的账户管理方式来验证用户。首先要建立LDAP服务,然后设置“passdb backend = ldapsam:ldap://LDAP Server”。

 

注:samba3.x的早期版本默认使用tdb库也就是smb.conf默认设定为passdb backend = tdbsam,只需要注释掉该行添加smb passwd file = /etec/samba/smbpasswd即可使用smbpasswd存储加密密钥。samba3.5.6更加规范了passdb backend参数的使用,取消了smb passwd file设定,如果简单注释掉passdb backend参数,密钥文件也不会被存储到smbpasswd。所以很多人说怎么修改smb.conf的配置,smbpasswd文件都无法生成,就算 手工创建,内容也是0字节。

 

这里只能说samba版本升级了,规则也变化了。现在无论是使用tdb数据库存储密钥还是smbpasswd文本存储密钥都要设定相对应的 passdb backend参数。要用传统的文本方式存储只需这样设定passdb backend = smbpasswd:/etc/samba/smbpasswd(后面跟的是绝对路径)>,不要再画蛇添足的写上smb passwd file = /etec/samba/smbpasswd,该参数已经不适用于新版本的samba了。

 

注意,这里的用户名必须是linux中存在的用户,可以使用useradd命令在系统中添加一个用户,然后再增加一个对应的samba用户,也 就是一个用户名使用的是两套密码。一个是系统用户密码,另一个密码存储在/etc/samba/smbpasswd文件中的samba密码,这样可以防止 系统用户密钥外泄带来的安全隐患。

 

除了上面的措施外,samba还提供了一个更安全的方法,用户名映射功能,这样做的好处是防止系统内的真实用户名暴露,在smb.conf中增 加username map = /etc/samba/smbuser设定,再手工建立该文件。username map参数详解,比如有一个系统用户名为shaogroup.com,同时我们也设定其为samba的登录名,虽然是两套独立的密码,但依然告诉了用户,我系统内 也存在shaogroup.com这个用户。严格的说这也是违背系统安全规则的,不法人士可能会利用该用户名暴力猜解获得系统内帐户权限。samba提供的用户名 映射功能,只需编辑smbuser文件,格式为:真实的用户名 = 映射出的用户名(随便自定义);shaogroup.com = nas_guest nas_nobody(可以映射出多个用户名,注意中间的空格)。设定完成后,我们只需将nas_guest告诉用户即可,无须担心真实的 shaogroup.com用户名暴露。

2013
08
02
15:37

Linux系统提示There are stopped jobs怎么办?

运行命令 logout 时,系统提示: There are stopped jobs 。这时可以运行命令 jobs ,看看是什么程序还在运行然后运行命令 fg ,把还在运行的程序调出来,安全退出该程序就可以了。

2013
07
24
15:16

解决nginx出现File not found的问题

使用php-fpm解析PHP,”No input file specified”,”File not found”是令nginx新手头疼的常见错误,原因是php-fpm进程找不到SCRIPT_FILENAME配置的要执行的.php文件,php-fpm返回给nginx的默认404错误提示。

比如我的网站doucument_root下没有test.php,访问这个文件时通过抓包可以看到返回的内容。

 

HTTP/1.1 404 Not Found

Date: Fri, 21 Dec 2012 08:15:28 GMT

Content-Type: text/html

Proxy-Connection: close

Server: nginx/1.2.5

X-Powered-By: PHP/5.4.7

Via: 1.1 c3300 (NetCache NetApp/6.0.7)

Content-Length: 16

 

File not found.

 

很多人不想用户直接看到这个默认的404错误信息,想自定义404错误.

给出解决办法前我们来先分析下如何避免出现这类404错误,然后再说真的遇到这种情况(比如用户输入一个错误不存在的路径)时该怎么办,才能显示自定义的404错误页。

一、错误的路径被发送到php-fpm进程

出现这类错误,十个有九个是后端fastcgi进程收到错误路径(SCRIPT_FILENAME),而后端fastcgi收到错误路径的原因大都是配置错误。

 

常见的nginx.conf的配置如下:

server {

listen [::]:80;

server_name example.com www.example.com;

access_log /var/www/logs/example.com.access.log;

 

location / {

root /var/www/example.com;

index index.html index.htm index.pl;

}

 

location /images {

autoindex on;

}

 

location ~ \.php$ {

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME /var/www/example.com$fastcgi_script_name;

include fastcgi_params;

}

}

这个配置中有很多不合理的地方,其中一个明显的问题就是root指令被放到了location / 块。如果root指令被定义在location块中那么该root指令只能对其所在的location生效。其它locaiont中没有root指令,像location /images块不会匹配任何请求,需要在每个请求中重复配置root指令来解决这个问题。因此我们需要把root指令放在server块,这样各个location就会继承父server块定义的$document_root,如果某个location需要定义一个不同的$document_root,则可以在location单独定义一个root指令。

 

另一个问题就是fastCGI参数SCRIPT_FILENAME 是写死的。如果修改了root指令的值或者移动文件到别的目录,php-fpm会返回“No input file specified”错误,因为SCRIPT_FILENAME在配置中是写死的并没有随着$doucument_root变化而变化,我们可以修改SCRIPT_FILENAME配置如下:

 

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

 

 

所以我们不能忘记在server块中配置root指令,不然$document_root的值为空,只会传$fastcgi_script_name到php-fpm,这样就会导致“No input file specified”错误。

 

 二、请求的文件真的不存在

当nginx收到一个不存在的.php文件的请求时,因为nginx只会检查$uri是否是.php结尾,不会对文件是否存在进行判断,.php结尾的请求nginx会直接发给php-fpm处理。php-fpm处理时找不到文件就会返回“No input file specified”带着“404 Not Found”头。

解决办法

我们在nginx拦截不存在的文件,请求并返回自定义404错误

 

使用 try_files 捕捉不存在的urls并返回错误。

location ~ .php$ {

try_files $uri =404;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME ….

……………………………..

……………………………..

}

上面的配置会检查.php文件是否存在,如果不存在,会返回404页面。

2013
06
13
11:27

wordpress mb_strimwidth() 函数不可用解决办法

博客搬家将以前的APACHE换成了NGINX,配置的过程中没有安装php5_mbstring导致首页的摘要始终无法显示,之前做模板时首页摘要是用mb_strimwidth() 函数进行截断,一开始还以为是模板出问题了,修改了半天,都无法解决,最后无意间在网上看到一篇文章才发现自己没安装php5_mbstring导致的,直接安装然后重启nginx和php-fpm就OK了。

mb_strimwidth() 函数进行截断,对于中文用户来说,这个函数是相当实用的,因为很多摘要的方法都会把中文字截断出乱码,因为中文字在 UTF-8 编码下占三个长度,如果你使用的是VPS,那么直接安装php5-mbstring即可,如果是虚拟主机,那就看主机都默认支持这个函数的,前提是要开启 mb_string 这个模块。那如果主机没有开启 mb_string 就不能使用 mb_strimwidth() 函数了吗?有没有变通的办法呢?答案当然是 YES

先在 WordPress 主题的 functions.php 文件中添加如下代码:

function dm_strimwidth($str ,$start , $width ,$trimmarker ){

$output = preg_replace(‘/^(?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,’.$start.’}((?:[\x00-\x7F]|[\xC0-\xFF][\x80-\xBF]+){0,’.$width.’}).*/s’,’\1′,$str);

return $output.$trimmarker;

}

接下来在需要的地方调用如下:

 

echo dm_strimwidth(strip_tags($post->post_content),0,200,’<a href=”‘.get_permalink().'”>……[阅读全文]</a>’);

2013
06
07
14:50

Nginx配置文件nginx.conf中文详解

#定义Nginx运行的用户和用户组

user www www;

 

#nginx进程数,建议设置为等于CPU总核心数。

worker_processes 8;

 

#全局错误日志定义类型,[ debug | info | notice | warn | error | crit ]

error_log /var/log/nginx/error.log info;

 

#进程文件

pid /var/run/nginx.pid;

 

#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit -n)与nginx进程数相除,但是nginx分配请求并不均匀,所以建议与ulimit -n的值保持一致。

worker_rlimit_nofile 65535;

 

#工作模式与连接数上限

events

{

#参考事件模型,use [ kqueue | rtsig | epoll | /dev/poll | select | poll ]; epoll模型是Linux 2.6以上版本内核中的高性能网络I/O模型,如果跑在FreeBSD上面,就用kqueue模型。

use epoll;

#单个进程最大连接数(最大连接数=连接数*进程数)

worker_connections 65535;

}

 

#设定http服务器

http

{

include mime.types; #文件扩展名与文件类型映射表

default_type application/octet-stream; #默认文件类型

#charset utf-8; #默认编码

server_names_hash_bucket_size 128; #服务器名字的hash表大小

client_header_buffer_size 32k; #上传文件大小限制

large_client_header_buffers 4 64k; #设定请求缓

client_max_body_size 8m; #设定请求缓

sendfile on; #开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为 on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统的负载。注意:如果图片显示不正常把这个改成off。

autoindex on; #开启目录列表访问,合适下载服务器,默认关闭。

tcp_nopush on; #防止网络阻塞

tcp_nodelay on; #防止网络阻塞

keepalive_timeout 120; #长连接超时时间,单位是秒

 

#FastCGI相关参数是为了改善网站的性能:减少资源占用,提高访问速度。下面参数看字面意思都能理解。

fastcgi_connect_timeout 300;

fastcgi_send_timeout 300;

fastcgi_read_timeout 300;

fastcgi_buffer_size 64k;

fastcgi_buffers 4 64k;

fastcgi_busy_buffers_size 128k;

fastcgi_temp_file_write_size 128k;

 

#gzip模块设置

gzip on; #开启gzip压缩输出

gzip_min_length 1k; #最小压缩文件大小

gzip_buffers 4 16k; #压缩缓冲区

gzip_http_version 1.0; #压缩版本(默认1.1,前端如果是squid2.5请使用1.0)

gzip_comp_level 2; #压缩等级

gzip_types text/plain application/x-javascript text/css application/xml;

#压缩类型,默认就已经包含text/html,所以下面就不用再写了,写上去也不会有问题,但是会有一个warn。

gzip_vary on;

#limit_zone crawler $binary_remote_addr 10m; #开启限制IP连接数的时候需要使用

 

upstream blog.yourname.com {

#upstream的负载均衡,weight是权重,可以根据机器配置定义权重。weigth参数表示权值,权值越高被分配到的几率越大。

server 192.168.80.121:80 weight=3;

server 192.168.80.122:80 weight=2;

server 192.168.80.123:80 weight=3;

}

 

#虚拟主机的配置

server

{

#监听端口

listen 80;

#域名可以有多个,用空格隔开

server_name www.yourname.com yourname.com;

index index.html index.htm index.php;

root /data/www/yourname;

location ~ .*.(php|php5)?$

{

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fastcgi.conf;

}

#图片缓存时间设置

location ~ .*.(gif|jpg|jpeg|png|bmp|swf)$

{

expires 10d;

}

#JS和CSS缓存时间设置

location ~ .*.(js|css)?$

{

expires 1h;

}

#日志格式设定

log_format access ‘$remote_addr – $remote_user [$time_local] “$request” ‘

‘$status $body_bytes_sent “$http_referer” ‘

‘”$http_user_agent” $http_x_forwarded_for’;

#定义本虚拟主机的访问日志

access_log /var/log/nginx/access.log access;

 

#对 “/” 启用反向代理

location / {

proxy_pass http://127.0.0.1:88;

proxy_redirect off;

proxy_set_header X-Real-IP $remote_addr;

#后端的Web服务器可以通过X-Forwarded-For获取用户真实IP

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

#以下是一些反向代理的配置,可选。

proxy_set_header Host $host;

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服务器传

}

 

#设定查看Nginx状态的地址

location /NginxStatus {

stub_status on;

access_log on;

auth_basic “NginxStatus”;

auth_basic_user_file conf/htpasswd;

#htpasswd文件的内容可以用apache提供的htpasswd工具来产生。

}

 

#本地动静分离反向代理配置

#所有jsp的页面均交由tomcat或resin处理

location ~ .(jsp|jspx|do)?$ {

proxy_set_header Host $host;

proxy_set_header X-Real-IP $remote_addr;

proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

proxy_pass http://127.0.0.1:8080;

}

#所有静态文件由nginx直接读取不经过tomcat或resin

location ~ .*.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)$

{ expires 15d; }

location ~ .*.(js|css)?$

{ expires 1h; }

}

}

2013
06
05
17:25

nginx中配置ip直接访问的默认站点

nginx中,每个站点都是由一个server段定义的,这里面设定了监听的ip和端口,站点的域名,根目录等信息。但一般来说vps主机上每个ip上会对应几个不同的站点。这样就会出现一个问题,直接访问这个ip的话,访问的会是哪个站点?

答案是这样的:在Listen ip:port; 这个指令行中,有一个参数default_server,指定了它后,这个server段就会是这个ip的默认站点;如果没有这个参数,那么默认ip直接访问的是nginx.conf中出现的第一个server段对应的站点。

server{

listen 80 default_server;

server_name ixq.us;

rewrite ^ http://www.ixq.us$request_uri?;

}

2013
06
05
15:16

Linux防火墙Firestarter

Firestarter是一款适合个人用户和小型企业的图形界面iptables配置工具,可以用来构建和维护防火墙,加固网络安全。对于与局域网共享唯一公共IP地址的NAT防火墙来说,这是一个不错的选择,并且在防火墙之后,它还有一些公共服务,或者一个分离的DMZ。它拥有打开或关闭防火墙的一些简易命令,可以查看状态视图和当前的活动。

 

虽然Firestarter需要GTK并设计在GNOME下面运行,但是它同样也能够在KDE下面运行。

 

主要特点

 

适用于台式机,服务器和网关

可共享Internet连接

允许自定义入站和出站访问策略

使用向导轻松配置防火墙

设置和控制DHCP服务器

实时展示外来入侵和其他防火墙事件,方便用户及时调整ICMP参数以帮助阻止DoS攻击

查看活动的网络连接,包括任何进站和出站的访问必须经过防火墙

安装

# aptitude install firestarter

当然,你也可以用Synaptic(新立得软件包管理器)来安装。

 

主界面截图

运行向导配置

 

 

 

点击 FireStarter 主界面的菜单 防火墙 → 运行向导 可以进入 FireStarter 的运行向导界面。不要看到英文就担心,这里的关键信息文字已经被翻译成中文,很容易理解。按照向导的指示点击“前进”。

第一步是选择连接到 Internet 的网络设备,一般来说由软件自动侦测的网络设备不会有错的。但这些网络设备至少需要是已经激活的网络连接(例如 eth0、eth1)等。

第二步是选择连接到内部局域网的接口设备,一般来说用户可以相信软件的自动侦测功能。这里有个特别的选项用于设置是否实现共享 Internet 上网,即“Enable Internet connection sharing”,如果你要使内部局域网内的其他计算机可以共享这台主机上的 Internet 连接,那么请在这个选项旁边打个勾。

第三步是选择是否立即启用防火墙。通常这个选项是打勾选择的。

这时候点击“保存”,一切已经就绪。

 

使用首选项

 

和别的 Linux 软件一样,FireStarter 也有“首选项”使用户可以随时对该软件进行各方面的配置。你可以从左边的折叠菜单里选择 防火墙 / 网络配置,然后在右边的配置界面中一步完成。

 

事实上这个界面囊括了运行向导中的三个步骤,你可以在这里分别选择连接到 Internet 的网络设备(Internet connected network device)和连接到内部局域网的网络设备(Local network connected device)。

然后在“Enable Internet connection sharing”选项前面打个勾。在配置窗口的右下角点击“接受”按钮,配置就完成了。

 

在“首选项”的接口(Interface)菜单中,在以下两个选项的前面都打个勾:

 

启用托盘图标

Minimize to tray on window close(当窗口关闭时最小化到系统托盘)

 

 

在“首选项”的防火墙菜单中,在以下选项的前面打个勾:

 

Start/restart firewall on program startup(启动时运行 FireStarter)

Start/restart firewall on dial-out(如果你使用拨号网络的话,请开启本项)

Start/restart firewall on DHCP lease renewal(从 DHCP 获得 IP 时自动运行)

ICMP过滤,你可以根据自己的需要勾选。

Tos过滤,也是根据自己的需要勾选。

设置好了,在配置窗口的右下角点击“接受”按钮。

 

更多配置功能

 

FIreStarter 的界面非常直观。你可以很容易了解和上手使用其中的各种功能。

 

你可以在主界面中见到“状态”“事件”“策略”三个选项卡。分别点击,可以看到 FireStarter 防火墙当前的运行状态、被过滤连接的事件日志(你可以随时清空或者保存这些日志)、在“策略”中随时添加删除自定义的防火墙规则以实现更复杂多样的准入和过滤设置。下图为查看事件,被过滤的连接:

自定义防火墙规则,点击策略选项:

新建规则:向局域网内其他计算机开放 https 安全浏览服务的端口

术语

 

默认策略:在默认情况下,firestarter实现了用户友好的策略,该策略能够保护防火墙主机和客户端系统。在一般情况下,它允许出站流量,并屏蔽那些并不是用来响应出站流量的入站流量。具体说来,默认的firestarter策略如下。

屏蔽新的来自因特网、目的地是防火墙主机或客户端系统的入站连接。

允许那些用来响应由防火墙主机或客户端系统发起的到Internet的连接而发送的入站分组。

允许防火墙主机建立连接。

允许客户端系统建立到因特网的连接。

不允许客户端系统建立到防火墙主机的连接。

在使用防火墙向导设置firestarter之后,就能够修改默认策略以满足你的需要。

(防火墙)主机(系统)——运行着防火墙的系统。

客户端系统——与防火墙主机位于同一个局域网的系统,它们离开局域网的分组以及(特别是从因特网)进入局域网的分组都要经过防火墙主机。

策略——防火墙应用的规则集。

规则——一条语句,用来指定当防火墙在它的网络接口中接收到来自指定系统的指定类型的分组时执行什么动作。

连接——在TCP中,连接指的是两个系统交换的数据所经过的路径。客户端系统通过向服务器系统发送一个SYN(同步)分组打开一条连接。服务器向该客户端发回一个ACK(应答)分组,然后两个系统交换数据。客户端用一个SYN分组将连接关闭。虽然UDP的工作方式有所不同(因为它没有连接的概念),但是就这里的讨论而言,UDP连接这个概念是合适的。

入站连接——这些连接包括来自因特网的连接以及将防火墙主机作为目的地的客户端系统。

出站连接——这些连接包括来自防火墙主机的连接以及将因特网作为目的地的客户端系统。

2013
06
04
10:08

lftp使用

命令:

lftp user@site:port

 

这个命令可以防止密码以明文出现。

 

终端:

 

man lftp

 

进入lftp后

 

help

 

获得帮助

 

就可以看到命令列表

 

下面我们看一下lftp常用的命令:

 

ls

显示远端文件列表。

cd

切换远端目录。

get

下载远端文件。

mget

下载远端文件(可以用通配符也就是 *)。

pget

使用多个线程来下载远端文件, 预设为五个。

mirror

下载/上传/同步 整个目录。

put

上传文件。

mput

上传多个文件(支持通配符)。

mv

移动远端文件(远端文件改名)。

rm

删除远端文件。

mrm

删除多个远端文件(支持通配符)。

mkdir

建立远端目录。

rmdir

删除远端目录。

pwd

显示目前远端所在目录。

du

计算远端目录的大小

!

执行本地 shell的命令(由于lftp 没有 lls, 故可用 !ls 来替代)

lcd

切换本地目录

lpwd

显示本地目录

alias

定义别名

bookmark

设定书签。

exit

退出ftp

2013
05
31
11:37

Nginx 301重定向域名

Nginx 301重定向域名

为何要使用301重定向

在网站建设中需要网页重定向的情况很多:如网页目录结构变动,网页重命名、网页的扩展名改变、网站域名改变等。如果不做重定向,用户的收藏和搜索引擎数据库中的旧地址只能让访客得到一个404错误信息页面,访问流量白白丧失。不仅如此,之前该页面的一切积累(比如PR值)就都白费了。

 

301重定向不仅能使页面实现自动跳转,对于搜索引擎来说,也可能可以传递PR值。

 

nginx重定向规则详细介绍

rewrite命令

nginx的rewrite相当于apache的rewriterule(大多数情况下可以把原有apache的rewrite规则加上引号就可以直接使用),它可以用在server,location 和IF条件判断块中,命令格式如下:

rewrite 正则表达式 替换目标 flag标记

flag标记可以用以下几种格式:

last – 基本上都用这个Flag。

break – 中止Rewirte,不在继续匹配

redirect – 返回临时重定向的HTTP状态302

permanent – 返回永久重定向的HTTP状态301

例如下面这段设定nginx将某个目录下面的文件重定向到另一个目录,$2对应第二个括号(.*)中对应的字符串:

location /download/ {

rewrite ^(/download/.*)/m/(.*)\..*$ $1/nginx-rewrite/$2.gz break;

}

 

nginx重定向的IF条件判断

在server和location两种情况下可以使用nginx的IF条件判断,条件可以为以下几种:

正则表达式

 

如:

匹配判断

~ 为区分大小写匹配; !~为区分大小写不匹配

~* 为不区分大小写匹配;!~为不区分大小写不匹配

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

if ($http_user_agent ~ MSIE) {

rewrite ^(.*)$ /nginx-ie/$1 break;

}

文件和目录判断

-f和!-f判断是否存在文件

-d和!-d判断是否存在目录

-e和!-e判断是否存在文件或目录

-x和!-x判断文件是否可执行

例如下面设定nginx在文件和目录不存在的时候重定向:

if (!-e $request_filename) {

proxy_pass http://127.0.0.1/;

}

 

return

返回http代码,例如设置nginx防盗链:

location ~* \.(gif|jpg|png|swf|flv)$ {

valid_referers none blocked http://www.yourname.com/ http://www.yourname.com/;

if ($invalid_referer) {

return 404;

}

}

 

set

设置nginx变量

 

 

 

301重定向方法

进行了301重定向,把www .yourname.com和yourname.com合并,并把之前的域名也一并合并. 有两种实现方法,第一种方法是判断nginx核心变量host(老版本是http_host):

server {

server_name www.yourname.com yourname.com ;

if ($host != ‘www.yourname.com’ ) {

rewrite ^/(.*)$ http://www.yourname.com/$1 permanent;

}

}

第二种方法:

server {

server_name yourname.com;

rewrite ^/(.*) http://www.yourname.com/$1 permanent;

}

 

测试了第一种方法ok,这两种方法中, permanent是关键,详细说明见nginx重定向规则说明。

 

last – 基本上都用这个Flag。

break – 中止Rewirte,不在继续匹配

redirect – 返回临时重定向的HTTP状态302

permanent – 返回永久重定向的HTTP状态301

 

好了,现在可以检查结果,这里可以看返回的HTTP头信息:

 

http://www.seoconsultants.com/tools/headers.asp

 

第二种方法没有测试成功…

 

 

 

测试是否定向成功

 

http://qinfy.net/301-redirect-for-nginx/

 

输入指令~

 

/usr/local/nginx/sbin/nginx -t

 

提示:

the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok

configuration file /usr/local/nginx/conf/nginx.conf test is successful

 

测试成功~ 重启nginx~ 输入指令~

 

/usr/local/nginx/sbin/nginx -s reload

 

重启之后测试一下~是否成功设定完成! 输入指令~

 

curl -I imcat.tk

 

 

 

会输出:

 

HTTP/1.1 301 Moved Permanently

Server: nginx/0.7.65

Date: Tue, 03 Aug 2010 01:12:37 GMT

Content-Type: text/html

Content-Length: 185

Connection: keep-alive

Location: http://yourname.net/

 

nginx rewrite 伪静态配置参数详细说明(转)

 

http://hi.baidu.com/hx10/blog/item/942a0ad784f3ffd0a144df94.html

 

nginx rewrite 伪静态配置参数和使用例子 附正则使用说明

 

正则表达式匹配,其中:

 

* ~ 为区分大小写匹配

* ~* 为不区分大小写匹配

* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配

 

 

文件及目录匹配,其中:

 

* -f和!-f用来判断是否存在文件

* -d和!-d用来判断是否存在目录

* -e和!-e用来判断是否存在文件或目录

* -x和!-x用来判断文件是否可执行

flag标记有:

 

* last 相当于Apache里的[L]标记,表示完成rewrite

* break 终止匹配, 不再匹配后面的规则

* redirect 返回302临时重定向 地址栏会显示跳转后的地址

* permanent 返回301永久重定向 地址栏会显示跳转后的地址

一些可用的全局变量有,可以用做条件判断(待补全)

 

$args

$content_length

$content_type

$document_root

$document_uri

$host

$http_user_agent

$http_cookie

$limit_rate

$request_body_file

$request_method

$remote_addr

$remote_port

$remote_user

$request_filename

$request_uri

$query_string

$scheme

$server_protocol

$server_addr

$server_name

$server_port

$uri

结合QeePHP的例子

 

if (!-d $request_filename) {

rewrite ^/([a-z-A-Z]+)/([a-z-A-Z]+)/?(.*)$ /index.php?namespace=user&controller=$1&action=$2&$3 last;

rewrite ^/([a-z-A-Z]+)/?$ /index.php?namespace=user&controller=$1 last;

break;

多目录转成参数

abc.domian.com/sort/2 => abc.domian.com/index.php?act=sort&name=abc&id=2

 

if ($host ~* (.*)\.domain\.com) {

set $sub_name $1;

rewrite ^/sort\/(\d+)\/?$ /index.php?act=sort&cid=$sub_name&id=$1 last;

}

目录对换

/123456/xxxx -> /xxxx?id=123456

 

rewrite ^/(\d+)/(.+)/ /$2?id=$1 last;

例如下面设定nginx在用户使用ie的使用重定向到/nginx-ie目录下:

 

if ($http_user_agent ~ MSIE) {

rewrite ^(.*)$ /nginx-ie/$1 break;

}

目录自动加“/”

 

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

禁止htaccess

 

location ~/\.ht {

deny all;

}

禁止多个目录

 

location ~ ^/(cron|templates)/ {

deny all;

break;

}

禁止以/data开头的文件

可以禁止/data/下多级目录下.log.txt等请求;

 

location ~ ^/data {

deny all;

}

禁止单个目录

不能禁止.log.txt能请求

 

location /searchword/cron/ {

deny all;

}

禁止单个文件

 

location ~ /data/sql/data.sql {

deny all;

}

给favicon.ico和robots.txt设置过期时间;

这里为favicon.ico为99 天,robots.txt为7天并不记录404错误日志

 

location ~(favicon.ico) {

log_not_found off;

expires 99d;

break;

}

 

location ~(robots.txt) {

log_not_found off;

expires 7d;

break;

}

设定某个文件的过期时间;这里为600秒,并不记录访问日志

 

location ^~ /html/scripts/loadhead_1.js {

access_log off;

root /opt/lampp/htdocs/web;

expires 600;

break;

}

文件反盗链并设置过期时间

这里的return 412 为自定义的http状态码,默认为403,方便找出正确的盗链的请求

“rewrite ^/ http://leech.yourname.com/leech.gif;”显示一张防盗链图片

“access_log off;”不记录访问日志,减轻压力

“expires 3d”所有文件3天的浏览器缓存

 

location ~* ^.+\.(jpg|jpeg|gif|png|swf|rar|zip|css|js)$ {

valid_referers none blocked *.yourname.com *.yourname.net localhost 208.97.167.194;

if ($invalid_referer) {

rewrite ^/ http://leech.yourname.com/leech.gif;

return 412;

break;

}

access_log off;

root /opt/lampp/htdocs/web;

expires 3d;

break;

}

只充许固定ip访问网站,并加上密码

 

root /opt/htdocs/www;

allow 208.97.167.194;

allow 222.33.1.2;

allow 231.152.49.4;

deny all;

auth_basic “C1G_ADMIN”;

auth_basic_user_file htpasswd;

将多级目录下的文件转成一个文件,增强seo效果

/job-123-456-789.html 指向/job/123/456/789.html

 

rewrite ^/job-([0-9]+)-([0-9]+)-([0-9]+)\.html$ /job/$1/$2/jobshow_$3.html last;

将根目录下某个文件夹指向2级目录

如/shanghaijob/ 指向 /area/shanghai/

如果你将last改成permanent,那么浏览器地址栏显是 /location/shanghai/

 

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

上面例子有个问题是访问/shanghai 时将不会匹配

 

rewrite ^/([0-9a-z]+)job$ /area/$1/ last;

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

这样/shanghai 也可以访问了,但页面中的相对链接无法使用,

如./list_1.html真实地址是/area /shanghia/list_1.html会变成/list_1.html,导至无法访问。

 

那我加上自动跳转也是不行咯

(-d $request_filename)它有个条件是必需为真实目录,而我的rewrite不是的,所以没有效果

 

if (-d $request_filename){

rewrite ^/(.*)([^/])$ http://$host/$1$2/ permanent;

}

知道原因后就好办了,让我手动跳转吧

 

rewrite ^/([0-9a-z]+)job$ /$1job/ permanent;

rewrite ^/([0-9a-z]+)job/(.*)$ /area/$1/$2 last;

文件和目录不存在的时候重定向:

 

if (!-e $request_filename) {

proxy_pass http://127.0.0.1/;

}

域名跳转

 

server

{

listen 80;

server_name jump.yourname.com;

index index.html index.htm index.php;

root /opt/lampp/htdocs/www;

rewrite ^/ http://www.yourname.com/;

access_log off;

}

多域名转向

 

server_name http://www.yourname.com/ http://www.yourname.net/;

index index.html index.htm index.php;

root /opt/lampp/htdocs;

if ($host ~ “c1gstudio\.net”) {

rewrite ^(.*) http://www.yourname.com$1/ permanent;

}

三级域名跳转

 

if ($http_host ~* “^(.*)\.i\.c1gstudio\.com$”) {

rewrite ^(.*) http://top.yourname.com$1/;

break;

}

域名镜向

 

server

{

listen 80;

server_name mirror.c1gstudio.com;

index index.html index.htm index.php;

root /opt/lampp/htdocs/www;

rewrite ^/(.*) http://www.yourname.com/$1 last;

access_log off;

}

某个子目录作镜向

 

location ^~ /zhaopinhui {

rewrite ^.+ http://zph.yourname.com/ last;

break;

}

discuz ucenter home (uchome) rewrite

 

rewrite ^/(space|network)-(.+)\.html$ /$1.php?rewrite=$2 last;

rewrite ^/(space|network)\.html$ /$1.php last;

rewrite ^/([0-9]+)$ /space.php?uid=$1 last;

discuz 7 rewrite

 

rewrite ^(.*)/archiver/((fid|tid)-[\w\-]+\.html)$ $1/archiver/index.php?$2 last;

rewrite ^(.*)/forum-([0-9]+)-([0-9]+)\.html$ $1/forumdisplay.php?fid=$2&page=$3 last;

rewrite ^(.*)/thread-([0-9]+)-([0-9]+)-([0-9]+)\.html$ $1/viewthread.php?tid=$2&extra=page\%3D$4&page=$3 last;

rewrite ^(.*)/profile-(username|uid)-(.+)\.html$ $1/viewpro.php?$2=$3 last;

rewrite ^(.*)/space-(username|uid)-(.+)\.html$ $1/space.php?$2=$3 last;

rewrite ^(.*)/tag-(.+)\.html$ $1/tag.php?name=$2 last;

给discuz某版块单独配置域名

 

server_name bbs.c1gstudio.com news.c1gstudio.com;

 

location = / {

if ($http_host ~ news\.yourname.com$) {

rewrite ^.+ http://news.yourname.com/forum-831-1.html last;

break;

}

}

discuz ucenter 头像 rewrite 优化

 

location ^~ /ucenter {

location ~ .*\.php?$

{

#fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

 

location /ucenter/data/avatar {

log_not_found off;

access_log off;

location ~ /(.*)_big\.jpg$ {

error_page 404 /ucenter/images/noavatar_big.gif;

}

location ~ /(.*)_middle\.jpg$ {

error_page 404 /ucenter/images/noavatar_middle.gif;

}

location ~ /(.*)_small\.jpg$ {

error_page 404 /ucenter/images/noavatar_small.gif;

}

expires 300;

break;

}

}

jspace rewrite

 

location ~ .*\.php?$

{

#fastcgi_pass unix:/tmp/php-cgi.sock;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

 

location ~* ^/index.php/

{

rewrite ^/index.php/(.*) /index.php?$1 break;

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

include fcgi.conf;

}

2013
05
18
13:39

Debian7.0系统与常用软件安装笔记

安装系统,直接到debian.org上下载需要的版本,刻录成光盘,然后安装,这里我先择了最新版本debian7.0。安装过程中只需要注意一点即可,安装时选择英文,如果选择中文后,可能后面会遇到麻烦,所以我选择了英文安装,系统安装完后我们可以汉化。

系统安装完后,首先第一件事要做的就是更新一下系统,更新源地址国内首选163镜像,可以到mirror.163.com选择合适自己的源地址。用ROOT用户直接vi /etc/apt/sources.list编辑它即可。这里列出我自己的:

deb http://mirrors.163.com/debian wheezy main non-free contrib

deb http://mirrors.163.com/debian wheezy-proposed-updates main contrib non-free

deb-src http://mirrors.163.com/debian wheezy main non-free contrib

deb-src http://mirrors.163.com/debian wheezy-proposed-updates main contrib non-free

deb http://mirrors.163.com/debian-security wheezy/updates main contrib non-free

deb-src http://mirrors.163.com/debian-security wheezy/updates main contrib non-free

deb http://http.us.debian.org/debian wheezy main contrib non-free //****

deb http://security.debian.org wheezy/updates main contrib non-free //*****

deb http://www.deb-multimedia.org wheezy main non-free //********

deb http://ftp.de.debian.org/debian jessie main //******


上面我自己加了几条,用来补充163镜像。

更新系统 aptitude update && aptitude upgrade

这样更新完后,我们安装一下vim aptitude install vim

修改一下DNS vi /etc/resolv.conf 将默认的DNS改为GOOGLE的公用DNS 8.8.8.8 8.8.4.4 重新载入网络 /etc/init.d/networking restart

我们来汉化桌面,因为我的英文不是很好,所以这是必须的。在终端执行命令 dpkg-reconfigure locales 把带zh_cn 字样的全部选上,也可以只选择部分。然后确定,在弹出的对话框中,还是选择en_UTF-8为默认,然后安装即可。用户登陆桌面系统时,如果是debian7以下的版本,在输入用户名和密码的下面有个选择是英语或汉语的下拉框共大家选择,如果是debian7版本,就没有这个选择了,直接登陆桌面后,在桌面的右上角有你的用户名,点击后,里面有语言设置。

安装系统中文字体:apt-get install xfonts-intl-chinese xfonts-wqy ttf-wqy-zenhei ttf-wqy-microhei ttf-arphic-ukai ttf-arphic-uming

安装IBUS五笔和拼音 apt-get install ibus-pinyin ibus-table-wubi

安装中文man apt-get install manpages-zh

安装debian参考手册 apt-get install debian-reference-zh-cn * debian7.0好像还没有中文参考手册

安装浏览器iceweasel简体中文组件 apt-get install iceweasel-l10n-zh-cn 这个是debian默认的浏览器,也就是火狐,在debian下它的名字不同而已。

windows下的办公软件是office word/office excel,debian下的办公软件很多,默认安装办公软件libreoffice,但是是英文版的,简体中文 apt-get install libreoffice-l10n-zh-cn libreoffice-help-zh-cn,我们必须安装上面来汉化它

安装chrome 浏览器,直接到google.com上下载相应的版本,然后在主终端执行命令dpkg -i google-*即可,如果出现安装错误,可能执行apt-get install -f 然后再进行安装即可。

安装virtualbox aptitude install virtualbox 安装完后无法支持USB设置,这样我们得到virtualbox官网下载扩展插件,下载完后,我们运行virtualbox在管理--全局设定--扩展里进行安装,安装完后在设置里--USB设置加入一个新的USB筛选器。然后到终端执行,usermod -G ** vboxusers 这里的**指的就是当前我们的桌面用户,意思就是把这个桌面用户加入vboxusers组,这样我的就可以在virtualbox下使用USB