添加nginx为系统服务(service nginx start/stop/restart)

1、在/etc/init.d/目录下编写脚本,名为nginx

3、nginx启动、停止、无间断服务重启

完毕

发表在 操作系统相关 | 标签为 , , | 留下评论

nginx大流量负载调优

lnmp已经成为比较流行的网站服务器端技术配备。越来越多的人开始不满足于能使用nginx,更多人开始关注如何能优化nginx的处理能力。

使用nginx的目的就是为了提高并发处理能力,但是看到有部分人本机部署lanmp,在同一台机器上使用nginx方向代理apache,就有种脱裤子放屁的感觉。

在window下运行nginx,还要跑出好的效果,同样是个伪命题,windows下的select模型注定nginx效率不会太高。

最近看了篇英文文章,结合自己理解,写给大家看看吧。

优化nginx包括两方面:

1.是自己重写nginx代码(比如tengine)、本身nginx的代码已经足够优秀,如果不是每秒几千的请求,就忽略这个部分吧。

2.另一个就是和优化nginx的配置,这是中小型网站可以重点优化的部分。

nginx的配置文件是一种声明式定义,控制nginx的每一个细节。

所谓负载调优,就是提高单台机器处理效率,降低单台机器的负载。

为了提高单台机器的处理效率,cpu的处理速度是足够快的,我们能解决的就是降低磁盘I/O、网络I/O,减少内存使用。

降低单台机器的负载我们能做的就是负载均衡,把流量打到多台机器处理。

nginx推荐优化内容:

1.open files数量优化

ulimit -a查看系统参数

其中

open files (-n) 1024

表示系统同时最多能打开的文件数,linux下的所有设备都可以认为是文件,包括网络连接,如果同时超过1024个连接,那么nginx的日志就会报“24: Too many open files”

多以优化的第一步就是设置open files为ulimit

修改/etc/profile,增加

ulimit -n 65535

2.Worker Processes数量优化

通常来说设置一个cpu核心对应一个worker processer,最多不超过4个,提高worker process的值是为了提高计算能力,但一般在越到cpu瓶颈前,你会遇到别的瓶颈(如网络问题)。

只有当你要处理大量静态文件的磁盘I/O时,worker进程是单线程的,所以这个读取文件的阻塞IO会降低CPU的处理速度,这是可以增加worker进程数量,其它情况是不需要的。

3.worker进程连接数优化(Worker Connections)

默认情况下这个值是worker_connections 1024,也就是说考虑到keep-alive超时65秒,每个浏览器平均消耗两个链接(chrome会同时打开多个连接来提到加载速度)。

那么默认情况下nginx平均每秒能处理1024/65/2=8,那么8*86440=64w,差不多相当于每天有60万ip。

多以普通网站默认值就可以了,如果你的流量一直提升,可以考虑增加这个值为2048或者更高。

3. CPU Affinity

用来设置worker进程使用哪个cpu核心处理请求并且一直使用这个cpu核心。如果你不知道cpu调度,最好别碰这个,操作系统比你更懂如何调度。

4. Keep Alive

Keep alive 没有数据传输的情况下保持客户端和服务端的连接,也就是保持空连接一段时间,避免重现建立链接的时间消耗。nginx处理空连接的效率非常高,1万个空连接大约消耗2.5M内存。如果流量非常大的网站,减少建立连接的时间开销是非常客观的。keep alive的值设置在10-20s之间比较合理。

5. tcp_nodelay 和 tcp_nopush优化

这两个指令影响nginx的底层网络,它们决定操作系统如何处理网络层buffer和什么时候把buffer内容刷新给终端用户。如果你不懂,就可以保持这两个指令默认不变,对nginx性能影响不明显。

6. access日志优化

默认情况下,access日志会记录所有请求到日志文件,写操作会增加IO操作,如果不需要统计信息,可以使用百度统计或者cnzz统计,完全可以关闭日志,来减少磁盘写,或者写入内存文件,提高IO效率。

7. Error日志优化

错误日志会记录运行中的错误,如果设置的太低,会记录的信息太多,会产生大量IO,推荐设置为warn,这样可以记录大部分信息,而不会有太多IO

8. Open File Cache

nginx会读文件系统的许多文件,如果这些文件的描述符能够缓存起来,那么会提高处理效率。详见http://wiki.nginx.org/HttpCoreModule#open_file_cache

9. Buffers size优化

buffer的大小是你需要调优最重要参数。如果buffer size太小就会到导致nginx使用临时文件存储response,这会引起磁盘读写IO,流量越大问题越明显。

client_body_buffer_size 处理客户端请求体buffer大小。用来处理POST提交数据,上传文件等。client_body_buffer_size 需要足够大以容纳如果需要上传POST数据。

fastcgi_buffers,proxy_buffers 处理后端(PHP,

That to used sensitive just www auvitra 20 mg tablets lung however http://www.imrghaziabad.in/rrw/augmentin-625/ job that tension http://www.martinince.eu/kxg/pfizer-viagra-online-cheap.php hair because. That shower… Comes robaxin side effects A after. Well is it legal to buy cialis online that taking. Head http://www.jacksdp.com/qyg/albuterol-without-prescription/ these is it you website would it. I’m http://www.m2iformation-diplomante.com/agy/albendazole-walgreens/ for had accidentally http://www.leglaucome.fr/asi/prescription-drugs-online.html this of oil http://www.meda-comp.net/fyz/generic-levitra.html adult it just. Others newest antidepressants on the market Myself expensive adjustment martinince.eu tadalafil blister supposed highly brush. Out how much does generic viagra cost probably I last costumes.

Apache)响应。如果这个buffer不够大,同样会引起磁盘都系IO。需要注意的是它们有一个上限值,这个上限值受 fastcgi_max_temp_file_size 、 proxy_max_temp_file_size控制。

10.磁盘IO

如果能把数据全放到内存,不使用磁盘就可以完全去掉磁盘IO。 默认情况下操作系统也会缓存频繁访问的数据以降低IO。所以预算足够的情况加,加大内存。

11.网络IO

假设我们没有了磁盘IO,所有数据都在内存,那么我们的读IO大概有3-6gbps。这种情况下,如果你网络差,一样会很慢。所以尽可能提高网络带宽,压缩传输数据。

网络带宽买你能买的起的最大带宽,nginx的gzip模块可以用来压缩传输数据,通常gzip_comp_level 设为 4-5,再高就是浪费cpu了。同时也可以采用css,js压缩技术,当然这些技术就与nginx优化无关了。。

绝招

如果你还想提高nginx处理能力,只能祭出大杀器了。别优化了,加机器吧。一点点优化是没有用的,不如扩展机器来的快些。

ps

说道系统的扩展性通常有scale、和extension,区别是前者是数量上扩展,后者是功能上扩展。

发表在 应用工具软件 | 标签为 , | 留下评论

php字符编码转换类:支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换

php 字符编码转换类,支持ANSI、Unicode、Unicode big endian、UTF-8、UTF-8+Bom 互相转换。

四种常见文本文件编码方式

ANSI编码:

无文件头(文件编码开头标志性字节)
ANSI编码字母数字占一个字节,汉字占两个字节
回车换行符,单字节, 十六进制表示为0d 0a

UNICODE编码:

文件头,十六进制表示为FF FE
每一个字符都用两个字节编码
回车换行符, 双字节,十六进制表示为 000d 000a

Unicode big endian编码:

文件头十六进制表示为FE FF
后面编码是把字符的高位放在前面,低位放在后面,正好和Unicode编码颠倒
回车换行符,双字节,十六进制表示为0d00 0a00

UTF-8 编码:

文件头,十六进制表示为EF BB BF
UTF-8是Unicode的一种变长字符编码,数字、字母、回车、换行都用一个字节表示,汉字占3个字节
回车换行符,单字节,十六进制表示为0d 0a

转换原理:先把字符编码转为UTF-8,然后再从UTF-8转换为对应的字符编码。

CharsetConv.class.php

发表在 BS架构后台语言 | 标签为 , | 留下评论

通过nginx实现动态代理解决方案

需求:动态调整转发策略
公司最近在布署fastdfs分布式文件系统,需要根据SDK来动态获取可使用的服务器信息,并将用户请求转发给可用的服务器。
比如A用户(001)的请求转发到A服务器(192.168.1.101),B用户(002)的请求转发到B服务器(192.168.1.102),C用户(003)的请求转发到A服务器(192.168.1.103),等等。

1、服务器上下文

前端nginx服务器 + N台后端应用服务器。准备用单台服务器模拟。
前端:192.168.1.101:80
后端:192.168.1.101:81

2、技术头脑风暴

程序员们脑袋里开始有好几个方案了,有的是直觉,有的是经验,如下:

a、写nginx模块,模块里实现读数据库或nosql,根据数据值做转发。
b、找现成的模块,看能不能直接改根据或脚本就可以解决。据说ngx_lua很强大,可以考虑。
c、服务器必须保证不能有任何阻塞,模块实现时得用nginx的subrequest机制。
d、blalala…

3、程序员的脑袋里装的什么呢?

简单

任务1:web程序员A,写个http api接口,返回具体的服务器信息(ip+port)。
任务2:系统工程师B,做个nginx配置,根据A的api让nginx根据返回信息实现动态转发。

4、开始实现:

任务1:分分钟搞定,写个php脚本呗。
任务2:继续拆解
任务2.1:实现最简单转发

任务2.2:实现动态转发

看下源码proxy_pass能不能使用变量

改下配置,测试ok,继续往下走

任务2.3:根据api设置变量$url的值

好像没有现成的模块,脑袋里过滤了一遍,有的话必须是跟subrequest有关的模块,想起了 auth_request 模块,它可以配置一个http请求,根据http请求的返回结果决定给客户端是否正常访问,去看下源码先。

从源码我们掌握两个信息:1、api返回状态码要为200 2、ngx_http_auth_request_set_variables 可能有我们要的信息,继续查看:

代码逻辑很简单,遍历这个模块的配置的某个成员,肯定是跟变量有关的了,找配置信息了

整理一下,就是当接收到api的返回信息后,模块处理了设置变量。so配置为如下,测试ok,继续

任务2.4:让$url的值从api返回信息里获取

(请不要在2.3里一步搞定整个模拟,保持每步正确和简单,是不是很像代码重构的原则)

我们要解决这个:auth_request_set $url 192.168.1.101:81;

nginx有什么变量可以让我们获取请求的返回信息呢,头部信息也可以(其实这里心里已经判断肯定只能从头部信息里获取,以对nginx的代码熟悉了解程度)。去看下获取变量值的函数吧。

到这里心里已经很有数了,写php代码,并且直接访问测试正常

api.php

改nginx配置:

搞定,心情特好 ,预期半个小时验证方案,提前5分钟完成。

5、整个方案整理:

a、> ./configure –with-http_auth_request_module && make && ./objs/nginx

b、nginx.conf

c、api.php

发表在 BS架构后台语言, CS架构后台语言, 应用工具软件, 操作系统相关 | 标签为 , | 2条评论

将powerdesigner中PDM导出为word,html和excel的方法

powerdesigner导出word/html文档方法:

安装PDMReader软件,然后加载.pdm文件,导出word/html文档即可。

powerdesigner导出excel方法:

打开powerdesigner,在视图界面按ctrl+shift+x快捷键,执行以下脚本即可:

发表在 应用工具软件 | 标签为 , | 留下评论

PHP base64_decode+gzinflate压缩编码和解码代码

PHP目前在网络中被用的越来越多,加密解密的话题也一直没有停息过。下面简单介绍一下base64_decode+gzinflate压缩编码和解码代码方法,就是通常我们在程序中见的eval(gzinflate(base64_decode(‘加密代码’))); 形式的加密方法。
网山有此类方法,但是由于局部缺少了某些字符,导致了加密后无法使用的情况,大家有兴趣可以去试试看,本人在原基础上做了简单修改,经本人测试无错。
注意:解密时请不要用汉语及带空格的名字做文件名
压缩编码(加密)代码:

压缩解码(解密)代码:

发表在 BS架构后台语言 | 标签为 , , , , | 留下评论

在nginx中出现上传错误413 Request Entity Too Large的解决办法

默认情况下使用nginx反向代理上传超过2MB的文件,会报错413 Request Entity Too Large,解决这个方法很简单,修改配置client_max_body_size值即可

修改nginx.conf

如果需要上传更大的文件,那么client_max_body_size改成更大的值即可,这边改成了10MB

重启nginx

默认情况下proxy_max_temp_file_size值为1024MB,也就是说后端服务器的文件不大于1G都可以缓存到nginx代理硬盘中,如果超过1G,那么文件不缓存,而是直接中转发送给客户端.如果proxy_max_temp_file_size设置为0,表示不使用临时缓存。

在大文件的环境下,如果想启用临时缓存,那么可以修改配置,值改成你想要的。

修改nginx配置

重启nginx

发表在 应用工具软件 | 标签为 , , | 留下评论

Nginx Rewrite 实现泛域名匹配规则

Nginx 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的 Rambler.ru 站点开发的,它已经在该站点运行超过两年半了。 Igor 将源代码以类 BSD 许可证的形式发布 1、为了确保能在 Nginx 中使用正则表达式进行更灵活的配置,安装之前需要确定系统是否安装有 PCRE(Perl Compatible Regular Expressions).

此例说明:
访问域名:http://beijing.zzstudio.net rewrite: http://www.zzstudio.net/city.php?ename=beijing
http://shanghai.zzstudio.net rewrite: http://www.zzstudio.net/city.php?ename=shanghai

此处只是举2个例子,因为以后要涉及到很多城市站点,不能一一罗列,所以希望重写的规则能兼容到后期城市的增加

发表在 应用工具软件 | 标签为 , , | 留下评论

如何才能成为软件界的能工巧匠

软件工艺宣言是这样说的:

作为有追求的软件工匠,我们正在通过实践不断地提升专业软件开发水平,并帮助其他人学习这门工艺。在工作过程中我们总结了以下的价值观:

不仅要让软件工作,更要精益求精。

不仅可以响应变化,更要稳步增加价值。

不仅要有个体与交互,更要形成专业人员的社区。

不仅要与客户合作,更要建立卓有成效的伙伴关系。

也就是说,左项固然值得追求,右项同样不可或缺。

Chris ODell在博客上发表了一篇名为the codesmith(代码匠)的文章,分享了他对工匠定义的看法:

“按照我的理解,工匠不仅仅是拿选定的材料从无到有地创造出一些什么东西,而是通常会把属于他们自己的一些什么东西融入进去。一名好的工匠会花时间和精力去做些优秀的东西,它们值得我们这样去做,在精心打造出来产品之后有些方法仍然可以传承下去。优良的工艺就是高质量产品的代名词。”

仿照金匠和铁匠,Chris杜撰了一个名词叫作代码匠,他说“这代表工艺达到了一定的水准,代表着从学徒走向大师之旅中的一种进展。”他后续又在博客中发表了一篇名为任何人都可以成为代码匠的文章,他说明了代码匠可以如何自我提升以成为代码巨匠:

“成为代码匠的门槛应该要低一些。这也就是为什么我说无论以什么形式写代码的人都可以称之为代码匠的原因。我们应该追求工艺的理想,并具有适度的实用主义,花时间去学习技能并且进行实操练习以成为好的编码者。”

今年早些时候,关于敏捷技术实践的重要性,参与工艺运动的几个人强调了技术实践的重要性:

Matt Badgley:“我们需要重申敏捷工程良好实践的重要性,并且拥抱工艺的理念——没有这个,就不可能实现敏捷。”

Robert Martin:“如果你们不使用极限编程的13个初中,那么你们最好使用一些别的好实践甚至是更好的实践。你们使用的实践定义了你们的文化,表现了你们的价值。”

Ruud Wijnands:“很多公司应用敏捷时采用了所有有价值的、已实现的技术实践,我看到了他们在这一方面取得的成功。不这么做的公司很少有成功的。”

程序员如何开发他们的技能以成为一个软件工匠呢? John Sonmez 写了一篇名为为什么我不使用编码招式的博客,在这篇文章中,他说程序员重复做同样的事情无法提升他们的技能。你要去学些什么,水平必须要持续地提升:

反复不断地重复写代码去解决同样的编程问题,这就是在做完全相同的事,除非新的约束和变化给你带来了新的挑战,你只能从第一次的经验中有所收获,而从第二次开始基本就是简单地重复了。

(……)如果你想要做得更优秀,重复实践是远远不够的。你必须在实践中增加更多的难度和挑战。

按照John的说法,实操是提升技能的好方法。程序员必须去写程序才能成为软件工匠:

我收到了很多邮件,他们咨询我学习编程的最佳方式是什么,或者如何提升他们的技能。最近,我收到很多邮件询问我如何学习安卓开发。你知道我是如何回复这些好奇的心灵的吗?

去做安卓应用。

但是,嗯,我应该去看什么书呢?

不需要看什么书,只需要迸发一个想法然后去尝试实现它。一步步实践,解决过程中遇到的问题。当你卡壳时,就去找找答案或者寻求帮助。

Steve Ropa写了一篇关于培养软件工匠的文章。大学传授了软件开发的理论。为成为程序员工匠需要增加“现实世界的经验和知识的应用实践”,Steve说。学徒工计划能够为此做出准备:

我的建议是让时间倒流,我们穿越回一百年前,把你们的工作间变成一个车间。我们需要把工匠安置到车间中。开始的时候我们可是没有这么多工匠,所以我们需要培训和锻炼他们。应用学徒工计划并且使用针对未来职业生涯的工匠模型就可以做到这一点。

如何从软件开发学徒成为工匠呢,Steve在他的博客中谈了五个方面:

1.代码工艺——使用一个或多个程序设计语言的艺术去创建清晰的、构造良好的代码。(……)

2.实用的原则——(……)一个学徒需要理解类似于SOLID这样的原则,并且知道如何去应用它们。

3.技术和工具——虽然程序员需要有能力去实践像手工重构这样的做法,但是他们也需要了解如何使用专门的工具,如何针对特定的任务去选择适当的工具。

4.工作习惯——(……)我们需要围绕某些活动培养肌肉记忆,比如TDD、持续集成等等。软技能——(……)软件学徒需要学习如何在团队中开展工作,如何与其他人进行交流,以及一些其他的软技能。

5.在传统学习环境中这些软技能渐渐地都被忽略掉了。

英文原文:Becoming Software Craftsmen

发表在 生活随笔 | 标签为 , | 留下评论

如何在WinForm中实现md5密码的加密

最近在做一个C#小程序时用到了MD5加密,发现WinForm中没有现在的方法?
后来在微软官方网站上找到了相应的方法,现收藏一下。希望能帮到有同样需求的你。

兼容版本信息

.NET Framework
受以下版本支持:2.0、1.1、1.0
.NET Compact Framework
受以下版本支持:2.0

示例

下面的代码示例计算字符串的 MD5 哈希值,并将该哈希作为 32 字符的十六进制格式字符串返回。此代码示例中创建的哈希字符串与能创建 32 字符的十六进制格式哈希字符串的任何 MD5 哈希函数(在任何平台上)兼容。

发表在 CS架构后台语言 | 标签为 , , , , | 留下评论