一、web服务之LNMP环境
1.1 LNMP工作原理
Nginx作为一款轻量级的web服务器,在LNMP架构的环境中是通过php-fpm这个服务来处理php文件的。而交于LNMP环境的另一种web架构—LAMP则是apache通过libphp5.so模块处理php文件。
LNMP访问流程示意图
Nginx和php-fpm是各自独立运行,所以在运行过程中,Nginx和php-fpm都需要分别启动
修改Nginx配置文件,启动Nginx服务,修改php配置文件需要启动php-fpm服务。
Apache的libphp5.so随着apache服务器一起启动。
1.3 LNMP环境搭建
环境介绍:
角色 主机名 IP地址 系统 版本号 日期
LNMP Node1.cn 10.10.125.1/24 RHEL6.5x86_64
Nginx官网:http://nginx.org
所需软件包:
MySQL=http://dev.mysql.com/downloads/mysql/ mysql主程序包
PHP=http://php.net/downloads.php php主程序包
Nginx= https://nginx.org/download/nginx-1.13.7.tar.gz
Nginx主程序包
libmcrypt=http://mcrypt.hellug.gr/index.html libmcrypt加密算法扩展库,支持3DES等加密
相关下载链接:
Nginx:wget https://nginx.org/download/nginx-1.13.7.tar.gz
MySQL:wget https://cdn.mysql.com//Downloads/MySQL-5.7/mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
Php:wget http://cn2.php.net/distributions/php-7.2.0.tar.bz2
Script:wget ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.41.tar.gz
Libmcrypt:wget https://jaist.dl.sourceforge.net/project/mcrypt/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz --no-check-certificate
源码编译安装LNMP
编译安装nginx:
在编译安装之前需要安装系统所以来的一些开发工具类文件例如:gcc,gcc-c++等
解决依赖:
Nginx安装
yum install gcc gcc-c++ autoconf automake -y
[root@node1 src]# yum -y install gcc gcc-c++ autoconf automake zlib zlib-devel openssl openssl-devel
[root@node1 nginx-1.13.7]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/pcre-8.42/ --sbin-path=/usr/sbin/
[root@node1 nginx-1.13.7]# make
[root@node1 nginx-1.13.7]# make install
修改配置文件使支持php
[root@node1 named]# vim /usr/local/nginx/conf/nginx.conf
location ~ .php$ {
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_n
ame;
include fastcgi_params;
}
MySQL安装:
yum install -y cmake ncurses-devel
[root@node1 src]# tar zxf mysql-5.7.20-linux-glibc2.12-x86_64.tar.gz
[root@node1 src]# cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_UNIX_ADDR=/tmp/mysql.sock -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DENABLED_LOCAL_INFILE=1 -DMYSQL_DATADIR=/usr/local/mysql/data -DMYSQL_USER=mysql
make && make install
chown -R mysql:mysql /usr/local/mysql
/usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data
mv /etc/my.cnf /etc/my.cnf.bak
cp /usr/local/mysql/support-files/my-default.cnf /etc/my.cnf
sed -i '/^[mysqld]/adatadir = /usr/local/mysql/data' /etc/my.cnf
sed -i '/^[mysqld]/abasedir = /usr/local/mysql' /etc/my.cnf
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod +x /etc/init.d/mysqld
echo "PATH=/usr/local/mysql/bin:$PATH" >> /etc/profile
service mysqld restart
source /etc/profile
echo "source /etc/profile" >> /etc/rc.local
启动mysql服务
service mysqld restart
PHP安装:
在Nginx中,我们使用的是php-fpm来对php页面解析,PHP-FPM其实是PHP源代码的一个补丁,指在将FastCGI进程管理整合进PHP包中。必须将它patch到你的PHP源代码中,再编译安装PHP后才可以使用
从PHP5.3.3开始,PHP中直接整合了PHP-FPM,所以从PHP5.3.3版本以后,不需要下载PHP-FPM补丁包了,下面是PHP-FPM官方发出来的通知:
http://php-fpm.org/download
PHP添加libmcrypt拓展
libmcrypt加密算法扩展库,支持DES, 3DES, RIJNDAEL, Twofish, IDEA, GOST, CAST-256, ARCFOUR, SERPENT, SAFER+等算法
官方网站:http://mcrypt.hellug.gr/index.html 或者 http://mcrypt.sourceforge.net/
在页面上点击下图连接,可以下载最新的2.5.8版本(页面上有个Browse All Files→→Libmcrypt)
[root@Node1 ~]# tar xvf libmcrypt-2.5.8.tar.bz2 -C /usr/local/src/ ; cd /usr/local/src/libmcrypt-2.5.8/
[root@Node1 libmcrypt-2.5.8]# ./configure --prefix=/usr/local/libmcrypt ; make ; make install ; cd
需要添加到库文件路径,由于系统默认规定只在/lib、/lib64、/lib/lib64下面找库文件,所以我们需要手动添加进去。
[root@Node1 ~]# vim /etc/ld.so.conf
include ld.so.conf.d/.conf #此行原有
/usr/local/libmcrypt/lib #此行添加
解决依赖:
[root@Node1 ~]# yum install php-pear
[root@Node1 ~]# vim /etc/ld.so.conf
include ld.so.conf.d/.conf #此行原有
/usr/local/libmcrypt/lib #此行在libmcrypt已添加
/usr/local/mysql/lib #此行添加
[root@Node1 ~]# ldconfig
[root@Node1 ~]# echo 'ldconfig' >> /etc/rc.local
除开上面的依赖解决之外,还需要安装图片,xml,字体支持基本库,使用yum去安装,安装的时候,这些软件包自
身也有依赖!
[root@Node1 ~]# yum install -y libxml2-devel libcurl-devel libjpeg-devel libpng-devel freetype freetype-devel
编译安装php
[root@Node1 ~]# tar xvf php-5.6.13.tar.bz2 -C /usr/local/src/ ; cd /usr/local/src/php-5.6.13
[root@Node1 php-5.6.13]# ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --with-mysql=/usr/local/mysql --with-mysqli=/usr/local/mysql/bin/mysql_config --with-iconv-dir --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-sysvsem --enable-inline-optimization --with-curl --enable-mbregex --enable-fpm --enable-mbstring --with-gd --enable-gd-native-ttf --with-openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-zip --enable-soap --with-mcrypt=/usr/local/libmcrypt --with-gettext
[root@Node1 php-5.6.13]# make -j 4 ; make install ; cd
配置php和php-fpm
PHP配置文件:
[root@Node1 ~]# cp /usr/local/src/php-5.6.13/php.ini-production /usr/local/php/php.ini
PHP-FPM配置文件:
[root@Node1 ~]# cp /usr/local/php/etc/php-fpm.conf.default /usr/local/php/etc/php-fpm.conf
[root@Node1 ~]# cp /usr/local/php/etc/php-fpm.d/www.conf.default /usr/local/php/etc/php-fpm.d/www.conf
PHP-FPM启动脚本
[root@Node1 ~]# cp /usr/local/src/php-5.6.13/sapi/fpm/init.d.php-fpm /etc/init.d/php-fpm
[root@Node1 ~]# chmod +x /etc/init.d/php-fpm
[root@Node1 ~]# chkconfig php-fpm on
[root@Node1 ~]# /etc/init.d/php-fpm start
检测PHP-FPM启动成功与否
[root@Node1 ~]# netstat -antup | grep php-fpm
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 122801/php-fpm
为PHP拓展外挂模块
Phpize,./configure make make install 最后添加到php配置文件,重启php-fpm
测试LNMP的PHP支持
echo "" > /usr/local/nginx/html/index.php
浏览器访问<主机IP>
1.4 升级LNMP
如果之前已经安装过老版本的nginx,需要将nginx升级到最新版,首先要做的就是检查老版本nginx的编译相关的configure的信息,查看方法如下:
[root@node1 src]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.8.0
configure arguments: --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.37
下载新版本
[root@node1 nginx-1.13.7]# wget https://nginx.org/download/nginx-1.13.7.tar.gz
[root@node1 nginx-1.13.7]# cp -ap /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak
编译安装:
[root@node1 nginx-1.13.7]# ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module --with-http_flv_module --with-http_mp4_module --with-pcre=/usr/local/src/pcre-8.37
[root@node1 nginx-1.13.7]# make
[root@node1 nginx-1.13.7]# make install
验证:
[root@node1 nginx-1.13.7]# /usr/local/nginx/sbin/nginx -t
[root@node1 nginx-1.13.7]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.13.7
升级完成:
二、nginx配置文件详解
2.1 nginx配置文件之全局配置
2.2 nginx配置文件之局部配置
2.3 nginx配置文件之创建多个虚拟主机
虚拟主机,也叫“网站空间”,就是把一台运行在互联网上的物理服务器划分成多个“虚拟”服务器。虚拟主机技术极大的促进了网络技术的应用和普及。同时虚拟主机的租用服务也成了网络时代的一种新型经济形式。
Nginx虚拟主机的配置,是通过nginx.conf中的server节点进行定义的,想要设置多个虚拟主机nginx提供了基于IP地址,基于端口号和基于域名的三种设置方式。只需要在http{ …… } 区域里进行server节点进行配置即可,以下将介绍如何通过这三中方式进行虚拟主机的设置。
虚拟主机配置语法格式:
server {
listen
server_name example.org www.example.org; #虚拟主机名[IP地址]
root html; #虚拟主机更目录
location / {
index index.html index.htm #默认访问页面
}
error_page 500 501 502 503 50x.html;
}
通用配置:
listen 80;监听的时80端口
root html;定义虚拟主机根目录
index index.html index.htm; 默认访问文件为index.html
error_page 500 501 502 503 50x.html; 错误代码返回内容
配置案例:
2.3.1 基于不同IP地址的虚拟主机
IP地址 主机目录 测试文件内容(index.html)
10.10.125.1 /usr/local/nginx/html/test1 xiaoxiong
10.10.125.2 /usr/local/nginx/html/test2
10.10.125.3 /usr/local/nginx/html/test3 10.10.125.3
http {
……
server {
listen 10.10.125.1:80;
root /usr/local/nginx/html/test/;
location / {
index index.html index.htm index.php;
}
error_page 500 501 502 503 50x.html;
}
……
}
写入测试文件并进行验证
[root@node1 test]# curl -l http://10.10.125.1
Xiaoxiong
[root@node1 test]# curl -l http://10.10.125.3
Xiaoxiong103
2.3.2 基于不同端口的虚拟主机
配置案例:
IP:端口号 主机目录 测试文件内容(index.html)
10.10.125.1:80 /usr/local/nginx/html/test1 xiaoxiong
10.10.125.1:8000 /usr/local/nginx/html/test2
10.10.125.1:8080 /usr/local/nginx/html/test3 10.10.125.3:8080
配置内容:
server {
listen 8080;
root /usr/local/nginx/html/test3/;
location / {
index index.html index.htm index.php;
}
error_page 500 501 502 503 50x.html;
}
验证:
[root@node1 html]# curl -l http://10.10.125.1:8080
10.10.125.1:8080
2.3.3 基于域名创建虚拟主机
nginx的虚拟主机命名有4种格式:
1) 精确的名字,例如oa.lego.cc
2) 号开头的,例如.lego.cc
3) 号结尾的,例如 oa.lego.
4) 正则表达式形式,例如:server_name ~^www\d+.oa.cc$
注意:在使用正则表达式的时候必须以“~”波浪号开头
server_name可以指定多个。而这些命名方式的优先级顺序如下:1>2>3>4
应用实例:
虚拟主机名 主机目录 测试文件内容(index.html)
oa.lego.cc /usr/local/nginx/html/oa xiaoxiong
vip.lego.cc /usr/local/nginx/html/roomis index.html
Zabbix.lego.cc /usr/local/nginx/html/zabbix index.php
配置内容:
server {
listen 80;
root /usr/local/nginx/html/roomis/;
server_name roomis.lego.cc;
location / {
index index.html;
}
error_page 500 501 502 503 50x.html;
location = /50x.html {
root html;
}
}
验证:
[root@node1 html]# curl -l roomis.lego.cc
roomis.lego.cc
能正常获取页面内容,配置正常
三、nginx的访问控制
nginx的访问控制权限可以选择基于用户名的访问控制和基于IP的限制,依次来控制相关用于主机对web服务的访问,以及HTTP基本认证还可以与其他访问限制方法结合使用
相关工具:
指令:/usr/bin/htpasswd
httpd-tools-2.2.15-29.el6_4.x86_64
3.1 基于用户的访问
创建基于用户名-密码访问的权限,需要创建密码文件,密码文件创建应用串号层序htpasswd。如果系统没有该指令可以使用yum -y install httpd-tools进行安装
第一次创建用户需要使用-c选项,创建管理员admin1
[root@node1 ~]# htpasswd -c /usr/local/nginx/users/.htpasswd admin1
New password: 123456
Re-type new password:123456
根据提示输入两次密码。
然后以相同方式创建其他用户admin2,……
[root@node1 ~]# htpasswd /usr/local/nginx/users/.htpasswd admin2
查看用户-密码对文件,此文件包含登录用户和密码:
[root@node1 ~]# cat /usr/local/nginx/users/.htpasswd
admin1:i/VCCYr.lD6rI
admin2:/6OBWKy4jt.M2
配置nginx进行http基本认证
指定要保护的位置(http,server及location均可以),指定auth_basic指令并为密码
配置实例:基于端口8080的访问需要使用用户名和密码进行访问,基于zabbix.lego.cc不需要使用用户名和密码进行访问
配置如下:
server {
listen 8080;
root /usr/local/nginx/html/test1/;
index index.html index.htm index.php;
error_page 500 501 502 503 50x.html;
}
auth_basic "Administrator's Area"; #定义所属区域
auth_basic_user_file /usr/local/nginx/users/.htpasswd; #定义访问用户密码对文件
}
Zabbix.lego.cc相关配置
server {
……
auth_basic off; #对外网站则在相关server{}模块下阴雨auth_basic off的指令参数。
……
}
3.2 基于IP的访问控制
HTTP基本认证可以有效地与IP地址的访问限制权限,nginx通过引入allow和deny指令用来定义web服务允许和拒绝访问等权限的相关设置。
允许或拒绝来自与特定IP地址的访问allow和deny对指令的nignx access模块:
location /status {
...
deny 192.168.1.2;
allow 192.168.1.1/24;
allow 127.0.0.1;
deny all;
}
访问将只被授予192.168.1.1/24不包括192.168.1.2地址的网络。请注意,allow并deny指示将在它们被定义的顺序来应用。
3.3 基于IP和用户密码对进行组合权限设置
通过IP和HTTP身份验证将限制与satisfy指令结合在一起。
如果将该指令设置为all,则如果客户端满足这两个条件,则授予访问权限。如果将该指令设置为any,则如果客户端满足至少一个条件,则授予访问权限:
location /status {
...
satisfy all;
deny 192.168.1.2;
allow 192.168.1.1/24;
allow 127.0.0.1;
deny all;
auth_basic "Administrator’s Area";
auth_basic_user_file conf/htpasswd;
}
参考链接:https://www.nginx.com/resources/admin-guide/restricting-access-auth-basic/
附录:
附录1:相关文档参考链接
PHP-nginx:https://secure.php.net/manual/zh/install.unix.nginx.php
Nginx:https://nginx.org/en/docs/
MySQL: https://dev.mysql.com/doc/refman/5.7/en/binary-installation.html#binary-installation-layout
附录2:nginx参数说明
附录3:php编译参数说明
附录4:LNMP环境日常维护命令