存档

‘编程技术大全’ 分类的存档

非常简单的PYTHON HTTP服务

2017年8月9日 评论已被关闭

非常简单的PYTHON HTTP服务

如果你急需一个简单的Web Server,但你又不想去下载并安装那些复杂的HTTP服务程序,比如:Apache,ISS等。那么, Python 可能帮助你。使用Python可以完成一个简单的内建 HTTP 服务器。于是,你可以把你的目录和文件都以HTTP的方式展示出来。佻只需要干一件事情,那就是安装一个Python。

实际上来说,这是一个可以用来共享文件的非常有用的方式。实现一个微型的HTTP服务程序来说是很简单的事情,在Python下,只需要一个命令行。下面是这个命令行:(假设我们需要共享我们的目录 /home/haoel 而IP地址是192.168.1.1)
$ cd /home/haoel
$ python -m SimpleHTTPServer

这就行了,而我们的HTTP服务在8000号端口上侦听。你会得到下面的信息:

Serving HTTP on 0.0.0.0 port 8000 …
你可以打开你的浏览器(IE或Firefox),然后输入下面的URL:

http://192.168.1.1:8000
如果你的目录下有一个叫 index.html 的文件名的文件,那么这个文件就会成为一个默认页,如果没有这个文件,那么,目录列表就会显示出来。

如果你想改变端口号,你可以使用如下的命令:
$ python -m SimpleHTTPServer 8080
如果你只想让这个HTTP服务器服务于本地环境,那么,你需要定制一下你的Python的程序,下面是一个示例:
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
HandlerClass = SimpleHTTPRequestHandler
ServerClass = BaseHTTPServer.HTTPServer
Protocol = “HTTP/1.0”

if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = (‘127.0.0.1’, port)

HandlerClass.protocol_version = Protocol
httpd = ServerClass(server_address, HandlerClass)

sa = httpd.socket.getsockname()
print “Serving HTTP on”, sa[0], “port”, sa[1], “…”
httpd.serve_forever()
注意:所有的这些东西都可以在 Windows 或 Cygwin 下工作。

分类: Python编程 标签:

jstack -F 命令在Linux 64位机器报错:get_thread_regs failed for a lwp

2017年3月30日 评论已被关闭

最近发现一个线上项目运行一段时间之后会僵死。程序不报任何异常,占有系统资源也都正常,就是对外提供不了服务了。

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

根据经验,应该是程序有死锁情况,于是在线上运行“jstack –F <pid>”命令,想把线程堆栈dump下来。

但是,发现这个命令老是报下面的错误:

Thread 27316: (state = BLOCKED)
Error occurred during stack walking:
sun.jvm.hotspot.debugger.DebuggerException: sun.jvm.hotspot.debugger.DebuggerException: get_thread_regs failed for a lwp

线上环境是:

Linux 2.6.18-194.el5 x86_64 x86_64 x86_64 GNU/Linux

java version “1.6.0_21”
Java(TM) SE Runtime Environment (build 1.6.0_21-b04)
Java HotSpot(TM) 64-Bit Server VM (build 20.6-b01, mixed mode)

经过分析发现,这是JDK6u23之前版本的一个Bug,将JDK升级到最新版本(1.6.0_31)就可以解决问题了。

{B0E1C5D8-CE33-4940-B416-2E75003A59FA}

分类: Java技术栈 标签:

java CPU 100% 排查

2017年3月30日 评论已被关闭

java CPU 100% 排查

http://www.cnblogs.com/lishijia/p/5549980.html

一个应用占用CPU很高,除了确实是计算密集型应用之外,通常原因都是出现了死循环。

(友情提示:本博文章欢迎转载,但请注明出处:hankchen,http://www.blogjava.net/hankchen

以我们最近出现的一个实际故障为例,介绍怎么定位和解决这类问题。

 

根据top命令,发现PID为28555的Java进程占用CPU高达200%,出现故障。

通过ps aux | grep PID命令,可以进一步确定是tomcat进程出现了问题。但是,怎么定位到具体线程或者代码呢?

首先显示线程列表:

ps -mp pid -o THREAD,tid,time

 

找到了耗时最高的线程28802,占用CPU时间快两个小时了!

其次将需要的线程ID转换为16进制格式:

printf “%x\n” tid

 

最后打印线程的堆栈信息:

jstack pid |grep tid -A 30

 

找到出现问题的代码了!

现在来分析下具体的代码:ShortSocketIO.readBytes(ShortSocketIO.java:106)

ShortSocketIO是应用封装的一个用短连接Socket通信的工具类。readBytes函数的代码如下:

public byte[] readBytes(int length) throws IOException {

if ((this.socket == null) || (!this.socket.isConnected())) {

throw new IOException(“++++ attempting to read from closed socket”);

}

byte[] result = null;

ByteArrayOutputStream bos = new ByteArrayOutputStream();

if (this.recIndex >= length) {

bos.write(this.recBuf, 0, length);

byte[] newBuf = new byte[this.recBufSize];

if (this.recIndex > length) {

System.arraycopy(this.recBuf, length, newBuf, 0, this.recIndex – length);

}

this.recBuf = newBuf;

this.recIndex -= length;

} else {

int totalread = length;

if (this.recIndex > 0) {

totalread -= this.recIndex;

bos.write(this.recBuf, 0, this.recIndex);

this.recBuf = new byte[this.recBufSize];

this.recIndex = 0;

}

int readCount = 0;

while (totalread > 0) {

if ((readCount = this.in.read(this.recBuf)) > 0) {

if (totalread > readCount) {

bos.write(this.recBuf, 0, readCount);

this.recBuf = new byte[this.recBufSize];

this.recIndex = 0;

} else {

bos.write(this.recBuf, 0, totalread);

byte[] newBuf = new byte[this.recBufSize];

System.arraycopy(this.recBuf, totalread, newBuf, 0, readCount – totalread);

this.recBuf = newBuf;

this.recIndex = (readCount – totalread);

}

totalread -= readCount;

}

}

}

问题就出在标红的代码部分。如果this.in.read()返回的数据小于等于0时,循环就一直进行下去了。而这种情况在网络拥塞的时候是可能发生的。

至于具体怎么修改就看业务逻辑应该怎么对待这种特殊情况了。

 

最后,总结下排查CPU故障的方法和技巧有哪些:

1、top命令:Linux命令。可以查看实时的CPU使用情况。也可以查看最近一段时间的CPU使用情况。

2、PS命令:Linux命令。强大的进程状态监控命令。可以查看进程以及进程中线程的当前CPU使用情况。属于当前状态的采样数据。

3、jstack:Java提供的命令。可以查看某个进程的当前线程栈运行情况。根据这个命令的输出可以定位某个进程的所有线程的当前运行状态、运行代码,以及是否死锁等等。

4、pstack:Linux命令。可以查看某个进程的当前线程栈运行情况。

分类: Java技术栈 标签:

Java出错 Error:Could not create the Java Virtual Machine Error:A fatal exception has occurred

2017年2月23日 评论已被关闭

Java出错 Error:Could not create the Java Virtual Machine Error:A fatal exception has occurred

http://blog.csdn.net/y6300023290/article/details/45478009

提示如下:

scala compile server. error:could not create the java machine.Error: A fatal exception has occurred. program will exit.

这个原因是因为在安装JDK的时候在C:\Windows\System32生成的java.exe、javaw.exe、javaws.exe这个3个引起的;只要把这3个运行文件删除掉就可以了

java -version
分类: Java技术栈 标签:

php安装扩展模块(curl模块)

2017年2月4日 评论已被关闭

php安装扩展模块(curl模块)

 http://www.cnblogs.com/lin1/p/5651828.html

php安装扩展模块的思路:

1,首先找到需要安装的扩展模块的目录。一般在/usr/local/php/ext目录下 但是有的模块php源码中不一定有,需要自己下载比如memcache、redis等。

2,通过phpize工具生成configure文件。

3,./configure -with-php-config=/usr/local/php/bin/php-config

4,make&&make install

5,通过/usr/local/php/bin/php -i |grep ‘extension_dir’ 找到放.so文件的目录,查看编译安装的模块是否在这个目录下面。如果是,只需在php.ini在添加extension=模块名,如果不是在则把该模块到该目录下,再在php.ini加入extension=模块名即可。一般情况下都是在extension_dir中的,至少我没看到例外。这里有点像apache扩展模块的安装 不过apache可以自动写入配置文件。

6,查看加载是否成功  /usr/local/php/bin/php -m |grep 模块名

正式开始,

1,cd 到php源码包中的ext目录下,由于我们是要扩展安装curl模块,所以我们进入到curl目录下。

执行命令  /usr/local/php/bin/phpize  可以看到有报错信息

Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script.

哦,没找到autoconf ,那就安装呗。 yum install -y autoconf   yum install -y m4  这里还需要m4这库文件。

在执行 /usr/local/php/bin/phpize   没有报错信息了。ls 一下查看是否生成了configure这个文件。

2,./configure –with-php-config=/usr/local/php/bin/php-config   又有报错信息

configure: error: Please reinstall the libcurl distribution –
easy.h should be in <curl-dir>/include/curl/

yum install -y libcurl-devel

 

3,make &&make install

 

4,我们可以看到如下提示

/usr/local/php/bin/php -i |grep ‘extension_dir’

可以发现,模块就是安装在extension_dir目录下。

5,vim /usr/local/php/etc/php.ini 找到extension=php_shmop.dll(该行下面添加如下信息)
extension=curl.so即可。

6,查看加载是否成功。

/usr/local/php/bin/php -m |grep curl

当然,我们可以重启apache服务,通过访问phpinfo()这个页面也可以查看到模块。

 

分类: PHP编程 标签:

您的浏览器不能播放当前视频,请点击此处安装Flash播放器 解决方法 精

2017年2月4日 评论已被关闭

您的浏览器不能播放当前视频,请点击此处安装Flash播放器 解决方法 精

说真的安装EduSoho程序真心不是那么容易呀。

 

服务器环境搭配好之后终于可以正常安装了,结果又出现了视频不能播放的问题,总是在上方提示:

 

您的浏览器不能播放当前视频,请点击此处安装Flash播放器

 

在官方客服kent的知道下终于解决了这个问题。

 

原因在于 服务器 php 未安装 fileinfo组件。

 

由于我是使用lnmp 一键安装包 搭建的环境 解决方法如下:

 

编译并安装fileinfo插件

 

cd /root/lnmp1.0-full/php-5.3.17/ext/fileinfo

/usr/local/php/bin/phpize

./configure –with-php-config=/usr/local/php/bin/php-config

make && make install

在PHP配置中添加fileinfo插件

 

用vim编辑器编辑/usr/local/php/etc/php.ini文件

找到 “;extension=php_bz2.dll” 这一行

在其上面添加一行:

extension = fileinfo.so

然后重启lnmp

/root/lnmp restart

 

Linux 下 PHP 扩展 cURL 编译安装

2017年2月3日 评论已被关闭

Linux 下 PHP 扩展 cURL 编译安装
http://www.cnblogs.com/suan07lai/p/5234868.html
下载 cURL http://pan.baidu.com/s/1hqrHWkG (curl-7.39.0.tar.gz) 3.98MB

解压:

tar zxvf curl-7.39.0.tar.gz
./configure –prefix=/usr/local/curl
make && make install

安装 curl 成功后,进入 php 的源码包(非php安装地址)

cd /var/soft/php-5.3.19/ext/curl
/usr/local/php/bin/phpize 注:/usr/local/php 为我的php安装目录
./configure –with-php-config=/usr/local/php/bin/php-config –with-curl=/usr/local/curl/
make && make install
成功后出现 curl.so 的所在目录

打开 php.ini 添加 extension=xxx/curl.so

重启 apache 即可。

PHP函数sem_get引起的“No space lelf on device”问题解决记录

2017年1月20日 评论已被关闭

PHP函数sem_get引起的“No space lelf on device”问题解决记录

http://hansionxu.blog.163.com/blog/static/2416981092015914533184/

1. 问题表现:

接收到告警,部分接口异常。

2. 问题追查:

首先,机器日志中忽然出现很多的flow_lock Faild to create semaphore的错误。

追查系统中的代码实现后,发现是sem_get函数引起,该函数用于根据一个key值来获取一个系统System V信号量的引用。

代码位置:

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

我单独在指定机器上执行上述语句,发现了Warning信息:No space lelf on device,原本以为是磁盘或者内存的空间不足,实际检查后才发现是信号量被耗尽了。

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

信号量是一种有限资源,通过Linux命令,查看系统信号量的限制数目是1024个。

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

 

Web机器实际已经使用掉的信号量数目已经达到1024个,也就是说,可用的信号量已经被用完了。原因,已经比较明显了,就是信号量被申请使用之后,没有被释放。

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

于是我们追查代码源头,发现确实如此,这里的sem_release是类似解锁的意思,并非释放这个信号量,真正释放的函数是sem_remove

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

sem_release的官方文档说明:

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

至此,找到问题所在。这个问题潜伏了很久,系统经常很长时间,累计申请了信号量而没有释放,慢慢达到1024个,最终触发该问题。

 

3. 问题解决方式:

1)使用root权限手动释放信号量,如果有多台机器,每一台都要执行。

for semid in `ipcs -s | cut -f2 -d””`; do ipcrm -s $semid; done

2)重启Apache服务,之后,信号量的使用情况,恢复到正常的数目。

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

关键代码位置:

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者

函数ams_sem_remove会执行sem_remove的释放操作。

 

4. 问题小结:

Sem_get系列函数,通过信号量来达到类似Linux的互斥量(mutex)锁的效果,对一个内存共享对象加锁和解锁的方式,来控制并发请求数量(类似线程安全)。出问题的原因,是长期运行下,申请占用了很多个信号量,并且缺少sem_remove的释放操作。

PHP函数sem_get引起的“No space lelf on device”问题解决记录 - 徐汉彬Hansion - 技术行者
分类: PHP编程 标签:

管理你的应用程序

2017年1月11日 评论已被关闭

管理你的应用程序

http://codeigniter.org.cn/user_guide/general/managing_apps.html

默认情况下,CodeIgniter 假设你只有一个应用程序,被放置在 application/ 目录下。但是,你完全可以拥有多个程序并让 它们共享一份 CodeIgniter 。你甚至也可以对你的应用程序目录 改名,或将其移到其他的位置。

重命名应用程序目录

如果你想重命名应用程序目录,你只需在重命名之后打开 index.php 文件将 $application_folder 变量改成新的名字:

$application_folder = 'application';

移动应用程序目录

你可以将你的应用程序目录移动到除 Web 根目录之外的其他位置, 移到之后你需要打开 index.php 文件将 $application_folder 变量改成新的位置(使用 绝对路径 ):

$application_folder = '/path/to/your/application';

在一个 CodeIgniter 下运行多个应用程序

如果你希望在一个 CodeIgniter 下管理多个不同的应用程序,只需简单的 将 application 目录下的所有文件放置到每个应用程序独立的子目录下即可。

例如,你要创建两个应用程序:”foo” 和 “bar”,你可以像下面这样组织你的目录结构:

applications/foo/
applications/foo/config/
applications/foo/controllers/
applications/foo/libraries/
applications/foo/models/
applications/foo/views/
applications/bar/
applications/bar/config/
applications/bar/controllers/
applications/bar/libraries/
applications/bar/models/
applications/bar/views/

要选择使用某个应用程序时,你需要打开 index.php 文件然后设置 $application_folder 变量。例如,选择使用 “foo” 这个应用,你可以这样:

$application_folder = 'applications/foo';

注解

你的每一个应用程序都需要一个它自己的 index.php 文件来调用它, 你可以随便对 index.php 文件进行命名。

分类: PHP编程 标签:

CI框架多目录设置

2017年1月11日 评论已被关闭

CI框架多目录设置

http://blog.163.com/huangcheng13@126/blog/static/108560932013311035411/

1,设置目的,前台与后台实现独立目录管理

2.通过http://www.myci.com  访问前台,通过http://www.myci.com/admin 访问后台,

多目录的意思是指在同一个网站中有多套程序,最简单的例子就是网站的前台展示与后台管理。二者由于在网站功能中分属不同部分,通常会有不同的界面,用到images/stylesheet/javavascript基本是分开的,所以设置不同目如以下:

网站前台URL:http://www.myci.com 网站后台管理URL::http://www.myci.com/admin
CI 2.0源码下载解压后文件结构如下图,默认是只有一个目录的

CI框架多目录设置 - huangcheng - 蓝星

2、设置入口文件。因为根目录下的index.php默认是去找applcation下的controllers下的控制器,为了读取applcation/admin/controllers下的控制器,我们需要在网站根目录下新建admin文件,并将根目录下的index.php复制至此,接下来编辑此index.php,找到:

1 $system_path "system";   //改为 $system_path = "../system";
2 $application_folder="application";  //改为 $application_folder = "../application/admin";

另外此目录可能用到的css/js/images 文件夹 也可以放在新建的admin之下。

CI框架多目录设置 - huangcheng - 蓝星

第一个目标完成之后,现在通过URL http:www.//myci/admin 可以去读取当前应用程序里面配置文件中默认设置好的控制器welcome,但是对于非默认的控制器读取url就有些略长了,比如在admin/applcation/controllers里有一个login控制器(对应程序就是login类)用来显示后台登陆页面,需要通过这个url才能访问 http://www.myci/admin/index.php/login/index ,根据CI规则,如果url中不写类的方法会默认读取index()方法,所以上面这个url也可以通过http://www.myci/admin/index.php/login访问。

要实现的目标显然不是上面这个,这个URL中还有一个index.php是看着不舒服的,真正的目标是把它去掉。实现方式其实很简单,那就是通过.htaccess文件对URL重写(rewrite)。接下来在根目录下admin文件里里面创建一个.htaccess文件,内容如下:

RewriteEngine on

RewriteCond $1 !^(index\.php|images|css|js|scripts|robots\.txt)

RewriteRule ^(.*)$ /manage/index.php/$1 [L]

——————————————————————————
附,.htacess知识

官方方法:默认情况下,index.php 将被包含在你的 URL 中:example.com/index.php/news/article/my_article

你可以很容易的通过 .htaccess 文件来设置一些简单的规则删除它。下面是一个例子,使用“negative”方法将非指定内容进行重定向:

RewriteEngine on
RewriteCond $1 !^(index\\.php|images|robots\\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

注意:如果你的项目不在根目录请把上面这一句改为:RewriteRule ^(.*)$ index.php/$1 [L]

在上面的例子中,可以实现任何非 index.php、images 和 robots.txt 的 HTTP 请求都被指向 index.php。
官方方法的问题:

1. 没有说明.htaccess文件创建到哪个目录;.htaccess文件放到index.php所在目录,一般为CodeIgniter跟目录。

2. 不用管application和system目录中的.htaccess

3. 若项目不在根目录,则需要在最后一句语句加上ci所在目录的路径,  RewriteRule ^(.*)$ /ci_dir/index.php/$1 [L]

eg. index.php文件在wwwroot\\codeigniter,wwwroot是跟目录,则最后一句改为 RewriteRule ^(.*)$ /codeigniter/index.php/$1 [L]
4. [中级] 有效删除URL中的index.php http://codeigniter.org.cn/forums/thread-15444-1-1.html 这个博客中的RewriteCond $1 !^(index\\\\.php|images|robots\\\\.txtl)最后多了一个l

5. apache一般默认都加载了重写模块,具体可以查看 Apache\\conf\\httpd.conf文件

LoadModule rewrite_module modules/mod_rewrite.so

以下内容不需要修改

<Directory />
Options FollowSymLinks
AllowOverride none
Order deny,allow
Deny from all
</Directory>

6. 不需要修改application/config/config.php中的$config[‘index_page’] = ‘index.php’;

分类: PHP编程 标签:

Discuz uc.key泄露导致代码注入漏洞修复

2016年12月13日 评论已被关闭

Discuz uc.key泄露导致代码注入漏洞修复
http://blog.sina.com.cn/s/blog_3eba8f1c0102xhf3.html

漏洞名称:Discuz uc.key泄露导致代码注入漏洞
文件路径:bbs/api/uc.php

修复方式:
1. 查找 updatebadwords 函数:
function updatebadwords($get, $post){
// …
// 添加: 约241行
// Discuz uc.key泄露导致代码注入漏洞
if(substr($v[‘findpattern’], 0, 1) != ‘/’ || substr($v[‘findpattern’], -3) != ‘/is’) {
$v[‘findpattern’] = ‘/’ . preg_quote($v[‘findpattern’], ‘/’) . ‘/is’;
}
// — end : 2016-08-22 —

$data[‘findpattern’][$k] = $v[‘findpattern’];
// …
}

2. 查找 updateapps 函数:
function updateapps($get, $post) {
// …
// 修改: 约280行
$UC_API = ”;
if($post[‘UC_API’]) {
// $UC_API = $post[‘UC_API’]; // 注释
$UC_API = str_replace(array(‘\”, ‘”‘, ‘\\’, “\0”, “\n”, “\r”), ”, $post[‘UC_API’]);
unset($post[‘UC_API’]);
}
// …
}

分类: CMS开源系统 标签:

阿里提示Discuz uc.key泄露导致代码注入漏洞的解决方法

2016年12月13日 评论已被关闭

阿里提示Discuz uc.key泄露导致代码注入漏洞的解决方法

http://www.moke8.com/article-15381-1.html

 

漏洞名称:Discuz uc.key泄露导致代码注入漏洞
补丁编号:6890270
补丁文件:/data/wwwroot/www.baidu.com/api/uc.php
补丁来源:云盾自研
更新时间:2016-12-13 09:16:41
漏洞描述:在Discuz中,uc_key是UC客户端与服务端通信的通信密钥,discuz中的/api/uc.php存在代码写入漏洞,导致黑客可写入恶意代码获取uckey,最终进入网站后台,造成数据泄漏。您也可以登录官方网站更新到最新版本解决。【注意:该补丁为云盾自研代码修复方案,云盾会根据您当前代码是否符合云盾自研的修复模式进行检测,如果您自行采取了底层/框架统一修复、或者使用了其他的修复方案,可能会导致您虽然已经修复了改漏洞,云盾依然报告存在漏洞,遇到该情况可选择忽略该漏洞提示】
这几天看到很多人问discuz uc.key 泄露导致代码注入漏洞uc.php的解决方法,也看了最近大家提供的一些解决方案,对比文件后发现最新版本的uc.php已经修复了大家说的问题,但阿里云一样有相关的提示,下面提供下相关的修改说明,大家可以试试看

首先找到这个文件/api/uc.php

第一处修改
if(!API_UPDATEBADWORDS) {
return API_RETURN_FORBIDDEN;
}
$data = array();
if(is_array($post)) {
foreach($post as $k => $v) {
//dz uc-key修改开始
if(substr($v[‘findpattern’], 0, 1) != ‘/’ || substr($v[‘findpattern’], -3) != ‘/is’) {
$v[‘findpattern’] = ‘/’ . preg_quote($v[‘findpattern’], ‘/’) . ‘/is’;
}
//end 修改结束
$data[‘findpattern’][$k] = $v[‘findpattern’];
$data[‘replace’][$k] = $v[‘replacement’];
}
}

第二处修改
function updateapps($get, $post) {
global $_G;
if(!API_UPDATEAPPS) {
return API_RETURN_FORBIDDEN;
}

//$UC_API = $post[‘UC_API’];
//dz uc-key修改开始
$UC_API = ”;
if($post[‘UC_API’]) {
$UC_API = str_replace(array(‘\”, ‘”‘, ‘\\’, “\0”, “\n”, “\r”), ”, $post[‘UC_API’]);
unset($post[‘UC_API’]);
}
//end修改结束
$cachefile = DISCUZ_ROOT.’./uc_client/data/cache/apps.php’;

第三处修改
$configfile = preg_replace
代替为
$configfile = preg_replace(“/define\(‘UC_API’,\s*’.*?’\);/i”, “define(‘UC_API’, ‘”.addslashes($UC_API).”‘);”, $configfile);

最新版本的UC里面都做了以上的修复的,如果你的是最新版本的X3.2就不需要更新,直接忽略阿里云的提示即可。

分类: CMS开源系统 标签:

阿里提示Discuz uc.key泄露导致代码注入漏洞uc.php的解决方法

2016年12月13日 评论已被关闭

阿里提示Discuz uc.key泄露导致代码注入漏洞uc.php的解决方法

http://ju.outofmemory.cn/entry/276023

本Discuz uc.key泄露导致代码注入漏洞适用所有用UC整合和程序,修复此漏洞所在的目录请在阿里云报告的位置进行查找,因为每个程序放置uc.php的目录不一定都是一样的。

漏洞名称:Discuz uc.key泄露导致代码注入漏洞

补丁文件:/api/uc.php

补丁来源:云盾自研

漏洞描述:在Discuz中,uc_key是UC客户端与服务端通信的通信密钥,discuz中的/api/uc.php存在代码写入漏洞,导致黑客可写入恶意代码获取uckey,最终进入网站后台,造成数据泄漏。您也可以登录官方网站更新到最新版本解决

解决方法:
首先找到这个文件/api/uc.php​
修复处有1处。
搜索如下代码(215行):

$configfile = preg_replace

将215行直接替换为如下代码:

$configfile = preg_replace(“/define\(‘UC_API’,\s*’.*?’\);/i”, “define(‘UC_API’, ‘”.addslashes($UC_API).”‘);”, $configfile);

修改后如下图:

修改完后保存上传更新,然后在阿里云点击修复即可。

以上就是俞视天下为各位提供的,阿里云提示:“Discuz uc.key泄露导致代码注入漏洞”的解决方案!

如果您未进行二次开发可以下载懒人包,请您下载当前服务器中的文件下来,进行备份后在进行修改上传复制操作!

分类: CMS开源系统 标签:

我为什么选择使用Go语言?

2016年12月3日 评论已被关闭

我为什么选择使用Go语言?

http://mt.sohu.com/20160407/n443587979.shtml

谢孟军:EGO会员、GopherChina组织者、《Go Web编程》一书的作者,专注Golang技术架构。本文来自EGO会员群分享,入群方式见文末

在这里我主要想和大家分享一些Go和我个人的成长史。首先聊聊Go,在2009年全部开源出来后,它获得了当年的年度语言,但是直到2011年它才发布正式的稳定版本。Go稳定版发布时,Go Team承诺后续的版本都会兼容之前的版本。这对于我们开发者来说简直太重要了,Go后续的版本也一直在提升内功,从而可以让我们无缝的升级Go版本。

Go的核心贡献者

Go主要有静态语言、天生并发、内置GC、安全性高、语法简单、交叉编译和编译快速这几个方面的特性。这些特性决定了Go的三个高富帅特性:运行快、开发快和部署快,而这些特性都是针对Google遇到的一些痛点来设计的。

图1

在说痛点之前,我们先来了解一下Go的作者和主要核心开发者们,图1是Go的三个作者从左到右分别是:Robert Griesemer, Rob Pike 和 Ken Thompson。Robert在开发Go之前是Google V8、Chubby和HotSpot JVM的主要贡献者;Rob主要是Unix、UTF-8、plan9的作者;Ken主要是B语言、C语言的作者、Unix之父。

图2

再来看看其他核心贡献者,图2中Russ Cox也是目前Go的领导者之一,他和Rob Pike一起领导Go;Ian Lance Taylor是GCC的作者之一,目前负责GCC的Go实现;Brad Fitzpatrick之前是Memcache的作者,目前主要是HTTP2的实现作者。大家可以看到这些作者都是各个领域内的顶尖高手,所以当初我相信一群牛人做出来的Go也一定够牛。

为什么会设计Go语言?

当初他们为什么会有设计一个新语言的冲动呢?让我们一起来回顾一下这些历史,也许很多人对他们当年遇到的问题感同身受。

设计Go语言是为了解决当时Google开发遇到的以下这些问题:

  •   大量的C++代码,同时又引入了Java和Python
  •   成千上万的工程师
  •   数以万计行的代码
  •   分布式的编译系统
  •   数百万的服务器

其主要有以下几个方面的痛点:

  •   编译慢
  •   失控的依赖
  •   每个工程师只是用了一个语言里面的一部分
  •   程序难以维护(可读性差、文档不清晰等)
  •   更新的花费越来越长
  •   交叉编译困难

所以,他们当时设计Go的目标是为了消除各种缓慢和笨重、改进各种低效和扩展性。Go是由那些开发大型系统的人设计的,同时也是为了这些人服务的;它是为了解决工程上的问题,不是为了研究语言设计;它还是为了让我们的编程变得更舒适和方便。

但是结合Google当时内部的一些现实情况,如很多工程师都是C系的,所以新设计的语言一定要易学习,最好是C-like的语言;因为有太多的分布式系统、太多的开发者,所以新的语言一定要可以Scale,这个包括开发、工程师、代码、部署和依赖;20年没有出新的语言了,所以新设计的语言必须是现代化的(例如内置GC)等情况,他们觉得要实现这个目标就需要Go成为一个大家都认可的语言。

最后根据实战经验,他们向着目标设计了Go这个语言,其主要的特色有:

  •   没有继承的OO
  •   强一致类型
  •   Interface但是不需要显示申明(Duck Type)
  •   Function 和Method
  •   没有异常处理(Error is value)
  •   基于首字母的可访问特性
  •   不用的Import或者变量引起编译错误
  •   完整而卓越的标准库包

Go发布之后,很多公司特别是云计算公司开始用Go重构他们的基础架构,很多都是直接采用Go进行了开发,最近热火朝天的Docker就是采用Go开发的。我们来看看目前为止采用Go的一些国内外公司,国外的如Google、Docker、Apple、Cloud Foundry、CloudFlare、Couchbase、CoreOS、Dropbox、MongoDB、AWS等公司,国内的如阿里云CDN、百度、小米、七牛、PingCAP、华为、金山软件、猎豹移动、饿了么等公司。

Go主要应用的系统

上面那些基本上就是Go的历史背景和设计初衷,那么目前Go主要应用于哪些系统呢?

就我知道的来说,目前Go主要应用在下面这些系统:

  1.   服务器编程,以前你如果使用C或者C++做的那些事情,用Go来做很合适,例如处理日志、数据打包、虚拟机处理、文件系统等。
  2.   分布式系统、数据库代理器等,例如Etcd。
  3.   网络编程,这一块目前应用最广,包括Web应用、API应用、下载应用,而且Go内置的net/http包基本上把我们平常用到的网络功能都实现了。
  4.   数据库,前一段时间Google开发的Groupcache,Couchbase的部分组建,Tidb,Cockroachdb,Influxdb等。
  5.   云平台,目前国外很多云平台在采用Go开发,CloudFoundy的部分组建,前VMare的技术总监自己出来搞的Apcera云平台。

为什么选择使用Go语言?

国内很多云创业公司都会选择把Go作为首要语言,例如DaoCloud。为什么会选择Go呢?与其他语言的应用相比,它有什么优点呢?

1、学习曲线

它包含了类C语法、GC内置和工程工具。这一点非常重要,因为Go语言容易学习,所以一个普通的大学生花一个星期就能写出来可以上手的、高性能的应用。在国内大家都追求快,这也是为什么国内Go流行的原因之一。

2、效率

Go拥有接近C的运行效率和接近PHP的开发效率,这就很有利的支撑了上面大家追求快速的需求。

3、出身名门、血统纯正

之所以说Go出身名门,是因为我们知道Go语言出自Google公司,这个公司在业界的知名度和实力自然不用多说。Google公司聚集了一批牛人,在各种编程语言称雄争霸的局面下推出新的编程语言,自然有它的战略考虑。而且从Go语言的发展态势来看,Google对它这个新的宠儿还是很看重的,Go自然有一个良好的发展前途。我们看看Go语言的主要创造者,血统纯正这点就可见端倪了。

4、自由高效:组合的思想、无侵入式的接口

Go语言可以说是开发效率和运行效率二者的完美融合,天生的并发编程支持。Go语言支持当前所有的编程范式,包括过程式编程、面向对象编程以及函数式编程。程序员们可以各取所需、自由组合、想怎么玩就怎么玩。

5、强大的标准库

这包括互联网应用、系统编程和网络编程。Go里面的标准库基本上已经是非常稳定了,特别是我这里提到的三个,网络层、系统层的库非常实用。

6、部署方便:二进制文件、Copy部署

我相信这一点是很多人选择Go的最大理由,因为部署太方便了,所以现在也有很多人用Go开发运维程序。

7、简单的并发

它包含了降低心智的并发和简易的数据同步,我觉得这是Go最大的特色。之所以写正确的并发、容错和可扩展的程序如此之难,是因为我们用了错误的工具和错误的抽象,Go可以说这一块做的相当简单。

8、稳定性

Go拥有强大的编译检查、严格的编码规范和完整的软件生命周期工具,具有很强的稳定性,稳定压倒一切。那么为什么Go相比于其他程序会更稳定呢?这是因为Go提供了软件生命周期(开发、测试、部署、维护等等)的各个环节的工具,如go tool、gofmt、go test。

这里引用知乎里一个同学对Go评论的话:最开始准备上线的时候其实心里挺忐忑,毕竟一旦出现故障,不仅黑锅得自己背,面子也上过不去啊。还好结果蛮漂亮,自上线后没出现过一次突发性BUG,降低运维难度的同时还减少了机器的负载。我相信这也是大多数人用了Go之后的感言。

那么目前Go还存在哪些缺点呢?以下是我自己在项目开发中遇到的一些问题:

1.Go的Import包不支持版本,有时候升级容易导致项目不可运行,所以需要自己控制相应的版本信息。比较好的现象是从Go 1.5开始Go对此就有重视了并支持Vendor。

2.Go的goroutine一旦启动后,不同的goroutine之间切换不是受程序控制,runtime调度的时候需要严谨的逻辑,不然goroutine休眠,过一段时间逻辑结束了却突然冒出来又执行了,这会导致逻辑出错等情况。这个目前无解,应该属于调度器的优化。

3.GC延迟有点大,我开发的日志系统伤过一次,同时在并发很大的情况下,处理很大的日志,GC没有那么快,内存回收不给力,后来经过Profile程序改进之后得到了改善。目前来看,GC已经优化的非常好了,给大家看一下Go1.5、Go1.6的GC前后对比图。

图3

图3是Go1.4升级到Go1.5之后的效果,从300ms到了50ms左右。

图4

图4是从Go1.5升级到Go1.6,从40ms到了2ms左右,可以说目前GC基本上不是Go的问题了。

4.pkg下面的图片处理库很多bug,还是使用成熟产品好,调用这些成熟库imagemagick的接口比较靠谱。总而言之,从工程的角度上来看,对于大多数后台应用场景,选择Golang是极为明智的选择。 这样可以很轻松的兼顾运行性能、开发效率及维护难度这三大让诸多程序猿欲仙欲死的点。

个人成长史

说完了Go再来说说我的成长经历,先说一说我的工作经历,我的第一份工作是在百视通,主要负责整个IPTV系统的研发,架构设计经历了从零开始到最后承受几百万用户的过程。但是那个时候我是PHP的追随者,经历了那四年多的磨难也开始让我觉得PHP不大适合开发后端程序,性能是它最大的问题。记得奥运会开始之前,我们为了调优性能,连续三天都是在公司奋战,用上了各种技巧,但最后的效果也只是提升了30%左右。

那时候我全部的工作就是PHP+C。

第二份工作是在盛大,那个时候创新院风风火火,我觉得云计算是一个很不错的理念就加入了创新业的云计算院。也是那个时候我认识了Go,认识了一批C++的牛人,同时也让我深度的接触了很多系统底层的开发。我加入的是CDN团队,我们团队主要是服务盛大游戏和盛大文学,流量和压力非常大,我觉得那两年是成长最快的,自己在系统底层知识上面得到了很大的提升。那个时候每天都感觉很充实,上班写公司的系统,下班回家坚持记笔记和写书,兼职偶尔还要喂奶。

盛大用Go写了好几个系统,印象最深刻的就是大文件分发系统,面对上百台机器的分发,节省到byte的流量算法,Go就是那个时候锻炼出来的,也是那个时候开始beego的第一个版本,基本上是模仿tornado框架的Go实现,用beego写了一个盛大创新院的短域名服务。

但是那时候桥哥开始转向了投资界,盛大创新院也开始走向了没落,同时中国的雾霾开始突如其来的出现了,记得那一年上海的PM值直接爆表了,儿子那个时候有咽炎,所以我毅然决定出国。

也是机缘巧合,新加坡一家电商公司Zalora打算从PHP转项Go,所以我就去了新加坡,在新加坡我主要做的是Mobile API。我用beego实现了他们整个后端的Mobile API,这个过程还是很艰难的,因为他们使用了大量的PHP,而且分层数据做的非常不干净,很多数据直接是PHP编码之后存储的,这导致我们需要用Go去实现PHP的反编码。但是也是那个时候我们实现了beego的swagger支持,一键开发API应用同时附带文档。

事情往往就是这样有缘分,我儿子在新加坡生病了,我和我老婆两个人无法很好的照顾好两个小孩,然后就又机缘巧合的回到了上海。总而言之,我是一个从世界上最好的语言(PHP)转到世界上另一个最好的语言的人。

本文是谢孟军在EGO首期会员线上分享活动所做的分享。

EGO是高端技术人聚集和交流的平台,每周四都会邀请一位技术大牛作为技术管理公开课的嘉宾进行分享,本周四晚九点EGO邀请到丁香园技术副总裁范凯(Robbin),扫描下方二维码关注EGO公众号,在微信后台回复“公开课”即可获取学习方式。

分类: 其他编程技术 标签:

tomcat配置及优化

2016年11月2日 评论已被关闭

tomcat配置及优化
https://blog.linuxeye.com/413.html
jdk安装

su – root
mkdir jdk
cd jdk
wget https://mirror.its.sfu.ca/mirror/CentOS-Third-Party/NSG/common/x86_64/jdk-7u76-linux-x64.rpm
rpm -ivh jdk-7u76-linux-x64.rpm
环境变量

vi /etc/profile
export JAVA_HOME=/usr/java/jdk1.7.0_76
export CLASSPATH=$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib
. /etc/profile
tomcat下载

#建议用一般用户运行tomcat
wget http://www.apache.org/dist/tomcat/tomcat-7/v7.0.59/bin/apache-tomcat-7.0.59.tar.gz
tar xzf apache-tomcat-7.0.59.tar.gz
apache-tomcat-7.0.59/bin
chmod +x *.sh
tomcat隐藏版本号

cd apache-tomcat-7.0.59/lib
mkdir test
cd test
jar xf ../catalina.jar
vi org/apache/catalina/util/ServerInfo.properties
server.info=Tomcat
server.number=6
server.built=Jan 18 2013 14:51:10 UTC
jar cf ../catalina.jar ./*
rm -rf test
Tomcat jconsole监控远程jvm配置

参考://blog.linuxeye.com/262.html
Tomcat的三种模式及并发优化

Tomcat的运行模式有3种
1. bio
默认的模式,性能非常低下,没有经过任何优化处理和支持.
2. nio
利用java的异步io护理技术,noblocking IO技术
想运行在该模式下,直接修改server.xml里的Connector节点,修改protocol为
<Connector port=”80″
protocol=”org.apache.coyote.http11.Http11NioProtocol”
connectionTimeout=”20000″
URIEncoding=”UTF-8″
useBodyEncodingForURI=”true”
enableLookups=”false”
redirectPort=”8443″>
启动后,就可以生效。
3. apr
从操作系统级别来解决异步的IO问题,大幅度的提高性能。
必须要安装apr和native,直接启动就支持apr
修改protocol为org.apache.coyote.http11.Http11AprProtocol
安装apr
yum -y install apr apr-devel
安装native
进入tomcat/bin目录,比如:
cd /usr/local/tomcat/bin/
tar xzfv tomcat-native.tar.gz
cd tomcat-native-1.1.32-src/jni/native/
./configure –with-apr=/usr/bin/apr-1-config
make && make install
安装完成之后 会出现如下提示信息
Libraries have been installed in:
/usr/local/apr/lib
安装成功后还需要对tomcat设置环境变量,方法是在catalina.sh文件中增加1行:
CATALINA_OPTS=”-Djava.library.path=/usr/local/apr/lib”
修改8080端对应的conf/server.xml
protocol=”org.apache.coyote.http11.Http11AprProtocol”
启动tomcat之后,查看日志会有这一行信息,说明已经是APR模式启动了
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true].
并发优化
1.JVM调优
新增文件TOMCAT_HOME/bin/setenv.sh如下语句,具体数值视情况而定。
JAVA_OPTS=”-Xms1024m -Xmx1024m -Xss1024K -XX:PermSize=64m -XX:MaxPermSize=128m”
参数详解
-Xms JVM初始化堆内存大小
-Xmx JVM堆的最大内存
-Xss 线程栈大小
-XX:PermSize JVM非堆区初始内存分配大小
-XX:MaxPermSize JVM非堆区最大内存
建议和注意事项:
-Xms和-Xmx选项设置为相同堆内存分配,以避免在每次GC 后调整堆的大小,堆内存建议占内存的60%~80%;非堆内存是不可回收内存,大小视项目而定;线程栈大小推荐256k.
32G内存配置如下:
JAVA_OPTS=”-Xms20480m -Xmx20480m -Xss1024K -XX:PermSize=512m -XX:MaxPermSize=2048m”
2.关闭DNS反向查询
在<Connector port=”8080″ 中加入如下参数
enableLookups=”false”
3.优化tomcat参数(使用APR)
<Listener className=”org.apache.catalina.core.AprLifecycleListener” />

<Connector port=”8080″
protocol=”org.apache.coyote.http11.Http11AprProtocol”
connectionTimeout=”20000″ //链接超时时长
redirectPort=”8443″
maxThreads=”500″
minSpareThreads=”20″
acceptCount=”1000″
enableLookups=”false”
URIEncoding=”UTF-8″ />

分类: Java技术栈 标签:

tomcat实现多端口、多域名访问

2016年11月2日 评论已被关闭

tomcat实现多端口、多域名访问

https://my.oschina.net/u/2375445/blog/515063

摘要: tomcat可以实现:多个端口访问同一个web应用、不同的应用通过不同的域名进行访问。

tomcat可以实现:多个端口访问同一个web应用、不同的应用通过不同的域名进行访问。

本文介绍的都是只启动一个tomcat服务的情况下,当然,实现这些功能也可以通过启动多个tomcat服务实现。

百度经验:jingyan.baidu.com

工具/原料

  • tomcat(以tomcat7.0.50为例)
  • 两个用于测试的web应用

百度经验:jingyan.baidu.com

tomcat实现多端口访问

  1. 1

    说明:这个部分介绍如何在tomcat中进行配置,使同一个应用可以通过不同的端口号进行访问。

    在某些需要进行安全控制的场景中会应用到。例如:不同地址段只能通过某个端口访问。

  2. 2

    找到tomcat的主目录,打开conf文件夹,找到并打开server.xml文件。

    编辑server.xml文件,在<Service></Service>标签中添加:

    <Connector port=”9090″ protocol=”HTTP/1.1″               connectionTimeout=”20000″               redirectPort=”8443″ />

    如图:

    tomcat实现多端口、多域名访问步骤阅读

  3. 3

    进行步骤2中的配置,多端口就完成了,保存并启动tomcat。

    使用8080端口访问的效果图:

    tomcat实现多端口、多域名访问步骤阅读

  4. 4

    使用9090端口访问的效果图:

    这样,就实现了不同的端口号访问到同一个应用程序了。如果还想在其他端口进行监听,就把步骤2中的内容多添加几个就行了。

    tomcat实现多端口、多域名访问步骤阅读

    END

百度经验:jingyan.baidu.com

tomcat实现多域名访问(通过同一个端口号)

  1. 1

    说明:在同一个端口号的情况下,tomcat可以配置不同的域名对应不同的应用程序。

    但是,我不确定“域名管理服务器”是否支持2个不同的域名映射到同一个IP地址的同一个端口。

  2. 2

    找到tomcat的主目录,打开conf文件夹,找到并打开server.xml文件。

    编辑server.xml文件,在<Service></Service>标签中添加:

    <Host name=”www.domain2.com”  appBase=”webapps”            unpackWARs=”true” autoDeploy=”true”>         <Context path=”” docBase=”/myweb2″/>        <Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs”               prefix=”localhost_access_log.” suffix=”.txt”               pattern=”%h %l %u %t &quot;%r&quot; %s %b” />      </Host>

    如图:

    tomcat实现多端口、多域名访问步骤阅读

  3. 3

    进行步骤2中的配置,保存并启动tomcat。

    即可实现使用domain1访问到web1;使用domain2访问到web2。

    END

百度经验:jingyan.baidu.com

tomcat实现多域名访问(使用不同的端口号)

  1. 1

    说明:相对于第二种情况,目前的情况应该是应用得很普遍的。

  2. 2

    找到tomcat的主目录,打开conf文件夹,找到并打开server.xml文件。

    编辑server.xml文件,把<Service>…</Service>标签拷贝一份,对Service name、监听端口、域名名称、默认加载的应用 进行修改。

    如图:

    tomcat实现多端口、多域名访问步骤阅读

  3. 3

    进行步骤2中的配置,保存并启动tomcat。

    即可实现使用domain1访问到web1;使用domain2访问到web2。

  4. 4

    说明:第三种情况与第二种情况最大的区别就在于是使用另一个端口号,这也是普遍的情况吧。(不同的域名映射到不同的端口)

    END

百度经验:jingyan.baidu.com

tomcat实现多应用多端口访问

一、Tomcat 安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat 6.0\webapps
二、Tomcat 6.0 配置多个端口,其实也就是给Tomcat增加几个server,并设置对应目录。下面以增加两个端口号为例
第一步、修改server.xml[..\Tomcat 6.0\conf]
(1)Tomcat提供的如下:

Xml代码 复制代码 收藏代码

  1. <Service name=”Catalina”>
  2.  
  3.     <Connector port=”8090″ maxHttpHeaderSize=”8192″
  4.                maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
  5.                enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
  6.                connectionTimeout=”20000″ disableUploadTimeout=”true” />
  7.  
  8.     <Connector port=”8009″
  9.                enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />
  10.  
  11.  
  12.     <Engine name=”Catalina” defaultHost=”localhost”>
  13.  
  14.  
  15.       <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
  16.              resourceName=”UserDatabase”/>
  17.  
  18.       <Host name=”localhost” appBase=”webapps”
  19.        unpackWARs=”true” autoDeploy=”true”
  20.        xmlValidation=”false” xmlNamespaceAware=”false”>
  21.       </Host>
  22.  
  23.  
  24.     </Engine>
  25.  
  26.  
  27. </Service>
<Service name="Catalina">
   
    <Connector port="8090" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
    
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />


    <Engine name="Catalina" defaultHost="localhost">


      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      
      <Host name="localhost" appBase="webapps"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">              
      </Host>


    </Engine>


</Service>

 

(2)比着上面的葫芦画下面的瓢、新增两个端口号,注意Service name、Engine name、appBase,
当然了,端口号别忘了修改,以免重复。

Xml代码 复制代码 收藏代码

  1. <Service name=”Catalina1″>
  2.  
  3.     <Connector port=”8091″ maxHttpHeaderSize=”8192″
  4.                maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
  5.                enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
  6.                connectionTimeout=”20000″ disableUploadTimeout=”true” />
  7.  
  8.     <Connector port=”8009″
  9.                enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />
  10.  
  11.  
  12.     <Engine name=”Catalina1″ defaultHost=”localhost”>
  13.  
  14.  
  15.       <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
  16.              resourceName=”UserDatabase”/>
  17.  
  18.       <Host name=”localhost” appBase=”webapps1″
  19.        unpackWARs=”true” autoDeploy=”true”
  20.        xmlValidation=”false” xmlNamespaceAware=”false”>
  21.       </Host>
  22.  
  23.  
  24.     </Engine>
  25.  
  26.  
  27. </Service>
<Service name="Catalina1">
   
    <Connector port="8091" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
    
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />


    <Engine name="Catalina1" defaultHost="localhost">


      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      
      <Host name="localhost" appBase="webapps1"
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">              
      </Host>


    </Engine>


</Service>

 

Xml代码 复制代码 收藏代码

  1. <Service name=”Catalina2″>
  2.  
  3.     <Connector port=”8092″ maxHttpHeaderSize=”8192″
  4.                maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
  5.                enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
  6.                connectionTimeout=”20000″ disableUploadTimeout=”true” />
  7.  
  8.     <Connector port=”8009″
  9.                enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />
  10.  
  11.  
  12.     <Engine name=”Catalina2″ defaultHost=”localhost”>
  13.  
  14.  
  15.       <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
  16.              resourceName=”UserDatabase”/>
  17.  
  18.       <Host name=”localhost” appBase=”webapps2″<!– 这个地方很重要,我今天没修改这个,导致webapps下的几个应用都可以用多个端口访问,结果只好将默认的webapps下的应用拷到其他地方,在${tomcat_home}/conf/下创建Catalina2/localhost/,并创建不同的xml文件将docBase指向应用所在的路径–>
  19.        unpackWARs=”true” autoDeploy=”true”
  20.        xmlValidation=”false” xmlNamespaceAware=”false”>
  21.       </Host>
  22.  
  23.  
  24.     </Engine>
  25.  
  26.  
  27. </Service>
<Service name="Catalina2">
   
    <Connector port="8092" maxHttpHeaderSize="8192"
               maxThreads="150" minSpareThreads="25" maxSpareThreads="75"
               enableLookups="false" redirectPort="8443" acceptCount="100"
               connectionTimeout="20000" disableUploadTimeout="true" />
    
    <Connector port="8009" 
               enableLookups="false" redirectPort="8443" protocol="AJP/1.3" />


    <Engine name="Catalina2" defaultHost="localhost">


      <Realm className="org.apache.catalina.realm.UserDatabaseRealm"
             resourceName="UserDatabase"/>
      
      <Host name="localhost" appBase="webapps2"<!-- 这个地方很重要,我今天没修改这个,导致webapps下的几个应用都可以用多个端口访问,结果只好将默认的webapps下的应用拷到其他地方,在${tomcat_home}/conf/下创建Catalina2/localhost/,并创建不同的xml文件将docBase指向应用所在的路径-->
       unpackWARs="true" autoDeploy="true"
       xmlValidation="false" xmlNamespaceAware="false">              
      </Host>


    </Engine>


</Service>

第二步、创建相应的部署目录
..\Tomcat 6.0\webapps1
..\Tomcat 6.0\webapps2
同时可以将Tomcat 6.0\webapps下的有用的复制到新建的部署目录

第三步、创建配置文件目录和配置文件
..\Tomcat 6.0\conf\Catalina1\localhost
..\Tomcat 6.0\conf\Catalina2\localhost
host-manager.xml
manager.xml
配置文件的配置可参照..\Tomcat 6.0\conf\Catalina\localhost下的,只需要修改一下对应目录即可
大概的配置步骤就是这些,现在可以把不同的war包放在不同的位置来访问了
以上配置方法同样适合Tomcat 5.5

注意事项

  • 要使用域名访问,用户得先去获得域名地址。
  • 通过域名管理服务,域名地址要被解析成IP地址+端口号。
分类: Java技术栈 标签:

tomcat配置多个端口

2016年11月2日 评论已被关闭

tomcat配置多个端口
http://blog.csdn.net/wanghuan203/article/details/45310799
一、Tomcat 安装后本身提供了一个server,端口配置默认是8080,对应目录为:..\Tomcat 6.0\webapps
二、Tomcat 6.0 配置多个端口,其实也就是给Tomcat增加几个server,并设置对应目录。下面以增加两个端口号为例
第一步、修改server.xml[..\Tomcat 6.0\conf]
(1)Tomcat提供的如下:
Xml代码 收藏代码
<Service name=”Catalina”>

<Connector port=”8090″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />

<Connector port=”8009″
enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />

<Engine name=”Catalina” defaultHost=”localhost”>

<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>

<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>

</Engine>

</Service>

(2)新增两个端口号,注意Service name、Engine name、appBase,
当然了,端口号别忘了修改,以免重复。
Xml代码 收藏代码
<Service name=”Catalina1″>

<Connector port=”8091″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />

<Connector port=”8009″
enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />

<Engine name=”Catalina1″ defaultHost=”localhost”>

<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>

<Host name=”localhost” appBase=”webapps1″
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>

</Engine>

</Service>

Xml代码 收藏代码
<Service name=”Catalina2″>

<Connector port=”8092″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />

<Connector port=”8009″
enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />

<Engine name=”Catalina2″ defaultHost=”localhost”>

<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>

<Host name=”localhost” appBase=”webapps2″<!– 这个地方很重要,我今天没修改这个,导致webapps下的几个应用都可以用多个端口访问,结果只好将默认的webapps下的应用拷到其他地方,在${tomcat_home}/conf/下创建Catalina2/localhost/,并创建不同的xml文件将docBase指向应用所在的路径–>
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>

</Engine>

</Service>
第二步、创建相应的部署目录
..\Tomcat 6.0\webapps1
..\Tomcat 6.0\webapps2
同时可以将Tomcat 6.0\webapps下的有用的复制到新建的部署目录
第三步、创建配置文件目录和配置文件
..\Tomcat 6.0\conf\Catalina1\localhost
..\Tomcat 6.0\conf\Catalina2\localhost

host-manager.xml
manager.xml

配置文件的配置可参照..\Tomcat 6.0\conf\Catalina\localhost下的,只需要修改一下对应目录即可

大概的配置步骤就是这些,现在可以把不同的war包放在不同的位置来访问了
以上配置方法同样适合Tomcat 5.5

分类: Java技术栈 标签:

tomcat配置多个端口(Server.xml不能加中文注释)

2016年11月2日 评论已被关闭

tomcat配置多个端口(Server.xml不能加中文注释)
http://blog.sina.com.cn/s/blog_8acf1be10101i097.html
今天试着给tomcat配置多个端口,参考网上教程
第一步、修改server.xml[..\Tomcat 6.0\conf]
(1)Tomcat提供的如下:
Catalina”>
8090″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />
8009″
enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />
Catalina” defaultHost=”localhost”>

resourceName=”UserDatabase”/>
webapps”
unpackWARs=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>

(2)比着上面的葫芦画下面的瓢、新增两个端口号,注意Service name、Engine name、appBase,
当然了,端口号别忘了修改,以免重复。
Catalina1″>
8091″ maxHttpHeaderSize=”8192″
maxThreads=”150″ minSpareThreads=”25″ maxSpareThreads=”75″
enableLookups=”false” redirectPort=”8443″ acceptCount=”100″
connectionTimeout=”20000″ disableUploadTimeout=”true” />
8009″
enableLookups=”false” redirectPort=”8443″ protocol=”AJP/1.3″ />
Catalina1″ defaultHost=”localhost”>

resourceName=”UserDatabase”/>
webapps1″
unpackWARs=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
增加多个端口以此类推。

第二步、创建相应的部署目录
..\Tomcat 6.0\webapps1
..\Tomcat 6.0\webapps2
同时可以将Tomcat 6.0\webapps下的有用的复制到新建的部署目录
第三步、创建配置文件目录和配置文件
..\Tomcat 6.0\conf\Catalina1\localhost
..\Tomcat 6.0\conf\Catalina2\localhost
host-manager.xml
manager.xml
配置文件的配置可参照..\Tomcat 6.0\conf\Catalina\localhost下的,只需要修改一下对应目录即可
大概的配置步骤就是这些
以上就完成配置,根据网上所说的现在就可以用不同的端口访问了,可在我这问题就来了,我的tomcat启动总是一闪而过,在没有配置之前没有这个问题,我也不明原因,在这苦苦查找,总自己认为配置出错了,可是找来找去出没有发现问题,查看日志发现错误如下:
org.apache.catalina.startup.Catalina start
严重: Cannot start server. Server instance is not configured.
提示显示Server实例没有配置,这就是说我的Server.xml还是有问题,这我就郁闷了,没有办法只好好,一步一步恢复到配置前,前启动tomcat尝试看哪个步骤出问题,结果是令我万万没有

分类: Java技术栈 标签:

关于tomcat服务器绑定域名防止恶意域名绑定

2016年11月2日 评论已被关闭

关于tomcat服务器绑定域名防止恶意域名绑定
http://blog.csdn.net/shendixiaoxuan/article/details/23858063
今天下午突然发现客户的域名被恶意域名“www.walking.cn”绑定了,由于之前没有遇到过这种情况,刚开始不知道是什么情况,还以为是客户那边改了,一问都没有,在网上找了很多解决方法什么ngnxi啊都不管用,都是说绑定自己的域名,没说如何不让其他域名绑定。

于是开始研究server.xml文件,修改tomcat/conf/server.xml,找到engine元素,仿照已有的localhost,添加host元素,比如你想禁止www.dddd.com,可以这样写:

Xml代码 收藏代码
<Host name=”www.dddd.com” appBase=”notexists”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”></Host>

其中的appBase是一个不存在的目录,所以www.dddd.com请求时,不会访问你真实的应用。但是这样只是屏蔽了一个已知的,还有很多恶意域名是不可预知的,你并不知道会有多少域名绑定到你的IP,所以这种方式行不通。

上面的方式是默认允许,把禁止的列出来,变换下思路,默认禁止,将允许的列出来,这样不就OK了?所以有第二种方式:
Xml代码 收藏代码
<!– default host is forbiden –>
<Engine name=”Catalina” defaultHost=”forbiden”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>

<!– allow hosts –>
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”></Host>
<Host name=”www.yourweb.com” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”></Host>
<Host name=”192.168.0.34″ appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”></Host>

<!– forbiden host, the appBase is a not exists directory.
If the requested domain is not in the above list of hosts where are allowed, then use this host.
–>
<Host name=”forbiden” appBase=”notexists”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”></Host>
</Engine>

这里将Engine中的defaultHost设置为forbiden,下面有个name为forbiden的host,其appBase是个不存在的目录。再添加允许的host。所以,如果是未知的域名,则会使用forbiden的host,这样就访问不到真实应用目录了。

分类: Java技术栈 标签:

tomcat多个端口对应多个web应用

2016年11月2日 评论已被关闭

tomcat多个端口对应多个web应用

http://www.cnblogs.com/killbug/archive/2013/01/23/2872473.html
<?xml version=’1.0′ encoding=’utf-8′?>

<Server port=”8005″ shutdown=”SHUTDOWN”>

<Resource name=”UserDatabase” auth=”Container”
type=”org.apache.catalina.UserDatabase”
description=”User database that can be updated and saved”
factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
pathname=”conf/tomcat-users.xml” />
</GlobalNamingResources>

<Service name=”Catalina”>
<Connector port=”7777″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ />
<Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />
<Engine name=”Catalina” defaultHost=”localhost”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
</Host>
</Engine>
</Service>

<Service name=”Catalina2″>
<Connector port=”8002″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8444″/>
<Connector port=”8010″ protocol=”AJP/1.3″ redirectPort=”8444″ URIEncoding=”UTF-8″ />

<Engine name=”Catalina2″ defaultHost=”localhost”>
<Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
resourceName=”UserDatabase”/>
<Host name=”localhost” appBase=”webapps”
unpackWARs=”true” autoDeploy=”true”
xmlValidation=”false” xmlNamespaceAware=”false”>
<Context path=”” docBase=”system” />

</Host>
</Engine>
</Service>

</Server>
复制代码
重新复制一个service,改掉名字,端口,如上,测试成功。

还有一点需要数以的是:<Context path=”” docBase=”system” />

path不填就可以实现直接打入网址和端口就可以进入system引用啦。

分类: Java技术栈 标签: