LNMP环境配置(二)
四、Nginx配置
1、默认虚拟主机
修改配置文件/usr/local/nginx/conf/nginx.conf
在最后一个}前加入:
include vhost/*.conf; //如下图所示

# mkdir /usr/local/nginx/conf/vhost
# cd /usr/local/nginx/conf/vhost/
# vim default.conf //写入以下内容:
server
{
listen 80 default_server;
server_name aaa.com;
index index.html index.htm index.php;
root /data/nginx/default;
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# mkdir -p /data/nginx/default
# echo "default_server" > /data/nginx/default/index.html
# curl -x127.0.0.1:80 aaa.com
# curl -x127.0.0.1:80 1212.com

如上图所示,访问aaa.com和访问一个没有定义过的域名,也会访问到aaa.com。
2、用户认证
创建一个新的虚拟机:
# cd /usr/local/nginx/conf/vhost/
# vim test.com.conf //写入以下内容
server
{
listen 80;
server_name test.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
location /
{
auth_basic "Auth";
auth_basic_user_file /usr/local/nginx/conf/htpasswd;
}
}
# yum install -y httpd
# htpasswd -c /usr/local/nginx/conf/htpasswd tcq
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# mkdir /data/nginx/test.com
# echo "test.com" > /data/nginx/test.com/index.html
# curl -I -x127.0.0.1:80 test.com //出现401为设置正确,如下图

在Windows的hosts文件中加入一行,如下图所示:

然后在浏览器中访问test.com,出现下图的对话框:

3、域名重定向
更改test.com.conf文件:

# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 test1.com/123.txt -I
出现下图所示情况为正确:

4、Nginx的访问日志
# grep -A2 log_format /usr/local/nginx/conf/nginx.conf //查看日志

#vi test.conf //添加下面这一行
access_log /tmp/1.log combined_realip;
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 test.com/111
# cat /tmp/1.log

出现错误:

意思是文件中没有加载PID号。
解决办法:用指定文件加载nginx配置文件。
# /usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
日志切割:
# vim /usr/local/sbin/nginx_log_rotate.sh //写入以下内容
#!/bin/bash
## 假设nginx的日志存放路径为/data/logs/
d=`date -d "-1 day" +%Y%m%d`
logdir="/data/logs"
nginx_pid="/usr/local/nginx/logs/nginx.pid"
cd $logdir
for log in `ls *.log`
do
mv $log $log-$d
done
/bin/kill -HUP `cat $nginx_pid`
写完脚本后,还需要增加任务计划:
# crontab -e //写入以下内容
0 0 * * * /bin/bash /usr/local/sbin/nginx_log_rotate.sh
5、配置静态文件不记录日志并添加过期时间
# vim test.com.conf //更改虚拟主机配置文件
server
{
listen 80;
server_name test.com test1.com test2.com;
index index.html index.htm index.php;
root /data/nginx/test.com;
if ($host != 'test.com' ) {
rewrite ^/(.*)$ http://test.com/$1 permanent;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
expires 7d;
access_log off;
}
location ~ .*\.(js|css)$
{
expires 1h;
access_log off;
}
access_log /tmp/1.log combined_realip;
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# echo "11111111" > /data/nginx/test.com/1.js
# echo "22222222" > /data/nginx/test.com/1.jpg
# touch /data/nginx/test.com/1.jss
# curl -I -x127.0.0.1:80 test.com/1.js
# curl -I -x127.0.0.1:80 test.com/1.jpg
# curl -I -x127.0.0.1:80 test.com/1.jss
# cat /tmp/1.log

如上图所示:访问了js以及jpg,但都没有记录到访问日志中,效果实现了。
6、Nginx防盗链
# vim test.com.conf //写入以下内容
location ~* ^.+\.(gif|jpg|png|swf|flv|rar|zip|doc|pdf|gz|bz2|jpeg|bmp|xls)$ //这是一行
{
expires 7d;
valid_referers none blocked server_names *.test.com;
if ($invalid_referer) {
return 403;
}
access_log off;
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 -I -e "http://aaa.com/1.txt" test.com/1.jpg
# curl -x127.0.0.1:80 -I -e "http://test.com/1.txt" test.com/1.jpg

这里可以看到过期时间为604800秒也就是7天,也可也看到防盗链的功能,没有被允许的网址aaa.com被禁止,而允许访问的test.com成功访问。
7、访问控制
# vim test.com.conf //写入以下内容
location /admin/
{
allow 192.168.200.1;
allow 127.0.0.1;
deny all;
}
# mkdir /data/nginx/test.com/admin/
# echo "123" > /data/nginx/test.com/admin/1.html
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 test.com/admin/1.html
# curl -x192.168.200.20:80 test.com/admin/1.html
我们可以看到允许的IP127.0.0.1能访问:

8、Nginx解析PHP
# vim test.com.conf //写入以下内容
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/nginx/test.com$fastcgi_script_name; //这是一行
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
9、Nginx代理
# cd /usr/local/nginx/conf/vhost
# vim proxy.conf //写入以下内容
server
{
listen 80;
server_name baidu.com;
location /
{
proxy_pass http://220.181.38.148/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 www.baidu.com -I
# curl baidu.com -I
负载均衡:
# yum install -y bind-utils //安装dig工具
# dig www.baidu.com

由上图可见有两个IP地址,这两个IP都可以访问到百度,验证一下:
# curl -x110.242.68.3:80 www.baidu.com -I
# curl -x110.242.68.4:80 www.baidu.com -I

如上图所示,有两个IP就可以走负载均衡了。
# vim /usr/local/nginx/conf/vhost/load.conf //写入以下内容
upstream baidu_com
{
ip_hash;
server 110.242.68.3;
server 110.242.68.4;
}
server
{
listen 80;
server_name www.baidu.com;
location /
{
proxy_pass http://baidu_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;
}
}
# /usr/local/nginx/sbin/nginx -t
# /usr/local/nginx/sbin/nginx -s reload
# curl -x127.0.0.1:80 www.baidu.com -I

如上图所示,现在自己的虚拟机也可也访问www.baidu.com了。
10、Nginx配置SSL
1、工作原理:

本人个人理解:
1、先是浏览器给服务器一个HTTPS请求。
2、然后服务器需要一个证书(也就是公钥和私钥),可自己制作。
3、服务器再把公钥传给客户端。
4、客户端检验是否有效,有效进行加密处理,无效显示警告。
5、加密后再传输给服务器,服务器用私匙解密,获取信息。
6、获取信息后再进行加密传给客户端。
7、客户端收到数据后再用私匙加密。
相对于HTTP协议的优点就是在传输过程中,数据都是加密的,增加了安全性。
配置过程如下:
# cd /usr/local/nginx/conf
# openssl genrsa -des3 -out tmp.key 2048
//生成key文件(私钥),输入两遍密码。
# openssl rsa -in tmp.key -out tcq.key
//把刚刚生成的tmp.key转换成tcq.key,需要输入刚才设置的密码。
# rm -f tmp.key
# openssl req -new -key tcq.key -out tcq.csr
//生成证书请求文件,我们要用key文件个这个CSR文件生成最终的公钥。
# openssl x509 -req -days 365 -in tcq.csr -signkey tcq.key -out tcq.crt
//最终生成了CRT证书文件,也就是公钥,以上操作最终的目的是生成tcq.key和tcq.crt两个文件,有这两个文件就可以配置Nginx了。
# vim /usr/local/nginx/conf/vhost/ssl.conf //写入以下内容
server
{
listen 443;
server_name tcq.com;
index index.html index.htm index.php;
root /data/nginx/tcq.com;
ssl on;
ssl_certificate tcq.crt;
ssl_certificate_key tcq.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/nginx/tcq.com$fastcgi_script_name;
}
access_log /tmp/1.log combined_realip;
}
# /usr/local/nginx/sbin/nginx -t
检测时出现错误,该错误为Nginx不支持SSL,需要再编译一遍Nginx:

# cd /usr/local/src/nginx-1.12.2
# ./configure --prefix=/usr/local/nginx/ --with-http_ssl_module
# make && make install
# /usr/local/nginx/sbin/nginx -t //无错后创建对应的目录和测试文件
# mkdir /data/nginx/tcq.com
# echo "<?php phpinfo(); ?>" > /data/nginx/tcq.com/1.php
# /etc/init.d/nginx restart
在hosts文件填入192.168.200.20 tcq.com
# setenforce 0
# systemctl stop firewalld
在浏览器上访问https://tcq.com/1.php会提示不安全,如下图所示:

提示不安全是因为该站点的SSL证书是它自己颁发的,因此不能被浏览器承认。
五、php-fpm配置
1、php-fpm的pool
# vi /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
# 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 tcq.conf
[tcq]
listen = /tmp/tcq.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
# ls /tmp/*.sock
2、慢执行日志
# 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
3、定义open_basedir
# vim /usr/local/php-fpm/etc/php-fpm.d/tcq.conf //最后一行加入
php_admin_value[open_basedir]=/data/www/:/tmp/
4、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
//第一行定义php-fpm的子进程启动模式,dynamic为动态模式;一开始只启动少量的子进程,根据实际需求,动态地增加或者减少子进程,最多不会超过pm.max_children定义的数值,另外一种模式是static,这种模式下子进程数量由pm.max_children决定,一次性启动这么多,不会减少也不会增加。
pm.start_servers 针对dynamic模式,它定义php-fpm服务在启动服务时产生的子进程数量。
pm.min_spare_servers 针对dynamic模式,它定义在空闲时段子进程数的最少数量,如果达到这个数值时,php-fpm服务就会自动派生新的子进程。
pm.max_requests 也是针对dynamic模式的,它定义在空闲时段子进程数的最大值,如果高于这个值将会开始清理空闲的子进程中最多可以处理这么多的请求,当达到这个数值时,它会自动退出。

浙公网安备 33010602011771号