nginx ssl 配置 80端口自动转发到443 ssl

server {

    listen 80;

    listen 443 ssl;

    if ($server_port = 80) {

         rewrite ^http://$host https://$host permanent;

         rewrite ^(.*)$ https://$host$1 permanent;

    }

    ssl_certificate /mnt/tmp/ssl/certs/star_we3ew_com.pem;

    ssl_certificate_key /mnt/tmp/ssl/certs/we3ew.key;

    ssl_session_timeout 2m;

    ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;

    ssl_ciphers HIGH:!aNULL:!MD5;

····

}

———————————

server {

  listen 443;

  server_name we3ew.com ;

  ssl on;

  ssl_certificate /etc/nginx/ssl/whs.pem;

  ssl_certificate_key /etc/nginx/ssl/whs.key;

  ssl_session_timeout 5m;

  ssl_protocols SSLv3 TLSv1;

  ssl_ciphers HIGH:!ADH:!MD5;

  ssl_prefer_server_ciphers on;

  location / {

    proxy_pass https://192.168.1.20:443;

    proxy_set_header host xxx.homeserver.com;

  }

}

nginx+php-fpm出现502 bad gateway错误解决方法

vim  /usr/local/php5.3/etc/php.ini
max_execution_time = 300
maximium_execution_time
vim  /usr/local/nginx/conf/nginx.conf
proxy_buffer_size 64k;
proxy_buffers  512k;
proxy_busy_buffers_size 128k;

vim  /usr/local/nginx/conf/fastcgi_params
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

vim  /usr/local/php5.3/etc/php-fpm.conf
request_terminate_timeout = 10s


502错误是所有用nginx跑php的运维人员不愿意看见的

nginx出现502有很多原因,但大部分原因可以归结为资源数量不够用,也就是说后端php-fpm处理有问题,nginx将正确的客户端请求发给了后端的php-fpm进程,但是因为php-fpm进程的问题导致不能正确解析php代码,最终返回给了客户端502错误。

服务器出现502的原因是连接超时 我们向服务器发送请求 由于服务器当前链接太多,导致服务器方面无法给于正常的响应,产生此类报错

因此如果你服务器并发量非常大,那只能先增加机器,然后按以下方式优化会取得更好效果;但如果你并发不大却出现502,一般都可以归结为配置问题,脚本超时问题。

1.php-fpm进程数不够用

使用 netstat -napo |grep “php-fpm” | wc -l 查看一下当前fastcgi进程个数,如果个数接近conf里配置的上限,就需要调高进程数。

但也不能无休止调高,可以根据服务器内存情况,可以把php-fpm子进程数调到100或以上,在4G内存的服务器上200就可以。

2. 调高调高linux内核打开文件数量

可以使用这些命令(必须是root帐号)

echo ‘ulimit -HSn 65536′ >> /etc/profile

echo ‘ulimit -HSn 65536′ >> /etc/rc.local

source /etc/profile

 3.脚本执行时间超时

如果脚本因为某种原因长时间等待不返回 ,导致新来的请求不能得到处理,可以适当调小如下配置。

nginx.conf里面主要是如下

fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;

php-fpm.conf里如要是如下

request_terminate_timeout = 10s

4.缓存设置比较小

修改或增加配置到nginx.conf

proxy_buffer_size 64k;
proxy_buffers  512k;
proxy_busy_buffers_size 128k;

5. recv() failed (104: Connection reset by peer) while reading response header from upstream

可能的原因机房网络丢包或者机房有硬件防火墙禁止访问该域名

但最重要的是程序里要设置好超时,不要使用php-fpm的request_terminate_timeout,

最好设成request_terminate_timeout=0;

因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。

May 01 10:50:58.044162 [WARNING] [pool www] child 4074, script ‘/usr/local/nginx/html/quancha/sameip/detail.php’ execution timed out (15.129933 sec), terminating
May 01 10:50:58.045725 [WARNING] [pool www] child 4074 exited on signal 15 SIGTERM after 90.227060 seconds from start
May 01 10:50:58.046818 [NOTICE] [pool www] child 4082 started

说一千道一万最重要的就是程序里控制好超时,gethostbyname、curl、file_get_contents等函数的都要设置超时时间。

另一个就是多说,这个东西是增加了网站的交互性,但是使用的多了反应就慢了,如果你网站超时且使用了多说是,可以关闭它。

http://leezqang.blog.51cto.com/1525874/1365140

最近一个月经常有客服打电话抱怨页面出现502错误 起初以为是运行游戏程序问题(因为重启php-fpm进程没有用,只有重启游戏才能恢复),后来情况严重了:连论坛都出现了502错误,为了不等领导请喝茶,赶紧查了nginx日志,查出过去几天有各种错误 111: Connection refused  104: Connection reset by peer

1
[error] 31329#0: *1027762 connect() failed (111: Connection refused) while connecting to upstream ....upstream:"fastcgi://127.0.0.1:9000",......

大致是php超时设置的太小,nginx fastcgi 缓存设置过小

后来查看了nginx 配置,fastcgi_buffers和连接超时这些都是缺省配置php-fpm.conf超时也设置了30s,感觉被php开发和原来的运维坑到了,果断狠心把这些东西都做了修改大致如下 :

在nginx.conf http段加

1
2
3
4
5
6
7
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;

在php-fpm.conf里把request_terminate_timeout = 300

这里关于php—fpm超时设置的略大,还是根据实际情况设置吧

说明:

   fastcgi_connect_timeout 指定连接到后端FastCGI的超时时间

   fastcgi_send_timeout 指定向FastCGI传送请求的超时时间

   fastcgi_read_timeout 指定接收FastCGI应答的超时时间

   fastcgi_buffers 4 64k 设置了4个缓冲,每个缓冲64k,总大小(4+1)*64k。默认是和系统的页大小一致4k或8k

   作用:如果一个PHP脚本所产生的页面大小为256KB,那么会为其分配4个64KB的缓冲区来缓存;如果页面大小大于256KB,那么大于256KB的部分会缓存到fastcgi_temp指定的文件路径中

   fastcgi_buffer_size 64k 是指FastCGI服务器对应头部的缓冲区大小,通常与fastcig_buffers的一个缓冲区大小一致

   fastcgi_busy_buffers_size的默认值是fastcgi_buffers的两倍

   fastcgi_temp_file_write_size表示在写入缓存文件时使用多大的数据块,默认值是fastcgi_buffers的两倍

   request_terminate_timeout php 执行时间超时,可以解决Connection reset by peer的问题

 重启php-fpm 重启nginx

我是26号22点左右的时候修改的,昨天没有问题,今天没有问题,查看日志也没有再出现上面的104 111的错误

http://www.cnblogs.com/jackluo/p/3366612.html

Nginx + PHP(php-fpm)遇到的502 Bad Gateway错误

我一个统计程序估计要跑1分多钟以上

查看了一个php-fpm 配置文件

[13-Oct-2013 12:06:07] WARNING: [pool www] child 7458, script '/home/wwwroot/admin/index.php' (request: "GET /index.php") execution timed out (101.515909 sec), terminating
[13-Oct-2013 12:06:07] WARNING: [pool www] child 7458 exited on signal 15 (SIGTERM) after 1130895.840878 seconds from start
[13-Oct-2013 12:06:07] NOTICE: [pool www] child 24885 started

很明显了

部分PHP程序的执行时间超过了Nginx的等待时间,可以适当增加nginx.conf配置文件中FastCGI的timeout时间

google了一较以后

http://rtcamp.com/wordpress-nginx/tutorials/php/increase-script-execution-time/

Changes in php.ini

If you want to change max execution time limit for php scripts from 30 seconds (default) to 300 seconds.

vim /etc/php5/fpm/php.ini

Set…

max_execution_time = 300

In Apache, applications running PHP as a module above would have suffice. But in our case we need to make this change at 2 more places.

Changes in PHP-FPM

This is only needed if you have already un-commented request_terminate_timeout parameter before. It is commented by default, and takes value of max_execution_time found in php.ini

Edit…

vim /etc/php5/fpm/pool.d/www.conf

Set…

request_terminate_timeout = 300

Changes in Nginx Config

To increase the time limit for example.com by

vim /etc/nginx/sites-available/example.com
location ~ \.php$ {
	include /etc/nginx/fastcgi_params;
        fastcgi_pass  unix:/var/run/php5-fpm.sock;
	fastcgi_read_timeout 300; 
}

If you want to increase time-limit for all-sites on your server, you can edit main nginx.conf file:

vim /etc/nginx/nginx.conf

Add following in http{..} section

http {
	#...
        fastcgi_read_timeout 300; 
	#...
}

Reload PHP-FPM & Nginx

Don’t forget to do this so that changes you have made will come into effect:

service php5-fpm reload
service nginx reload

原来,php-fpm有一个参数 max_requests,该参数指明了,每个children最多处理多少个请求后便会被关闭,默认的设置是500。因为php是把请求轮询给每个 children,在大流量下,每个childre到达max_requests所用的时间都差不多,这样就造成所有的children基本上在同一时间 被关闭。

在这期间,nginx无法将php文件转交给php-fpm处理,所以cpu会降至很低(不用处理php,更不用执行sql),而负载会升至很高(关闭和开启children、nginx等待php-fpm),网卡流量也降至很低(nginx无法生成数据传输给客户端)

解决问题很简单,增加children的数量,并且将 max_requests 设置未 0 或者一个比较大的值:

打开 /usr/local/php/etc/php-fpm.conf

然后重启php-fpm。

二、增加缓冲区容量大小

将nginx的error log打开,发现“pstream sent too big header while reading response header from upstream”这样的错误提示。查阅了一下资料,大意是nginx缓冲区有一个bug造成的,我们网站的页面消耗占用缓冲区可能过大。参考老外写的修 改办法增加了缓冲区容量大小设置,502问题彻底解决。后来系统管理员又对参数做了调整只保留了2个设置参数:client head buffer,fastcgi buffer size。

三、request_terminate_timeout

如果主要是在一些post或者数据库操作的时候出现502这种情况,而不是在静态页面操作中常见,那么可以查看一下php-fpm.conf设置中的一项:

request_terminate_timeout

这个值是max_execution_time,就是fast-cgi的执行脚本时间。

0s

0s为关闭,就是无限执行下去。(当时装的时候没仔细看就改了一个数字)

发现,问题解决了,执行很长时间也不会出错了。

优化fastcgi中,还可以改改这个值5s 看看效果。

php-cgi进程数不够用、php执行时间长、或者是php-cgi进程死掉,都会出现502错误。

==============================================

我把以上的值300改成1000秒去了

合理设置apache httpd的最大连接数

合理设置apache httpd的最大连接数

手头有一个网站在线人数增多,访问时很慢。初步认为是服务器资源不足了,但经反复测试,一旦连接上,不断点击同一个页面上不同的链接,都能迅速打开,这种现象就是说明apache最大连接数已经满了,新的访客只能排队等待有空闲的链接,而如果一旦连接上,在keeyalive 的存活时间内(KeepAliveTimeout,默认5秒)都不用重新打开连接,因此解决的方法就是加大apache的最大连接数。

1.在哪里设置?

服务器的为FreeBSD 6.2 ,apache 2.24,使用默认配置(FreeBSD 默认不加载自定义MPM配置),默认最大连接数是250

在/usr/local/etc/apache22/httpd.conf中加载MPM配置(去掉前面的注释):
# Server-pool management (MPM specific)
Include etc/apache22/extra/httpd-mpm.conf

可见的MPM配置在/usr/local/etc/apache22/extra/httpd-mpm.conf,但里面根据httpd的工作模式分了很多块,哪一部才是当前httpd的工作模式呢?可通过执行 apachectl -l 来查看:
Compiled in modules:
core.c
prefork.c
http_core.c
mod_so.c

看到prefork 字眼,因此可见当前httpd应该是工作在prefork模式,prefork模式的默认配置是:
<IfModule mpm_prefork_module>
StartServers                      5
MinSpareServers                   5
MaxSpareServers                  10
MaxClients                      150
MaxRequestsPerChild               0
</IfModule>

2.要加到多少?

连接数理论上当然是支持越大越好,但要在服务器的能力范围内,这跟服务器的CPU、内存、带宽等都有关系。

查看当前的连接数可以用:
ps aux | grep httpd | wc -l

或:
pgrep httpd|wc -l

计算httpd占用内存的平均数:
ps aux|grep -v grep|awk ‘/httpd/{sum+=$6;n++};END{print sum/n}’

由于基本都是静态页面,CPU消耗很低,每进程占用内存也不算多,大约200K。

服务器内存有2G,除去常规启动的服务大约需要500M(保守估计),还剩1.5G可用,那么理论上可以支持1.5*1024*1024*1024/200000 = 8053.06368

约8K个进程,支持2W人同时访问应该是没有问题的(能保证其中8K的人访问很快,其他的可能需要等待1、2秒才能连上,而一旦连上就会很流畅)

控制最大连接数的MaxClients ,因此可以尝试配置为:
<IfModule mpm_prefork_module>
StartServers                      5
MinSpareServers                   5
MaxSpareServers                  10
ServerLimit                    5500
MaxClients                     5000
MaxRequestsPerChild               100
</IfModule>

注意,MaxClients默认最大为250,若要超过这个值就要显式设置ServerLimit,且ServerLimit要放在MaxClients之前,值要不小于MaxClients,不然重启httpd时会有提示。

重启httpd后,通过反复执行pgrep httpd|wc -l 来观察连接数,可以看到连接数在达到MaxClients的设值后不再增加,但此时访问网站也很流畅,那就不用贪心再设置更高的值了,不然以后如果网站访问突增不小心就会耗光服务器内存,可根据以后访问压力趋势及内存的占用变化再逐渐调整,直到找到一个最优的设置值。

(MaxRequestsPerChild不能设置为0,可能会因内存泄露导致服务器崩溃)

更佳最大值计算的公式

apache_max_process_with_good_perfermance < (total_hardware_memory / apache_memory_per_process ) * 2
apache_max_process = apache_max_process_with_good_perfermance * 1.5

参考:

apache的参数设置

Apache 2.0性能优化—MPM的选择与配置

如何避免apache的httpd进程占用比较多的内存

对apache中并发控制参数prefork理解和调优

附:

实时检测HTTPD连接数:
watch -n 1 -d “pgrep httpd|wc -l”