内容摘要
一、Nginx负载均衡
Nginx负载均衡需要用到upstream模块,upstream模块用于定义多个web server,通过算法将访问请求分发到不同的web server。
upstream baidu_com 只是代表服务器组的名称,可以随意定义,用于proxy_pass调用
ip_hash; ip_hash算法,将同一个源IP的访问请求发给同一个server,避免数据婚礼
server 115.239.210.27:80; 定义后端的server
server 115.239.211.112:80; 定义后端的server
server_name www.baidu.com; 虚拟主机域名
proxy_pass http://baidu_com; 调用upstream qq_com
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
二、ssl原理
- 浏览器发送一个https的请求给服务器;
- 服务器要有一套数字证书,可以自己制作(后面的操作就是阿铭自己制作的证书),也可以向组织申请,区别就是自己颁发的证书需要客户端验证通过,才可以继续访问,而使用受信任的公司申请的证书则不会弹出>提示页面,这套证书其实就是一对公钥和私钥;
- 服务器会把公钥传输给客户端;
- 客户端(浏览器)收到公钥后,会验证其是否合法有效,无效会有警告提醒,有效则会生成一串随机数,并用收到的公钥加密;
- 客户端把加密后的随机字符串传输给服务器;
- 服务器收到加密随机字符串后,先用私钥解密(公钥加密,私钥解密),获取到这一串随机数后,再用这串随机字符串加密传输的数据(该加密为对称加密,所谓对称加密,就是将数据和私钥也就是这个随机字符串>通过某种算法混合在一起,这样除非知道私钥,否则无法获取数据内容);
- 服务器把加密后的数据传输给客户端;
- 客户端收到数据后,再用自己的私钥也就是那个随机字符串解密;
在实际生产环境中,ssl证书需要像相关的颁发机构购买。这样的证书会自动通过游览器的信任。而我们自己生产的SSL证书没有通过游览器信任,游览器会弹出相应的提示。
- 移动目录:cd /usr/local/nginx/conf/
- 创建私钥,其中tmp.key为私钥文件(该文件有密码):openssl genrsa -des3 -out tmp.key 2048
- genrsa表示生成rsa类型的私钥文件,-des3表示使用des3加密算法
- -out 指定生成的私钥文件名,2048表示加密算法的长度为2048位
- 生成私钥文件必须输入两次密码,
- 但是有密码的私钥比较麻烦,下面就来取消私钥文件的密码。
- 转换私钥,取消密码(方便客户端访问),并删除tmp.key:openssl rsa -in tmp.key -out zhaoyujie.key
- 生成证书请求文件,需要拿这个文件和私钥一起生产公钥文件: openssl req -new -key zhaoyujie.key -out zhaoyujie.csr
- 生成公钥文件,这里的zhaoyujie.crt为公钥:openssl x509 -req -days 365 -in zhaoyujie.csr -signkey zhaoyujie.key -out zhaoyujie.crt
- x509 代表生成的x509的证书
- -req 证书请求,用于生成证书文件
- -days 证书的有效期,365表示一年
- -in 指定证书请求文件
- -signkey 指定私钥文件
- -out 指定生成的公钥文件名
四、Nginx配置ssl
root /data/wwwroot/zhaoyujie.com;
ssl_certificate zhaoyujie.crt; 指定公钥
ssl_certificate_key zhaoyujie.key; 指定私钥
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
- 使用命令/usr/local/nginx/sbin/nginx -V 可以查看编译时使用的参数
- 命令cd /usr/local/src/nginx-1.14.0
- 命令 ./configure --prefix=/usr/local/nginx --with-http_ssl_module && make && make install
- curl访问本地的https需要添加hosts:echo ’127.0.0.1 zhaoyuujie.com' >> /etc/hosts
- 直接使用命令,提示证书不被信任:curl https://zhaoyujie.com
- 使用选项-k,忽略证书检查访问:curl https://zhaoyujie.com -k
五、php-fpm的pool
在php-fpm中可以定义多个pool(池子),不同的pool需要监听不同sock文件。
- 可以将多个pool定义到php-fpm的主配置文件中,pool的名称和监听的sock文件不能一样。
- 将php-fpm中的pool删除,并添加一行配置,可以指定一个pool的配置文件存放目录(拆分存放,更加简洁):inculde = /etc/php-fpm.d/*.conf
listen = /tmp/php-fcgi.sock 指定这个pool监听的socket文件或者ip:port
listen.mode=666 监听sock文件时,sock文件的权限
六、php-fpm慢执行日志
当有时候访问php网页慢的时候可以开启慢执行日志来查看是否是PHP代码执行时间过长,还可以看到具体是哪个PHP文件的哪一行导致的慢执行。
request_slowlog_timeout = 1 记录超过1秒的php日志到下面定义的地址
slowlog = /usr/local/php-fpm/var/log/www-slow.log
七、nginx配置open_basedir
设定open_basedir可以使PHP只能访问指定目录下的文件,可以在虚拟主机配置中配置open_basedir,也可以在php的pool池中配置open_basedir。
php_admin_value[open_basedir]=/data/wwwroot/aming.com:/tmp/
- 游览器不显示错误信息:display_errors = Off
- 定义错误日志路径:error_lop = /usr/local/php-fpm/var/log/php_errors.log
- 定义日志级别为所以: errot_reporting = E_ALL
- 手动创建日志文件:touch /usr/local/php-fpm/var/log/php_errors.log
- 修改日志文件权限:chmod 777 /usr/local/php-fpm/var/log/php_errors.log
- 检查php-fpm配置文件是否正确并重新加载:php-fpm -t && /etc/init.d/php-fpm reload
- 测试,出现错误,代码404:
八、php-fpm进程管理
- [www] pool名称可以随意定义
- listen = /tmp/php-fcgi.sock 指定这个pool监听的socket文件或者ip:port
- listen.mode=666 监听sock文件时,sock文件的权限
- user = php-fpm 进程用户
- group = php-fpm 进程用户组
- pm = dynamic dynamic动态进程管理可以根据需求自动生成新的子进程,也可以是static一下子启动pm.max_children定义的进程数。
- pm.max_children = 50 dynamic、 static时均生效。最大子进程数,ps aux可以查看。
- pm.start_servers = 3 static时不生效,启动服务时会启动的进程数
- pm.min_spare_servers = 3 static时不生效,定义在空闲时段,子进程数的最少数量,如果达到这个数值时,php-fpm服务会自动派生新的子进程。
- pm.max_spare_servers = 35 static时不生效,定义在空闲时段,子进程数的最大值,如果高于这个数值就开始清理空闲的子进程。
- pm.max_requests = 500 static时不生效,定义一个子进程最多处理的请求数,也就是说在一个php-fpm的子进程最多可以处理这么多请求,当达到这个数值时,它会自动退出。
- rlimit_files = 1024 static时不生效