分類
网站

php生成圖片與crontab

PHP生成圖片

//@function.php
//先獲取個GET參數等下寫圖片里
if ($_GET["name"]) {
    $name = htmlspecialchars($_GET["name"]);
} else {
    $name = '';
}
//創建圖像
$img=getImgType($img_path);
$img=createImg($img,$wordsPhoto,$left_px,$top_px,25,0,20,'19f','ARIALUNI');
//保存圖像
$img_info=saveImg($img,'png');

//創建圖像函數
function getImgType($img_path) {
	$img = getimagesize ( $img_path );
	switch ($img [2]) {
		case 1 :
			$img = @imagecreatefromgif ( $img_path );
			break;
		case 2 :
			$img = @imagecreatefromjpeg ( $img_path );
			break;
		case 3 :
			$img = @imagecreatefrompng ( $img_path );
			break;
		default :
			$img = @imagecreatefrompng ( $img_path );
	}
	return $img;
}
//修改圖像函數
function createImg($img, $str, $x, $y, $length = 20, $angle = 0, $size = 12, $color = '39f', $font = 'kanghua') {
	switch ($color) {
		case '19f' :
			$color = imagecolorallocate ( $img, 22, 157, 252 );
			break;
		case 'f37' :
			$color = imagecolorallocate ( $img, 255, 51, 119 );
			break;
		case '63a' :
			$color = imagecolorallocate ( $img, 68, 172, 106 );
			break;
		case 'f90' :
			$color = imagecolorallocate ( $img, 255, 158, 3 );
			break;
		case 'a60' :
			$color = imagecolorallocate ( $img, 172, 106, 0 );
			break;
		case '790' :
			$color = imagecolorallocate ( $img, 113, 149, 13 );
			break;
		case 'fff' :
			$color = imagecolorallocate ( $img, 255, 255, 255 );
			break;
		case '000' :
			$color = imagecolorallocate ( $img, 0, 0, 0 );
			break;
		default :
			$color = imagecolorallocate ( $img, 67, 157, 252 );
	}
	switch ($font) {
		case 'ARIALUNI' :
			$font = './../font/ARIALUNI.ttf';
			break;
		case 'CODE2000' :
			$font = './../font/CODE2000.ttf';
			break;
		case 'SarunsManorah' :
			$font = './../font/SarunsManorah.ttf';
			break;
		case 'FreeSerif' :
			$font = './../font/FreeSerif.ttf';
			break;
		case 'kanghua' :
			$font = './../font/kanghua.ttf';
			break;
		case 'shishang' :
			$font = './../font/shishang.ttf';
			break;
		case 'yahei' :
			$font = './../font/yahei.ttf';
			break;
		default :
			$font = './../a_include/font/kanghua.ttf';
	}
	$str = wordwrap_utf8 ( $str, $length );
	imagettftext ( $img, $size, $angle, $x, $y, $color, $font, $str );
	return $img;
}
//文字换行
function wordwrap_utf8($string, $length = 20, $break = "\n", $cut = false) {
	if ($length == 0) {
		return $string;
	}
	preg_match_all ( '/./u', $string, $matches );
	$s = $matches [0];
	$ct = count ( $s );
	for($i = 0; $i < ceil ( $ct / $length ); $i ++) {
		$ns .= implode ( '', array_slice ( $s, $i * $length, $length ) ) . $break;
	}
	return $ns;
}
function saveImg($img, $type = 'png') {
	$img_url = '';
	$img_name = time ().rand(10,99);
        //php5.5以上才支持webp
	if ($type == 'jpg') {
		$img_url = '/a_cache/' . $img_name . '.jpg';
		$img_filename = dirname ( dirname ( dirname ( __FILE__ ) ) ) . '/a_cache/' . $img_name . '.jpg';
		imagejpeg ( $img, $img_filename );
	} else {
		$img_url = '/a_cache/' . $img_name . '.png';
		$img_filename = dirname ( dirname ( dirname ( __FILE__ ) ) ) . '/a_cache/' . $img_name . '.png';
		imagepng ( $img, $img_filename );
	}
	imagedestroy ( $img );
	$img_info ['img_name'] = $img_name;
	$img_info ['img_url'] = '..' . $img_url;
        return $img_info;
}

網頁展示圖片

//@show.php
require_once 'function.php';

<div style="width:100%;text-align:center;background-color: #58C7C2;padding: 0.52em 0.1em 0.52em 0.1em;">
<img id="res_pic" style="display: block;width: 70%;margin-left: 15%;" src="<?php echo $img_info['img_url'];?>" />
</div>

用corntab定期清理緩存圖片

創建可執行文件/www/del_cache,內容如下,意思是刪除兩天前的文件

#!/bin/bash 
find /path/to/your/a_cache/* -mtime +2 -exec rm -f {} \;

把執行文件加入定時任務

crontab -e
#如果有多個編輯器,可能會讓選擇編輯器,但我CentOS中有nano,並沒有提示,我還是得用vi

修改並把下面一行粘貼到最後,意思是每小時的0分執行一次

00 * * * * /path/to/the/script

有時我們需要每30秒執行一次定時任務,但是crontab只能精確到分,可以這麼做:

* * * * * /path/to/executable param1 param2
* * * * * ( sleep 30 ; /path/to/executable param1 param2 )

這裡還有一個每90秒的例子:

*/3 * * * * /path/to/executable param1 param2
*/3 * * * * ( sleep 90 ; /path/to/executable param1 param2 )

有時我們需要以root用戶來執行crontab中的命令,僅僅切換到root用戶然後使用crontab -e似乎還是不行,後來發現(CentOS下)可以這樣:

nano /etc/crontab
#在這裡編輯需要定時執行的命令,並指定運行命令的用戶
03 * * * * root /path/to/the/script

有時的需求是這樣的,定時任務執行時間不確定,比如有時10分鐘,有時30分鐘,但是我們還不想同時執行兩個任務,這時可以使用flock文件鎖來控制只有一個程序在跑。

#下面的效果就是,每5分鐘檢查一次,如果在ping就跳過此次執行
*/5 * * * * flock -xn /tmp/42ping.lock -c 'ping -c 1000 ft.wupo.info >> ping.log'
#測試發現即使程序異常中斷,lock也會被解除,下次任務仍然得以運行

參考了How to Delete Old Files In A Folder Automatically In LinuxRunning a cron every 30 seconds。對於crontab的寫法,可以到crontab.guru來驗證是否正確。其實我主要是想記錄這一段。

本文更新於 2017/03/07。

分類
网站

wordpress站點多域名

首先DNS要指向wordpress所在IP,然後配置虛擬主機,我是複製了一份conf,修改server_name為新增加的域名如blog.newdomin.com,其他不變。然後重啟nginx就可以用兩個域名訪問同一個網站了。

如果想把鏈接中的域名也換了,則需要在wp-config.php中增加兩行:

define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
分類
Linux

VirtualBox中Ubuntu掛載新磁盤[轉]

在virtualbox中装好Ubuntu后,发现硬盘空间太小,怎样才能增加硬盘容量?那就是再建一个硬盘:

1. 添加新硬盘

设置 -> Storage -> SATA控制器->右击,选择“添加虚拟硬盘”

然后,根据需求创建合适的硬盘

2. 重启虚拟机

查看现有系统的磁盘空间

sudo fdisk -l

可看到新加的虚拟硬盘,一般名为:Disk /dev/sdb

3. 给新加的硬盘分区

fdisk /dev/sdb

键入m,可看到帮助信息

command (m for help):m

增加新分区

command (m for help):n

选择基本分区,输入:p

建一个分区

Partition number(1-4):1

回车

First cylinder (1-15908,default 1):Enter

写入并退出

command (m for help):w

4. 格式化磁盘分区

用ext4格式对/dev/sdb1进入格式化

sudo mkfs.ext4 /dev/sdb1

5. 挂载分区

创建新的挂载点

sudo mkdir /work

将新磁盘分区挂载到/work目录下

sudo mount -t ext4 /dev/sdb1 /work

查看挂载

df -h

可以看到新加的硬盘:/dev/sdb1

6. 开机自动挂载

修改文件

sudo nano /etc/fstab

在最后一行加入:

/dev/sdb1 /work ext4 errors=remount-ro 0 1

完成!

文章轉自本文出自 “凉冰” 博客,原文地址http://liangbing8612.blog.51cto.com/2633208/652333

分類
Linux

在ubuntu14上配置denyhost

昨天ss忽然變慢,一看好多條非法登陸。CentOS下的記錄文件是/var/log/secure。

#root登陸失敗次數
##ubuntu
sudo grep "Failed password for root" /var/log/auth.log | awk '{print $11}' | sort | uniq -c | sort -nr | more
##centos
sudo grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more
#無效用戶登陸失敗次數
sudo grep "Failed password for invalid user" /var/log/auth.log | awk '{print $13}' | sort | uniq -c | sort -nr | more

denyhosts可以防止上面這種攻擊。但是我在ubuntu14的軟件源裏沒找到(12裏有)。於是去搜索,找到http://denyhosts.sourceforge.net/這個主頁,按照說明安裝下來,竟然失敗。後來安裝了denyhost(注意:沒有s了,這是前一個的fork),很順利。下面記一下安裝過程:

#下載denyhost
cd /tmp/ && wget http://downloads.sourceforge.net/project/denyhost/denyhost-2.8/denyhosts-2.8.tar.gz
#解壓
tar xzf denyhosts*.tar.gz
cd DenyHosts*
#安裝
sudo python setup.py install
#添加到開機啓動
sudo cp /usr/local/bin/daemon-control-dist /etc/init.d/denyhosts
#修改配置文件
#將文件中"DENYHOSTS_BIN"的值爲"/usr/local/bin/denyhosts.py"
sudo nano /etc/init.d/denyhosts
#修改攔截配置文件
sudo nano /etc/denyhosts.conf
#這個文件內部註釋很清晰,按需求修改就好,不改也沒關係。
#啓動服務
sudo /etc/init.d/denyhosts start

上面命令參考自How To Install DenyHosts On Ubuntu 14.04 Server。當然,修改下ssh的默認的配置也是很好的。

sudo nano /etc/ssh/sshd_config
#Port 12345 #改爲一個5位端口号,不要超過60000
#PermitRootLogin no #禁止root用戶登陸
#重啓ssh服務
sudo /etc/init.d/ssh restart
#在/etc/sysconfig/iptables中添加下面一行,打開12345端口
-A INPUT -m state --state NEW -m tcp -p tcp --dport 12345 -j ACCEPT
#重啟iptables
service iptables restart

禁用密碼登陸ssh(使用證書)也是很好的選擇。參考:Centos6.4下使用Denyhosts

用iptables防止ssh暴力破解

#添加如下iptables規則即可防止普通ssh暴力破解
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --set --name DEFAULT --rsource 
-A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 4 --name DEFAULT --rsource -j DROP

時間來到 2022 年,denyhost 已經不再更新,但是我們可以使用它的繼任者——fail2ban。

#安裝 fail2ban
yum -y install fail2ban
#增加配置文件
nano /etc/fail2ban/jail.d/jail.local
#文件內容如下:
[sshd]
enabled  = true
filter   = sshd
action   = iptables[name=ssh,port=22,protocol=tcp]
logpath  = /var/log/secure
bantime  = 600
maxretry = 3
#啓動服務
systemctl restart fail2ban
#添加到開機啓動
systemctl enable fail2ban
#查看服務狀態
fail2ban-client status sshd

如果系統是 AlamLinux 可能需要啟動 EPEL 軟件源:

sudo dnf install epel-release
/usr/bin/crb enable

本文更新於 2024/08/06。

分類
Linux 软件

nano文本編輯器

nano是一個方便易用的命令行文本編輯器,相對於vi等文本編輯器勝在學習成本低廉而且linux平臺基本自帶(甚至android的busybox都有)。用nano常用的命令就是Ctrl+O寫入文件,Ctrl+X關閉文件,Ctrl+W查找文字。其他功能也很容易找到幫助,很適合不經常用linux的用戶(vi不常用的話,命令真的忘的好快)。

nano的複製粘貼也是很方便的。常用的就是CRTL+6用來選擇,ALT+6用來複製,CTRL+U用來粘貼。複製當前行的話直接ALT+6即可。

如果想把nano設置為默認的文本編輯器,比如使用crontab -e時,可以在~/.bashrc最後添加

export EDITOR=nano
export VISUAL=nano

如果要在多個文件間複製粘貼,可以用nano -F file1以多文件模式打開。打開之後,複製完按CTRL+R開啟另一個文件,就可以粘貼進去了。文件間的切換用ALT+,和ALT+.。

本文更新於 2017/03/22。

分類
Linux

Host a Debian in Win7 VirtualBox

正常的安裝就是在VirtualBox裡添加虛擬機,掛載下載好的Debian鏡像,即可安裝完成,最後安裝VirtualBox的附加組件,一路應該很順利。實際感覺是Debian比Ubuntu要稍微麻煩些。

apt的設置

如果你在安裝系統的時候就設置好了且工作正常,則不用設置。設置軟件源

nano /etc/apt/sources.list
我的是
deb http://ftp.debian.org/debian stable main contrib non-free
deb-src http://ftp.debian.org/debian stable main contrib non-free

給apt設置代理

nano /etc/apt/apt.conf.d/70debconf
#ubuntu下是/etc/apt/apt.conf
我的是在底部添加
Acquire::http::proxy "http://192.168.1.2:8123/";
Acquire::ftp::proxy "http://192.168.1.2:8123/";
這是的代理是Win7里運行的Shadowsocks。

安裝VirtualBox附加組件

轉自Installing Guest Additions on Debian。安裝完成後就可以共享剪切板和自由縮放屏幕大小了。

  1. Login as root;
  2. Update your APT database with apt-get update;
  3. Install the latest security updates with apt-get upgrade;
  4. Install required packages with apt-get install build-essential module-assistant;
  5. Configure your system for building kernel modules by running m-a prepare;
  6. Click on Install Guest Additions… from the Devices menu of VirtualBox, then run mount /media/cdrom.
  7. Run sh /media/cdrom/VBoxLinuxAdditions.run, and follow the instructions on screen.

添加中文支持

dpkg-reconfigure locales
空格選擇,回車確認。我選擇了這幾個
  • zh_TW BIG5 - 繁體中文(台灣),使用 Big5 碼
  • zh_TW.UTF-8 UTF-8 - 繁體中文(台灣),使用 UTF-8 碼
  • zh_HK.UTF-8 UTF-8 - 繁體中文(香港),使用 UTF-8 碼
  • zh_CN GB2312 - 簡體中文,使用 GB2312-80
  • zh_CN.GBK GBK - 簡體中文,使用 GBK
  • zh_CN.UTF-8 UTF-8 - 簡體中文,使用 GB18030
然後首選項選擇了zh_CN.UTF-8。

安裝字體:

apt-get install ttf-arphic-uming  xfonts-intl-chinese  xfonts-wqy

安裝輸入法:

apt-get install fcitx-sunpinyin
apt-get install im-switch

重啟就好了。


Debian使用systemd開機啓動

我裝的是Debian8,似乎已經不再支持rc.local了。以ss爲例,開機啓動可以這麼添加:首先新建開機服務文件

nano /lib/systemd/system/ss.service
內容爲
[Unit]
Description=ss

[Service]
Type=simple
ExecStart=/usr/local/bin/ss-local -c /etc/shadowcksB.json > /home/$YOURNAME/.sslog 2$
PrivateTmp=true

[Install]
WantedBy=multi-user.target
ss用到的文件/home/$YOURNAME/.sslog需要自己新建touch下。

將服務設置爲開機啓動:

systemctl enable ss.service

測試服務是否正常:

systemctl start ss.service

查看當前服務狀態:

systemctl status ss.service -l

順便再貼一個polipo的開機啓動文件

[Unit]
Description=polipo
After=network.target

[Service]
Type=forking
ExecStart=/etc/init.d/polipo start
ExecReload=/etc/init.d/polipo restart
ExecStop=/etc/init.d/polipo stop
PrivateTmp=true

[Install]
WantedBy=multi-user.target

安裝flashplayer

Debian自帶的瀏覽器和火狐都沒有Flash,可以按照如下步驟安裝:
1, Lauch the browser and download the Flash Player in a seperate folder.Download link = http://get.adobe.com/flashplayer/
2, tar xzvf yourdownloadedfilename.tar.gz
3, cp libflashplayer.so /usr/lib/mozilla/plugins/

本文更新於 2016/05/19。

分類
Linux

shadowsocks client and firefox on Ubuntu 12


Shadowsocks Client

下載Shadowsocks-libev:https://github.com/madeye/shadowsocks-libev
unzip解壓至/home/me/Downloads/AppSrc/shadowsocks-libev cd到此目錄,運行

./configure
sudo make install

如果運行configure提示ssh header error,請安裝libssl-dev。Centos、Fedora下請安裝zlib-devel。如果提示ssl有問題,Fedora下可安裝openssl-devel。

新建配置文件

sudo nano /etc/shadowcks.json

粘貼進下面文本並保存

{
"server":"服务器的ip",
"server_port":服务器的端口,
"local_port":你的本地端口,默认1080,
"password":"密码",
"timeout":600,
"method":"加密方式"
}

運行下面命令啓動shadowsocks服務

ss-local -c /etc/shadowcks.json

如果提示隨機數不足,可以安裝rng-tools

yum install -y rng-tools
systemctl start rngd
systemctl status rngd
systemctl enable rngd

加入開機自動啟動:

#先建一個log文件
touch /home/me/.sslog
#将下面一行加入/etc/rc.local
/usr/local/bin/ss-local -c /etc/shadowcksB.json > /home/me/.sslog 2>&1 &

Firefox

從這裏下載firefox,或者通過市場安裝。火狐市場好像還沒被干擾,所以直接進插件市場搜索FoxyProxy安裝並重啓。點擊FoxyProxy圖標,新建代理服務器,選擇手動配置代理服務器,輸入127.0.0.1和端口,選中socks v5。URL模式勾選不要對內部網絡選項。保存後轉到訂閱模式,添加新的訂閱模式,訂閱網址http://autoproxy-gfwlist.googlecode.com/svn/trunk/gfwlist.txthttps://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt,代理服務器選擇剛剛新建的。Format選AutoProxy,Obfuscation選Base64。確定保存,如果訂閱添成功此時前面URL模式中應該多了很多項。最後將工作模式設置爲使用基於其預定義模板,就可以自動分流了。

18年09說06日,Firefox ESR版本也自動升級到了Quantum(版本號>60)。新版對於附加原件有較大改動,以至FoxyProxy老版本不能運行。雖然FoxyProxy作者開發了新版本,但是試用之後沒有找到導入gfwlist.txt的地方。搜了一下,發現SwitchOmega有了火狐的插件,雖然是測試版,用起來卻很好用。在auto swith中導入https://raw.githubusercontent.com/gfwlist/gfwlist/master/gfwlist.txt就能自動分流,而且有加載不到的資源還可快速加入白名單,真實非常方便。


家裏長城寬帶按照上述方法無效。多數內容複製了+McNulty Gracie的帖子。

讓命令行通過shadowsocks的socksv5代理聯網

安裝proxychains

sudo apt-get install proxychains

修改配置文件/etc/proxychains.conf,更改如下4行:

dynamic_chain
#strict_chain
#socks4         127.0.0.1 9050
socks5    127.0.0.1 1234 #你的本地代理地址和端口

測試下proxychains:

proxychains wget -O - http://myip.dnsdynamic.org/ | more
#如果成功會顯示出你代理服務器的IP

Ubuntu搭建Shadowsocks

安裝

sudo apt-get install python-pip python-m2crypto supervisor
sudo pip install shadowsocks

编辑 /etc/shadowsocks.json

#sudo nano /etc/shadowsocks.json
{
"server":"0.0.0.0",
"server_port":服务器的端口,
"local_port":1080,
"password":"密码",
"timeout":600,
"method":"aes-256-cfb"
}

编辑 /etc/supervisor/conf.d/shadowsocks.conf

#sudo nano /etc/supervisor/conf.d/shadowsocks.conf
[program:shadowsocks]
command=ssserver -c /etc/shadowsocks.json
autorestart=true
user=nobody
#如果端口 < 1024,把上面的 user=nobody 改成 user=root

在 /etc/default/supervisor 最后加一行:

ulimit -n 51200

reboot或者

service supervisor start
supervisorctl reload

Ubuntu或CentOS分享Shadowsocks給局域網用戶

安裝polipo

sudo apt-get install polipo

在配置文件/etc/polipo/config的末尾貼上下面的配置信息

proxyAddress = "0.0.0.0"

socksParentProxy = "127.0.0.1:1080"
socksProxyType = socks5

chunkHighMark = 50331648
objectHighMark = 16384

serverMaxSlots = 64
serverSlots = 16
serverSlots1 = 32

重啟polipo

/etc/init.d/polipo restart

現在就可以在局域網設備上使用http代理了,主機為運行ssclient的ip地址,端口為8123。

本文更新於 2024/04/19。