nginx的upstream里不能支持长连接的排查

最近在对比apache和nginx放jboss前面的性能。发现我配置的nginx 对后端server不能使用长连接去连。具体的就是抓包吧: tcpdump -i lo port 7002 and ‘tcp[tcpflags] & (tcp-syn|tcp-fin) !=0 ‘ -nn 可以看到每个请求完毕后连接都关闭了。然后抓包搞一晚上,试过N个版本排查了N久,后恰好看文景同学在线就咨询了一下他。我之前的配置文件是: upstream jboss {server 127.0.0.1:7002; keepalive 10; }………….proxy_set_header Connection ""; proxy_http_version 1.1; sendfile on; rewrite ^$ /index.html permanent; location / {index index.html index.htm; proxy_pass http://jboss; proxy_set_header Host $http_host; proxy_set_header X-Forwarded-By $server_addr:$server_port; proxy_set_header X-Forwarded-For $remote_addr; proxy_intercept_errors on; proxy_connect_timeout 5s; proxy_read_timeout 10s; proxy_send_timeout 5s; proxy_buffer_size 16k; proxy_buffers 8 64k; proxy_busy_buffers_size 128k; } 文景提醒我说proxy_set_header需要配置在一起才行,试过把 proxy_set_header Connection “”;放到location里面后果然就OK了。当然,也可以把这些都直接放在server段,但是注意不要再在location短去设置httpd头.WIKI上的说明是proxy_set_header directives issued at higher levels are only inherited when no proxy_set_header directives have been issued at a given level. ...

March 9, 2013 · 1 min · pm

startssl证书申请

其实早就想申请一个ssl证书,不过觉得有点麻烦就没有搞。今天申请了一下,简单说一下:1. 直接在http://www.startssl.com/上点一下StartSSL Free(Class 1),把自己的基本资料填写好,提交好后邮箱会马上收到一个验证码。2.收到验证码后需要给自己创建一个证书,直接点几下就行了。最后证书会安装到浏览器内。3.验证域名的所有权然后输入自己的域名,之后会自动查询域名的注册时留下的邮箱,并且会向邮箱发送一个验证码,输入后就可以完成对这个域名的认证了。 4.签发自己的证书后把证书,私钥,证书链和ca都放自己的机器上。nginx下的证书链配置是证书在最前面,然后逐级追加中间ca,最后是把ca加在最后面。 新建一个server段,加配置ssl on;ssl_certificate cert/server.crt;ssl_certificate_key cert/server.key;

March 9, 2013 · 1 min · pm

如何监听非本地IP

做HA的时候,如果每个机器上同时需要监听多个IP的同一个端口。那么肯定是需要写死监听的IP和端口。比如在haproxy里面:frontend freebind 10.17.10.4:80default_backend test1frontend freebind 10.17.10.5:80default_backend test2 echo 1 > /proc/sys/net/ipv4/ip_nonlocal_bind

March 9, 2013 · 1 min · pm

常用的证书格式转换

1. 从pfx格式的证书提取出密钥和证书 set OPENSSL_CONF=openssl.cnf openssl pkcs12 -in my.pfx -nodes -out server.pem openssl rsa -in server.pem -out server.key openssl x509 -in server.pem -out server.crt 2. PEM格式的证书与DER格式的证书的转换 openssl x509 -in cert.pem -inform PEM -out cert.der -outform DER openssl x509 -in ca.cer -inform DER -out ca.pem -outform PEM 几种典型的密码交换信息文件格式 DER-encoded certificate: .cer, .crt PEM-encoded message: .pem PKCS#12 Personal Information Exchange: .pfx, .p12 PKCS#10 Certification Request: .p10 PKCS#7 cert request response: .p7r PKCS#7 binary message: .p7b 说明: ...

March 9, 2013 · 2 min · pm

记一次乌龙事件

去年5月的时候用信用卡申请了amazon的免费的EC2用来随便玩玩。平时其实就挂个blog,也不怎么用(包括不怎么用于翻墙)。最近总是登录不上,昨天无意间看到了流量监控,才发现进出口的带宽都非常大,峰值的时候到了150Mpbs,然后看了一下历史记录发现大概已经一周左右了。 然后第一感觉是不是被DDOS了,但是DDOS的话出去的流量不会这么大。我就把22和80端口以外的端口都关闭了。流量立马下降了,而且机器也能登录了。top看了一下发现squid3的进程耗内存非常多。我才想起年前配置过一次squid做反向代理时没有设置密码,立即想到流量费会不会超过。不幸的是本月账单上已经显示使用了$56了,赶紧连夜买了一个30多块钱一个月的OpenVZ的VPS,然后把数据迁移下来,把EC2停掉。今天看了一下账单都用了$61了。 就当吸取一个小的教训吧。

March 9, 2013 · 1 min · pm

dnsmasq的rebind_protection引发的问题

在之前写到过OpenWrt的lan端不能正常解析公司内部域名的问题,并通过在dhcp里让用户的dns设置为指定的DNS服务器的方式得到了临时的解决。但是在路由器自身上还是解析不了内部的域名。今天看了一下实际生效的配置文件里面有一项:stop-dns-rebind,然后在http://wiki.openwrt.org/doc/uci/dhcp查到了rebind_protection boolean no 1 –stop-dns-rebindEnables DNS rebind attack protection by discarding upstream RFC1918 responsesrebind_localhost boolean no 0 –rebind-localhost-okAllows upstream 127.0.0.0/8 responses, required for DNS based blacklist services, only takes effect if rebind protection is enabledrebind_domain list of domain names no (none) –rebind-domain-okList of domains to allow RFC1918 responses for, only takes effect if rebind protection is enabled这几个选项的含义,直接在配置里去掉了这项之后,并且取消了之前在dhcp里配置的 list ‘dhcp_option’ ’6,DNS1,DNS2′,重启路由器后也可以正常通过路由器的dnsmasq提供的解析了。 指定的DNS服务器

February 27, 2013 · 1 min · pm

TP-LINK 740N复活记

由于在公司直接连接无线时访问内部资源还需要拨VPN才行,非常不方便。所以我一直放了一个路由器插网线做802.1X认证。现在用的这个是在淘宝上30多块钱买的一个旧的TP-LINK的740N V4。由于之前这个路由器出厂时的CPU频率被限制在350Mhz,所以我当时是刷过别人改过uboot的741N固件(740和741对应的版本基本是可以通刷的),刷了之后恢复了ar7240默认的400Mhz。之前路由器LAN-WLAN的速度问题一直困扰着我,不过反正就平时办公用一下,所以也无所谓,再慢也能有800KB/S左右的速度,直接测试WAN->WLAN的带宽也能跑到30Mbps多点。今天想着刷一下新版本的OpenWrt直接就下了个741n V4的OpenWrt固件,结果直接刷砖了。后来仔细看了一下WIKI,才发现刷的是AR9330才能用的固件。。 WIKI回家后找出电烙铁和TTL线,参考之前网上找的TTL接线图。把TTL线焊好,另外windows上下了个tftp32,正确的740N v1的固件放在目录下就可以开始修复了:1. tftpboot 0x80000000 740v1.bin #把固件下载到内存中2. erase 0x9f020000 +0x3c0000 #把flash除去uboot的那部分擦除,后面0x3c0000为固件大小3. cp.b 0x80000000 0x9f020000 0x3c0000 #写入固件。4.输入bootm就能启动了 正好晚上也有时间,我把T530和X220一个连LAN口,另外一个无线连接路由器,测试了一下LAN-WLAN的速度,确实比较搓 然后搜了下:http://wiki.openwrt.org/doc/uci/wireless?s[]=noscan 40 MHz channel (300 Mbps)Stuck at 130Mbps? Get 300Mbps! Note: this violates regulatory requirements. Edit the file /etc/config/wireless, and restart the wifi AP by executing the following commands… uci set wireless.radio0.htmode=HT40+ # or: HT40- if using channel 11uci set wireless.radio0.noscan=1uci commit wireless; wifiNote that option ‘htmode’ should be set to either HT40+ (for channels 1-7) or HT40- (for channels 5-11). You have to use WPA2 encryption with AES. 自己修改了一下配置 ```bash config wifi-device ‘radio0’option type ‘mac80211’option macaddr ‘e0:15:c4:2b:a0:71′option hwmode ’11ng’list ht_capab ‘SHORT-GI-40’list ht_capab ‘TX-STBC’list ht_capab ‘RX-STBC1’list ht_capab ‘DSSS_CCK-40’option channel ‘6’option country ‘US’option txpower ’27’option noscan ‘1’option htmode ‘HT40+’改成使用40Mhz的频段,并且加上noscan选项。再测试一下就能跑出正常的水平了 ...

February 26, 2013 · 1 min · pm

fcitx在gnome3下的安装

fcitx总体来说还是很不错的一个中文输入法。不过虽然很简单的一个东西,每次安装都有点这样那样的问题。要选的包有fcitx,fcitx-config-gtk2,fcitx-ui-classic,fcitx-frontend-gtk2,fcitx-frontend-gtk3,im-switch.每次安装后运行一下im-switch选一下fcitx。然后需要注意重启一下dbus才行。

January 11, 2013 · 1 min · pm

apache的参数调整

apache+jboss是公司应用的基本结构。但是很多参数一直没有调整过。之前做个一些调优,把很多关键的参数看了一下,单独注释了。Timeout 180 #Timeout主要是定义了在处理一个请求时的多种超时时间,默认是300s。我们需要关注意的主要是2个。#一个是当读缓冲区为空时,等待client段发送一个包的超时时间。另外就是当发送缓冲区满的时候,#向客户端发送一个包后的等待确认时间。Timeout与单次请求的完成总时间毫无关系。KeepAlive On #是否启用KeepAlive,由于应用放spanner后端,开启后可以使得spanner能和应用保持持续的连接,提高一定性能。MaxKeepAliveRequests 100 #单个KeepAlive的连接能处理的最大请求数,可以适当调高,提高单个连接复用的效率。KeepAliveTimeout 3 #单个keepalive的连接在指定时间内如果没有请求,就进行回收。 StartServers 10 #初始的工作进程数量ServerLimit 50 #工作进程的最大数量MaxClients 2500 #最大的并发访问数量,不能超过ServerLimit*ThreadsPerChildMinSpareThreads 50 #最小的闲置线程数MaxSpareThreads 200 #最大的限制线程数ThreadsPerChild 50 #每个进程的最大线程数,需要注意32位的系统单个进程的能启动的线程数小于384.MaxRequestsPerChild 10000 #每个进程能处理的最大请求数。 mod_jk(Apache Tomcat) worker.list=local #定义worker的名称,如果有多个可以用逗号隔开(多个时候就是一个apache对多个tomcat做负载均衡)# 对于每个worker的属性定时使用这样的模式: worker..=worker.local.type=ajp13 #定义协议名称worker.local.host=localhost #因为是连本地的jboss,所以直接写localhost就行。worker.local.port=7001 #本地tomcat ajp的端口worker.local.lbfactor=50 #单个worker的权重,在有多个worker做负载均衡的时候此项才会有意义worker.local.cachesize=100 #单个进程对后端的连接被当初一个连接池对待,每个进程的链接池的连接数上限。需要注意最好不要超过apache里每个进程的线程数worker.local.cache_timeout=600 #当cachesize里连接池内的连接在关闭前被保留的时间。worker.local.socket_keepalive=1 #在apache和后tomcat间启用tcp的KEEP_ALIVE属性,主要是在当tomcat和jk直接有防火墙的时候会把不活动的连接关闭掉,此时可以通过设置此选项。worker.local.recycle_timeout=300 #作用其实和cache_timeout类似,但是在non-cache模式下也能使用。#当某个请求不在一定时间内不活跃后,告诉apache关闭该ajp连接,降低此值能大大减少后端tomcat的负担。 贴一个自己改过的配置:``` Timeout 10KeepAlive OnMaxKeepAliveRequests 1000KeepAliveTimeout 5 StartServers 10ServerLimit 50MaxClients 2500MinSpareThreads 50MaxSpareThreads 200ThreadsPerChild 50MaxRequestsPerChild 10000 workers.properties:# mod_jk(Apache Tomcat) worker.list=local worker.local.type=ajp13worker.local.host=localhostworker.local.port=7001worker.local.lbfactor=50worker.local.cachesize=25worker.local.cache_timeout=15worker.local.socket_keepalive=1worker.local.recycle_timeout=10

January 6, 2013 · 1 min · pm

使用nginx做缓存服务器

nginx做cache其实也比较简单。配置项非常少 #user nobody; worker_processes 1; error_log logs/error.log; pid logs/nginx.pid; events {worker_connections 65535;} http {include mime.types; default_type application/octet-stream; underscores_in_headers on; log_format main ‘$http_orig_client_ip $remote_addr $host – $remote_user [$time_local] "$request" ‘‘$status $body_bytes_sent "$http_referer" ‘‘"$http_user_agent" "$http_x_forwarded_for"’; }} 如果是想把内容放内存,可以把缓存的路径设置到shm里面。

December 28, 2012 · 1 min · pm