Nginx
Nginx 是高性能的 HTTP 和反向代理的服务器,处理高并发能力是十分强大的,能经受高负载的考验。Nginx就是在tomcat之前加了一成东西,通过这个东西我们可以控制对tomcat的访问
安装mysql
与lamp安装mysql的步骤大体相同
先解压软件包 移动 创建mysql用户 创建datadir用来放数据库文件 更改权限
# tar -zxvf mysql-5.6.43-linux-glibc2.12-x86_64.tar.gz
# mv mysql-5.6.43-linux-glibc2.12-x86_64 /usr/local/mysql
# cd /usr/local/mysql/
# useradd -s /sbin/nologin mysql
# mkdir -p /data/mysql
# chown -R mysql:mysql /data/mysql/
使/data/mysql目录的用户名和组名都改为mysql并分配所有权限
#yum install –y perl-Module-Install
# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql/’’
在MySQL数据库程序的保存目录scripts内找到一个名为mysql_install_db的脚本程序,执行这个脚本程序并使用–user参数指定MySQL服务的对应账号名称(在前面步骤已经创建),使用–basedir参数指定MySQL服务程序的保存目录,使用–datadir参数指定MySQL真实数据库的文件保存目录,这样即可生成系统数据库文件,也会生成出新的MySQL服务配置文件。
执行脚本程序并使用-user以mysql用户运行 使用-datadir指定mysql真实数据库的文件保存目录为/data/mysql
#echo $?
0
# cp support-files/my-default.cnf /etc/my.cnf
# cp support-files/mysql.server /etc/init.d/mysqld
把程序目录中的开机程序文件复制到/etc/init.d目录中,以便通过service命令来管理MySQL数据库服务程序。
# chmod 755 /etc/init.d/mysqld
# vi /etc/init.d/mysqld
datadir = /data/mysql
# chkconfig --add mysqld 把mysqld服务加入到系统服务列表中
# chkconfig mysqld on 开机自启
[root@localhost php-5.6.30]# service mysqld start 启动服务
Starting MySQL SUCCESS!
[root@localhost src]# netstat -ntpl |grep mysqld
tcp6 0 0 :::3306 :::* LISTEN 2987/mysqld
mysql启动成功
二.安装PHP
在lnmp中 php以一个服务php-fpm形式出现 独立存在于linux系统 方便管理
解压软件包 创建用户 用来运行php-fpm服务 安装需要的软件包
# tar -zxvf php-5.6.30.tar.gz
# useradd -s /sbin/nologin php-fpm
#yum install -y openssl openssl-devel freetype freetype-devel libxml2-devel libpng libpng-devel libjpeg libjpeg-devel libcurl-devel gcc gcc-c++
#yum install -y epel-release
#yum install -y libmcrypt-devel
# cd php-5.6.30
# ./configure --prefix=/usr/local/php-fpm --with-config-file-path=/usr/local/php-fpm/etc --enable-fpm --with-fpm-user=php-fpm --with-fpm-group=php-fpm --with-mysql=/usr/local/mysql/ --with-mysql-sock=/tmp/mysql.sock --with-libxml-dir --with-gd --with-jpeg-dir --with-png-dir --with-freetype-dir --with-iconv-dir --with-zlib-dir --with-mcrypt --enable-soap --enable-gd-native-ttf --enable-ftp --enable-mbstring --enable-exif --disable-ipv6 --with-pear --with-curl --with-openssl
编译php服务源码包时,除了定义要安装到的目录以外,还需要依次定义配置php服务程序配置文件的保存目录、mysql数据库服务程序所在目录、mysql数据库服务程序配置文件所在目录,以及libpng、jpeg、freetype、zlib等服务程序的安装目录路径,并通过参数启动php服务程序的诸多默认功能
make && make install 编译并安装php
# echo $?
0
cp php.ini-production /usr/local/php-fpm/etc/php.ini
将php服务程序目录中相应的配置文件复制过来
vi /usr/local/php-fpm/etc/php-fpm.conf
php-fpm.conf是php服务程序重要的配置文件之一,编辑pid文件保存目录,错误日志
[root@localhost php-5.6.30]# /usr/local/php-fpm/sbin/php-fpm -t
[10-Dec-2020 10:17:27] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
配置妥当后便可把用于管理php服务的脚本文件复制到/etc/init.d中.为了能够执行脚本,把脚本赋予755权限。
# cp /usr/local/src/php-5.6.30/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
# chmod 755 /etc/init.d/php-fpm
启动php-fpm
# service php-fpm start
最后把php-fpm服务程序加入到开机启动项中
#chkconfig php-fpm on
# ps aux |grep php-fpm
安装nginx
#tar –zxvf nginx-1.12.2.tar.gz
cd nginx-1.12.2
./configure --prefix=/usr/local/nginx
make && make install
# vi /etc/init.d/nginx 添加如下内容
#!/bin/bash
#chkconfig: - 30 21
#description: http service
#Source Function Library
. /etc/init.d/functions
#Nginx Settings
NGINX_SBIN="/usr/local/nginx/sbin/nginx"
NGINX_CONF="/usr/local/nginx/conf/nginx.conf"
NGINX_PID="/usr/local/nginx/logs/nginx.pid"
RETVAL=0
prog="Nginx"
start()
{
echo -n $"Starting $prog: "
mkdir -p /dev/shm/nginx_temp
daemon $NGINX_SBIN -c $NGINX_CONF
RETVAL=$?
echo
return $RETVAL
}
stop()
{
echo -n $"Stopping $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -TERM
rm -rf /dev/shm/nginx_temp
RETAVL=$?
echo
return $RETVAL
}
reload()
{
echo -n $"Reloading $prog: "
killproc -p $NGINX_PID $NGINX_SBIN -HUP
RETVAL=$?
echo
return $RETVAL
}
restart()
{
stop
start
}
configtest()
{
$NGINX_SBIN -c $NGINX_CONF -t
return 0
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
configtest)
configtest
;;
*)
echo $"Usage: $0 {start|stop|reload|restart|configtest}"
RETVAL=1
esac
exit $RETVAL
赋予权限以便以后执行
# chmod 755 /etc/init.d/nginx
#chkconfig --add nginx
#chkconfig nginx on
清空原来的配置文件
#> /usr/local/nginx/conf/nginx.conf
#vi /usr/local/nginx/conf/nginx.conf 添加如下内容
[root@localhost nginx-1.12.2]# /usr/local/nginx/sbin/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@localhost nginx-1.12.2]# service nginx start 启动服务
Starting nginx (via systemctl): Warning: nginx.service changed on disk. Run 'systemctl daemon-reload' to reload units. 此次报错运行systemctl daemon-reload 即可
[ OK ]
[root@localhost nginx-1.12.2]# systemctl daemon-reload
[root@localhost nginx-1.12.2]# service nginx start
Starting nginx (via systemctl): [ OK ] 启动成功
# ps aux |grep nginx
测试解析php
#vi / usr/local/nginx/html/1.php
<?php
echo "test php scripts.";
?>
# curl localhost/1.php
成功解析php
默认虚拟主机
#vi /usr/local/nginx/conf/nginx.conf 添加如下内容
include vhost/*.conf;
/usr/local/nginx/conf/vhost下所有以.conf结尾的文件都会加载 我们就可以把所有虚拟主机配置文件放到vhost目录下了
#mkdir /usr/local/nginx/conf/vhost
#cd /usr/local/nginx/conf/vhost/
# vi 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
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
# /usr/local/nginx/sbin/nginx -s reload
#echo "default_server" > /data/nginx/default/index.html
创建索引页
用户认证
创建新的虚拟主机
#vi 1111.com.conf 编辑如下内容
server
{
listen 80;
server_name 1111.com;
index index.html index.htm index.php;
root /data/nginx/1111.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 sym 创建用户并设置密码
#/usr/local/nginx/sbin/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
# /usr/local/nginx/sbin/nginx -s reload
创建目录并写入内容
#mkdir /data/nginx/1111.com
# echo "111111.com" > /data/nginx/1111.com/index.html
#curl –I –x127.0.0.1 1111.com
状态码为401说明网站需要验证
进入浏览器输入1111.com发现需要用户名和密码
域名重定向
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
server_name后可以跟多个域名 permanent为永久重定向
if ($host != '1111.com') {
rewrite ^/(.*)$ http://1111.com/$1 permanent;
}
重新启动服务
#/usr/local/nginx/sbin/nginx –t
#/usr/local/nginx/sbin/nginx –s reload
#curl –x127.0.0.1:80 www.1111.com/1.html
HTTP/1.1 301 Moved Permanently
Server: nginx/1.12.2
Date: Fri, 11 Dec 2020 10:15:19 GMT
Content-Type: text/html
Content-Length: 185
Connection: keep-alive
Location: http://1111.com/1.html
状态码为301 且最后一行告诉原域名为1111.com
nginx的访问日志
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
access_log /tmp/1.log combined_realip;
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 1111.com/1456
查看日志
cat /tmp/1.log
可以看到我们之前做的域名跳转和刚才的404
配置静态文件不记录日志并添加过期时间
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
//location ~可以指定对应的静态文件
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
{
//expires为过期时间
expires 7d;
//access_log off 可以不记录访问日志
access_log off;
}
location ~ .*\.(js|css)$
{
expires 12h;
access_log off;
}
#/usr/local/nginx/sbin/nginx –t
#/usr/local/nginx/sbin/nginx –s reload
echo "1111111111" > /data/nginx/1111.com/1.js
echo "2222222222" > /data/nginx/1111.com/2.jpg
touch /data/nginx/1111.com/1.jss
分别curl 1111.com/1.js 1111.com/2.jpg 1111.com/1.jss
查看日志
cat /tmp/1.log
.jpg和.js都没有记录在日志中
防盗链
#vi /usr/local/nginx/conf/vhost/1111.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 *.1111.com;
If ($invalid_referer){
return 403;
}
access_log off;
}
#/usr/local/nginx/sbin/nginx –t
#/usr/local/nginx/sbin/nginx –s reload
有防盗链的 显示403 禁止访问
没有防盗链的 则正常显示200
访问控制
使访问admin目录的请求只允许192.168.200.10访问
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
location /admin/
{
allow 192.168.200.10; //允许192.168.200.10访问
deny all; //拒绝其他ip访问
}
#/usr/local/nginx/sbin/nginx –t
#/usr/local/nginx/sbin/nginx –s reload
#mkdir /data/nginx/1111.com/admin
# echo "123" > /data/nginx/1111.com/admin/1.html
可以通过192.168.200.10正常访问admin下的文件 其他的则403禁止访问
只拒绝少数ip
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
location /admin/
{
deny 192.168.200.10; //拒绝192.168.200.10访问
}
#/usr/local/nginx/sbin/nginx –t
#/usr/local/nginx/sbin/nginx –s reload
结果显而易见
黑名单
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
//禁止访问admin目录或upload目录下的html文件
location ~ .*(admin|upload)/.*\.html$
{
deny all;
}
#/usr/local/nginx/sbin/nginx –t
#/usr/local/nginx/sbin/nginx –s reload
状态码403禁止访问
两个ip都无法访问admin目录下的1.html文件
nginx解析php
在lnmp中php是以一个服务的形式存在的 即:php-fpm 首先要启动php-fpm服务 然后nginx再和php-fpm通信 也就是说通过php-fpm完成php脚本解析 nginx只作为用来传输的工具
#vi /usr/local/nginx/conf/vhost/1111.com.conf 添加如下内容
location ~ \.php$
{
include fastcgi_params;
fastcgi_pass unix:/tmp/php-fcgi.sock; //指定php-fpm地址
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /data/nginx/1111.com$fastcgi_script_name;
}
vi /data/nginx/1111.com/1.php
<?php phpinfo(); ?>
成功解析
nginx的ssl
https通信过程需要一套数字证书 通过客户端验证通过才可以继续访问网页 证书可以自己制作 也可以向组织申请这套证书就是一对公钥和私钥 也就是我们接下来要做的ssl证书
#cd /usr/local/nginx/conf
这一步生成key文件就是私钥
这一步是把tmp.key转换成sym.key 目的是展出刚才设置的密码
# rm -f tmp.key
这一步是生成证书请求文件 但并不是公钥 我们要用key文件和这个csr文件一起生成最终的公钥文件 其中Common Name为后面配置nginx配置文件的server_name
成功生成了CRT证书
# vi /usr/local/nginx/conf/vhost/ssl.conf //添加如下内容
server
{
listen 443;
server_name sanym.com;
index index.html index.php;
root /data/nginx/sanym.com;
ssl on;
ssl_certificate sym.crt;
ssl_certificate_key sym.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/sanym.com$fastcgi_script_name;
}
access_log /tmp/1.log combined_realip;
}
检查配置是否有问题
发现当前nginx并不支持ssl 重新编译一下
# cd /usr/local/src/nginx-1.12.2
# ./configure --prefix=/usr/local/nginx/ --with-http-ssl-module
#make && make install
编译完成后再次检验
#mkdir /data/nginx/sanym.com
# echo "<?php phpinfo(); ?>" > /data/nginx/sanym.com/1.php
#/etc/init.d/nginx restart
在浏览器输入http://sanym.com/1.php会提示不安全
因为我们自己做的证书没有得到浏览器的认可
php-fpm配置
之前说过nginx中php作为独立服务 那么它必然有自己的配置文件 php-fpm的配置文件为/usr/local/php-fpm/etc/php-fpm.conf 它同样支持include语句
php-fpm的pool
#vi /usr/local/php-fpm/etc/php-fpm.conf 填入如下内容
include = etc/php-fpm.d/*.conf
创建配置文件目录和子配置文件
#mkdir /usr/local/php-fpm/etc/php-fpm.d
# cd /usr/local/php-fpm/etc/php-fpm.d/
# vi 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
# vi sanym.conf
[sanym]
listen = /tmp/sanym.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
这样就有了两个子配置文件 也就是有了两个pool 第一个pool监听/tmp/www.sock 第二个pool监听/tmp/sanym.sock 这样就可以在nginx不用的虚拟主机中调用不同的pool 从而达到相互隔离的目的 两个pool互不影响
验证一下配置是否有问题 并重启php-fpm服务
[root@localhost vhost]# /usr/local/php-fpm/sbin/php-fpm -t
[11-Dec-2020 05:46:38] NOTICE: configuration file /usr/local/php-fpm/etc/php-fpm.conf test is successful
[root@localhost vhost]# /etc/init.d/php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
查看/tmp目录下的sock文件
[root@localhost vhost]# ls /tmp/*.sock
/tmp/mysql.sock /tmp/php-fcgi.sock /tmp/sanym.sock
出现了我们前面建的两个sock文件