LNMP功能配置-下
Nginx负载均衡
Nginx负载均衡需要用到upstream模块
upstream模块用于定义多个web server
通过算法将访问请求分发到不同的web server
配置方式:
这里以qq.com为例,先使用dig命令获取qq.com的服务器ip
[root@server-lnmp ~]> dig qq.com | grep -A3 -i 'answer section'
;; ANSWER SECTION:
qq.com. 336 IN A 58.60.9.21
qq.com. 336 IN A 180.163.26.39
qq.com. 336 IN A 59.37.96.63
然后在/usr/local/nginx/conf/vhost/目录下创建一个文件qq_com.conf,写入如下的内容
upstream qq_com ##baidu_com只是代表服务器组的名称,可以随意定义,用于proxy_pass调用
{
ip_hash; ##ip_hash算法,将同一个源ip的访问请求分发给同一个server,避免数据混乱
server 59.37.96.63:80; #定义后端的server ip:port
server 180.163.26.39:80; #定义后端的server ip:port
server 59.37.96.63:80
}
server
{
listen 80; #监听端口
server_name www.qq.com qq.com; #虚拟主机域名
location /
{
proxy_pass http://qq_com; #proxy_pass 调用upstream baidu_com
proxy_set_header Host $host; #下面的配置跟Nginx的代理一样
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
配置完检测语法,重新加载配置
测试访问效果
使用curl将www.qq.com解析到127.0.0.1
[root@server-lnmp ~]> curl -x127.0.0.1:80 www.qq.com
#得到的就是qq.com网页的源代码了。
浏览器访问效果
在Windows的hosts文件中写一条记录 10.1.1.28 www.qq.com qq.com
使用ping命令检查
C:\Users\LongGe>ping www.qq.com 正在 Ping www.baidu.com [10.1.1.28] 具有 32 字节的数据: 来自 10.1.1.28 的回复: 字节=32 时间<1ms TTL=64 #解析到的是10.1.1.28这个ip
然后使用浏览器访问www.qq.com
Nginx配置SSL
SSL工作原理
1: 浏览器发送一个https的请求给服务器;
参考:数字证书原理
Nginx配置SSL证书
自己生成SSL证书
实际工作环境都是在证书颁发机构购买SSL证书,这样的证书会自动通过浏览器的信任
我们自己生成的SSL证书是不会自动通过浏览器的信任的,浏览器会弹出相应的提示。
比如https://www.12306.cn这个网站就是自己颁发的SSL证书,不被浏览器信任的。
首先进入nginx的配置文件存放目录 /usr/local/nginx/conf
[root@server-lnmp ~]> cd /usr/local/nginx/conf/
[root@server-lnmp conf]> pwd
/usr/local/nginx/conf
然后需要用到命令openssl,如果没有这个命令,需要yum install openssl即可
[root@server-lnmp conf]> openssl genrsa -des3 -out tmp.key 2048 Generating RSA private key, 2048 bit long modulus .....................+++ ........................+++ e is 65537 (0x10001) Enter pass phrase for tmp.key: Verifying - Enter pass phrase for tmp.key:
genrsa表示生成rsa类型的私钥文件,-des3表示使用des3加密算法
-out 指定生成的私钥文件名,2048表示加密算法的长度为2048位
生成私钥文件必须输入两次密码,
但是有密码的私钥比较麻烦,下面就来取消私钥文件的密码。
[root@server-lnmp conf]> openssl rsa -in tmp.key -out server-lnmp.key Enter pass phrase for tmp.key: writing RSA key [root@server-lnmp conf]> ls -dl server-lnmp.key -rw-r--r--. 1 root root 1675 Jul 8 20:25 server-lnmp.key ##这样就得到了一个没有密码的私钥文件
生成证书请求文件,需要拿证书请求文件和没有密码私钥一起生产公钥文件
[root@server-lnmp conf]> openssl req -new -key server-lnmp.key -out server-lnmp.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN #国家名 State or Province Name (full name) []:SC #省份 Locality Name (eg, city) [Default City]:CD #城市 Organization Name (eg, company) [Default Company Ltd]:Test #组织名称 Organizational Unit Name (eg, section) []:Test #组织单位 Common Name (eg, your name or your server's hostname) []:test.com #一般填服务器的域名 Email Address []:test@test.com 邮箱 Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: #密码不填写 An optional company name []: #密码不填写
生成公钥文件
[root@server-lnmp conf]> openssl x509 -req -days 365 -in server-lnmp.csr -signkey server-lnmp.key -out server-lnmp.crt Signature ok subject=/C=CN/ST=SC/L=CD/O=Test/OU=Test/CN=Test/emailAddress=test@test.com Getting Private key # x509 代表生成的x509的证书 # -req 证书请求,用于生成证书文件 # -days 证书的有效期,365表示一年 # -in 指定证书请求文件, # -signkey 指定私钥文件 # -out 指定生成的公钥文件名
查看刚才生成的文件
[root@server-lnmp conf]> ls server-lnmp.* server-lnmp.crt server-lnmp.csr server-lnmp.key
添加nginx的SSL配置文件
在/usr/local/nginx/conf/vhost/目录下创建一个文件ssl_test.conf,写入下面的配置内容
server { listen 443; server_name test.com www.test.com; index index.html index.php; root /data/wwwroot/www.test.com; ssl on; #启用ssl功能 ssl_certificate server-lnmp.crt; #指定公钥文件 ssl_certificate_key server-lnmp.key; #指定私钥文件 ssl_protocols TLSv1 TLSv1.1 TLSv1.2; location ~ \.php$ { include fastcgi_params; fastcgi_pass 10.1.1.28:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/wwwroot/www.test.com$fastcgi_script_name; } }
如果出现错误:nginx: [emerg] unknown directive “ssl”
需要重新编译安装nginx 加上–with-http_ssl_module
[root@server-lnmp conf]> cd /usr/local/src/nginx-1.12.1 [root@server-lnmp nginx-1.12.1]> ./configure --prefix=/usr/local/nginx --with-http_ssl_module #检查错误 [root@server-lnmp nginx-1.12.1]> echo $? 0 [root@server-lnmp nginx-1.12.1]> make && make install
然后重新检测语法错误, 重载配置文件
[root@server-lnmp nginx-1.12.1]> nginx -t nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [root@server-lnmp nginx-1.12.1]> nginx -s reload
查看443端口是否监听
[root@server-lnmp vhost]> netstat -lntp | grep 443 tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN 1330/nginx: master
测试访问
curl 访问本地的https需要添加hosts
echo '127.0.0.1 www.test.com test.com' >> /etc/hosts
curl测试访问
## 如果直接访问会提示证书不被信任。 [root@server-lnmp vhost]> curl https://test.com curl: (60) Peer's certificate issuer has been marked as not trusted by the user. More details here: http://curl.haxx.se/docs/sslcerts.html (省略...) #使用 -k 选项忽略证书检查就可以访问了 [root@server-lnmp vhost]> curl -k https://test.com <h1>This is test page</h1>
浏览器访问
同样需要修改hosts 将test.com和www.test.com 解析到nginx服务器的ip上 我这里是 10.1.1.28
然后用浏览器访问https://www.test.com
这里会出现一个安全提示
然后点高级 > 继续访问就可以正常访问网页了
php-fpm的pool
php-fpm也可以配置类似nginx虚拟主机的pool
可以将每个pool做成一个单独的配置文件
PHP进程管理
pm = dynamic
#使用动态进程管理 ,也可以改为static使用静态进程管理
#当 pm = static时,使用静态线程管理,只有pm.max_children会生效,其他 pm参数都无效
pm.max_children = 50
#这个pool的最大线程数
pm.start_servers = 3
#初始的线程数
pm.min_spare_servers = 3
#最小空闲线程数,如果线程低于这个数值,会自动新建线程
pm.max_spare_servers = 35
#最大空闲线程数,如果空闲的线程大于这个数值,会自动清理
pm.max_requests = 500
#每个线程最大出来的请求数
rlimit_files = 1024
#使用文件描述符数量,
#系统每打开一个文件就会消耗一个文件描述符
#当文件描述符消耗完了就会报错
文件描述符参考:最大文件描述符详解
配置方式
在/usr/local/php-fpm/etc/php-fpm.conf 配置文件的 [global] 部分添加一行配置
并删除[www]部分的内容
/usr/local/php-fpm/etc/php-fpm.conf 文件修改后的内容如下
[root@server-lnmp ~]> vim /usr/local/php-fpm/etc/php-fpm.conf [root@server-lnmp ~]> cat /usr/local/php-fpm/etc/php-fpm.conf [global] pid = /usr/local/php-fpm/var/run/php-fpm.pid error_log = /usr/local/php-fpm/var/log/php-fpm.log include etc/php-fpm.d/*.conf
创建pool配置文件存放目录
[root@server-lnmp ~]> mkdir /usr/local/php-fpm/etc/php-fpm.d
在pool配置文件存放目录创建pool配置文件 www.conf 并写入以下内容
[www] #pool名称可以随意定义 listen = /tmp/www.sock #指定这个pool监听的socket文件或者ip:port listen.mode=666 #监听sock文件时,sock文件的权限 user = php-fpm #进程用户 group = php-fpm #进程用户组 pm = dynamic pm.max_children = 50 pm.start_servers = 3 pm.min_spare_servers = 3 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024
再将www.conf文件复制一份命名为test.conf
然后修改内容如下
[test] listen = 10.1.1.28:9000 listen.mode=666 user = php-fpm group = php-fpm pm = static pm.max_children = 5 pm.start_servers = 5 pm.min_spare_servers = 1 pm.max_spare_servers = 35 pm.max_requests = 500 rlimit_files = 1024
检查php-fpm配置语法错误。重载配置文件
[root@server-lnmp ~]> /usr/local/php-fpm/sbin/php-fpm -t [08-Jul-2018 22:24:42] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful [root@server-lnmp ~]> /etc/init.d/php-fpm reload Reload service php-fpm done
检查php-fpm进程
[root@server-lnmp ~]> ps -ef | grep php
root 1521 1 0 22:27 ? 00:00:00 php-fpm: master process (/usr/local/php-fpm/etc/php-fpm.conf)
php-fpm 1522 1521 0 22:27 ? 00:00:00 php-fpm: pool test
php-fpm 1523 1521 0 22:27 ? 00:00:00 php-fpm: pool test
php-fpm 1524 1521 0 22:27 ? 00:00:00 php-fpm: pool test
php-fpm 1525 1521 0 22:27 ? 00:00:00 php-fpm: pool test
php-fpm 1526 1521 0 22:27 ? 00:00:00 php-fpm: pool test
php-fpm 1527 1521 0 22:27 ? 00:00:00 php-fpm: pool www
php-fpm 1528 1521 0 22:27 ? 00:00:00 php-fpm: pool www
php-fpm 1529 1521 0 22:27 ? 00:00:00 php-fpm: pool www
root 1531 1277 0 22:27 pts/0 00:00:00 grep --color=auto php
##最后一列可以看到pool的名称, test5个线程 www3个线程
php-fpm慢执行日志
当有时候访问php网页慢的时候
可以开启慢执行日志来查看是否是PHP代码执行时间过长,
还可以看到具体是哪个PHP文件的哪一行导致的慢执行
配置方式
vim /usr/local/php-fpm/etc/php-fpm.d/test.conf 加入如下内容
request_slowlog_timeout = 2 #当执行时间超过指定的时间(单位:秒),记录慢执行日志 slowlog = /usr/local/php-fpm/var/log/test-slow.log #指定慢执行日志文件路径
配置nginx的虚拟主机test.com.conf,把unix:/tmp/php-fcgi.sock改为10.1.1.28:9000
[root@server-lnmp ~]> grep 'fastcgi_pass' /usr/local/nginx/conf/vhost/test.com.conf fastcgi_pass 10.1.1.28:9000;
重新加载nginx配置
在/data/wwwroot/www.test.com/目录下创建一个测试文件pool.php
[root@server-lnmp ~]> vim /data/wwwroot/www.test.com/pool.php [root@server-lnmp ~]> cat !$ cat /data/wwwroot/www.test.com/pool.php <?php echo 'test slow log'; sleep(3); echo 'done'; ?> ##php的sleep()函数可以让程序睡眠指定的秒数,用于模拟PHP执行慢的情况。
测试效果
使用curl测试访问www.test.com/pool.php
[root@server-lnmp ~]> curl -x127.0.0.1:80 www.test.com/pool.php test slow logdone
查看慢执行日志
[root@server-lnmp ~]> cat /usr/local/php-fpm/var/log/test-slow.log [08-Jul-2018 23:05:13] [pool test] pid 1571 script_filename = /data/wwwroot/www.test.com/pool.php [0x00007f07966e3288] sleep() /data/wwwroot/www.test.com/pool.php:3 #错误日志可以看到,发生慢执行的时间 pool名,pid #php文件路径, #具体哪一行代码产生的慢执行
php-fpm的open_basedir
设定open_basedir可以使PHP只能访问指定目录下的文件
可以在虚拟主机配置中配置open_basedir
也可以在php的pool池中配置open_basedir
配置方式
修改/usr/local/php-fpm/etc/php-fpm.d/test.conf 配置文件
添加open_basedir的配置
cd /usr/local/php-fpm/etc/php-fpm.d/ echo "php_admin_value[open_basedir]=/data/wwwroot/www.test1com:/tmp/" >> test.conf #php_admin_value[open_basedir] 这个参数就是定义open_basedir ##/data/wwwroot/www.test1com:/tmp/" 这个地址现在是错误的
修改/usr/local/php-fpm/etc/php.ini
将error_reporting的参数修改为E_ALL,修改error_log日志文件路径
#查看修改后的error_report参数 [root@server-lnmp etc]> grep '^error_reporting = ' php.ini error_reporting = E_ALL #查看error_log路径 [root@server-lnmp etc]> grep '^error_log = ' php.ini error_log = /usr/local/php-fpm/var/log/php_errors.log #手动生成日志文件,并修改权限 [root@server-lnmp etc]> touch /usr/local/php-fpm/var/log/php_errors.log [root@server-lnmp etc]> chmod 777 /usr/local/php-fpm/var/log/php_errors.log
重启php-fpm服务
[root@server-lnmp php-fpm.d]> /usr/local/php-fpm/sbin/php-fpm -t [08-Jul-2018 23:48:02] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful [root@server-lnmp php-fpm.d]> /etc/init.d/php-fpm reload Reload service php-fpm done
测试效果
curl测试访问www.test.com/test.php,出现错误 :
[root@server-lnmp php-fpm.d]> curl -x127.0.0.1:80 www.test.com/test.php No input file specified. [root@server-lnmp php-fpm.d]> curl -x127.0.0.1:80 www.test.com/test.php -I HTTP/1.1 404 Not Found Server: nginx/1.12.1 Date: Sun, 08 Jul 2018 15:51:42 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.30
查看php错误日志
[root@server-lnmp etc]> cat /usr/local/php-fpm/var/log/php_errors.log [08-Jul-2018 15:58:50 UTC] PHP Warning: Unknown: open_basedir restriction in effect. File(/data/wwwroot/www.test.com/test.php) is not within the allowed path(s): (/data/wwwroot/www.test1com:/tmp/) in Unknown on line 0 [08-Jul-2018 15:58:50 UTC] PHP Warning: Unknown: failed to open stream: Operation not permitted in Unknown on line 0
再修改/usr/local/php-fpm/etc/php-fpm.d/test.conf 配置文件
将open_basedir修改为正确的路径
[root@server-lnmp etc]> vim php-fpm.d/test.conf [root@server-lnmp etc]> tail -1 php-fpm.d/test.conf php_admin_value[open_basedir]=/data/wwwroot/www.test.com:/tmp/
重载php-fpm服务配置在再次访问测试页www.test.com/test.php
[root@server-lnmp etc]> curl -x127.0.0.1:80 www.test.com/test.php -I HTTP/1.1 200 OK Server: nginx/1.12.1 Date: Sun, 08 Jul 2018 16:04:11 GMT Content-Type: text/html; charset=UTF-8 Connection: keep-alive X-Powered-By: PHP/5.6.30 [root@server-lnmp etc]> curl -x127.0.0.1:80 www.test.com/test.php PHP test page
扩展
针对请求的uri来代理
根据访问的目录来区分后端的web
nginx长连接
nginx算法分析
nginx中的root和alias区别
nginx的alias和root配置
这个更详细