- Nginx负载均衡
- ssl原理
- 生成ssl密钥对
- Nginx配置ssl
- php-fpm的pool
- php-fpm慢执行日志
- open_basedir
- php-fpm进程管理
1. Nginx负载均衡
vim /usr/local/nginx/conf/vhost/load.conf # 写入如下内容
upstream qq_com
{
ip_hash;
server 61.135.157.156:80; #多台服务器
server 125.39.240.113:80; #多台服务器
}
server
{
listen 80;
server_name www.qq.com;
location /
{
proxy_pass http://qq_com;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
upstream来指定多个web server
nginx不支持代理https
代理服务器可以是443 后端真实服务器不能是443 只能是80
2. ssl原理
SSL工作流程
浏览器发送一个https的请求给服务器;
服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,
区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则
不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
服务器会把公钥传输给客户端;
客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,
并用收到的公钥加密;
客户端把加密后的随机字符串传输给服务器;
服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,
再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥
也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
服务器把加密后的数据传输给客户端;
客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
3. 生成ssl密钥对
cd /usr/local/nginx/conf
openssl genrsa -des3 -out tmp.key 2048#key文件为私钥
openssl rsa -in tmp.key -out aminglinux.key #转换key,取消密码
rm -f tmp.key
openssl req -new -key aminglinux.key -out aminglinux.csr#生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件
openssl x509 -req -days 365 -in aminglinux.csr -signkey aminglinux.key -out aminglinux.crt
这里的aminglinux.crt为公钥
这里的aminglinux.key为私钥
4. Nginx配置ssl
vim /usr/local/nginx/conf/vhost/ssl.conf#加入如下内容
server
{
listen 443;
server_name aming.com;
index index.html index.php;
root /data/wwwroot/aming.com;
ssl on;
ssl_certificate aminglinux.crt;
ssl_certificate_key aminglinux.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
}
/usr/local/nginx/sbin/nginx -t 检查配置文件是否正确
/usr/local/nginx/sbin/nginx -s reload #重新加载
#报错
[root@localhost conf]# /usr/local/nginx/sbin/nginx -t
nginx: [emerg] unknown directive "ssl" in /usr/local/nginx/conf/vhost/ssl.conf:7
nginx: configuration file /usr/local/nginx/conf/nginx.conf test failed
#解决
需要重新编译nginx,加上--with-http_ssl_module
查看nginx的版本参数
[root@localhost conf]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.12.1
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-36) (GCC)
configure arguments: --prefix=/usr/local/nginx
怎么查找我需要的参数
[root@localhost nginx-1.12.1]# ./configure --help |grep -i ssl
--with-http_ssl_module enable ngx_http_ssl_module
--with-mail_ssl_module enable ngx_mail_ssl_module
--with-stream_ssl_module enable ngx_stream_ssl_module
--with-stream_ssl_preread_module enable ngx_stream_ssl_preread_module
--with-openssl=DIR set path to OpenSSL library sources
--with-openssl-opt=OPTIONS set additional build options for OpenSSL
#查看监听端口
netstat -lntp |grep nginx
mkdir /data/wwwroot/aming.com
echo “ssl test page.”>/data/wwwroot/aming.com/index.html
编辑hosts,增加127.0.0.1 aming.com
curl https://aming.com
windows访问编辑hostos添加 ip yuming
5. php-fpm的pool
vim /usr/local/php-fpm/etc/php-fpm.conf#在[global]部分增加
include = etc/php-fpm.d/*.conf
mkdir /usr/local/php-fpm/etc/php-fpm.d/
cd /usr/local/php-fpm/etc/php-fpm.d/
vim www.conf #内容如下
[www]
listen = /tmp/www.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
继续编辑配置文件
vim aming.conf #内容如下
[aming]
listen = /tmp/aming.sock
listen.mode=666
user = php-fpm
group = php-fpm
pm = dynamic
pm.max_children = 50
pm.start_servers = 20
pm.min_spare_servers = 5
pm.max_spare_servers = 35
pm.max_requests = 500
rlimit_files = 1024
/usr/local/php-fpm/sbin/php-fpm -t
/etc/init.d/php-fpm restart
#使用pool方法
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;#指定使用哪个pool
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/wwwroot/test.com$fastcgi_script_name;
}
fastcgi_pass 用来指定php-fpm监听的地址或者socket
6. php-fpm慢执行日志
#反馈网站慢了?
php的网站
vim /usr/local/php-fpm/etc/php-fpm.d/www.conf#加入如下内容
request_slowlog_timeout = 1
slowlog = /usr/local/php-fpm/var/log/www-slow.log
配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为unix:/tmp/www.sock
重新加载nginx服务
vim /data/wwwroot/test.com/sleep.php#写入如下内容
curl -x127.0.0.1:80 test.com/sleep.php
cat /usr/local/php-fpm/var/log/www-slow.log
7. open_basedir
vim /usr/local/php-fpm/etc/php-fpm.d/aming.conf #加入如下内容
php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/
创建测试php脚本,进行测试
再次更改aming.conf,修改路径,再次测试
配置错误日志
再次测试
查看错误日志
8. php-fpm进程管理
pm = dynamic #动态进程管理,也可以是static
pm.max_children = 50 #最大子进程数,ps aux可以查看
pm.start_servers = 20 #启动服务时会启动的进程数
pm.min_spare_servers = 5 #定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。
pm.max_spare_servers = 35 #定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
pm.max_requests = 500 #定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。
#说明
pm = dynamic 动态会自动根据空闲成都增加或者减少进程
pm = dynamic 如果改成 pm = static
pm.max_children = 50 #就只有这一行生效(最大子进程数,ps aux可以查看)
nginx重心
1 负载均衡
2 反向代理
引申:正向代理
重要:对于LNMP中的PHP-FPM,大家应该掌握两点最核心的技能:
1 学会查php-fpm的slow log
2 学会配置php的错误日志(error_log log_error display_error error_reporting)
扩展
ssl相关
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ca.md
https://coding.net/u/aminglinux/p/nginx/git/blob/master/ssl/ssl.md
负载均衡
https://coding.net/u/aminglinux/p/nginx/git/blob/master/proxy/lb.md
nginx算法分析https://blog.whsir.com/post-1482.html
root和alias
http://www.ttlsa.com/nginx/nginx-root_alias-file-path-configuration/