nginx 企业
企业级架构之Nginx
一、Nginx软件的重装与升级
在实际业务场景中,需要使用软件新版本的功能、特性,就需要对原有软件进行升级或者重装操作。
Nginx官方网站:http://www.nginx.org
旧statble 稳定版 1.16
stable 稳定版 1.18
mainline 主线版本 最新的 1.19
1、Nginx软件重装(了解)
第一步:停止Nginx服务,直接删除编译安装的软件目录(/usr/local/nginx)或者进入解压后的源码文件夹,使用make uninstall
与make distclean
对其进行卸载操作。
第二步:下载需要升级的软件版本(一定要下载stable稳定版)
第三步:解压,然后重新对其进行编译安装。
注意:如果有需要,请备份配置文件和网站目录里的资源文件
2、Nginx平滑升级(重点)
问题:什么是Nginx的平滑升级?
答:Nginx的平滑升级就是在不停止业务的前提下实现对Nginx软件版本的升级。
平滑升级需要有kill命令的支持:kill命令不仅仅是用于杀掉进程,其主要功能在于对我们的软件进程发送信号。
# kill 信号 进程ID编号(PID)
-USR2 平滑启动一个进程(平滑升级)
-WINCH 优雅的关闭子进程
-QUIT 优雅关闭主进程
问题:Nginx平滑升级一共需要哪些步骤?
① 不停止原有的Nginx服务(但是必须使用原生方式启动或者需要更改Nginx脚本)
② 重新编译安装Nginx新版本
③ 使用kill -USR2启动新版本Nginx(目前两个Nginx的版本会共存)
④ 把老的Nginx的子进程全部关闭
⑤ 优雅的退出老版本Nginx的主进程(系统就只剩下新版本的Nginx进程了)
第一步:关闭正在运行的Nginx,改由原生Nginx启动方式
# systemctl stop nginx
# cd /usr/local/nginx# sbin/nginx -c /usr/local/nginx/conf/nginx.conf
------------------------------------------- 真正的升级从这里开始 ----------------------------------------------
第二步:上传nginx-1.18.0新版本Nginx软件包到Linux服务器并解压
# tar -xf nginx-1.18.0.tar.gz
# cd nginx-1.18.0
第三步:对软件进行编译安装
# ./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module
# make && make install
在配置过程中,--prefix要指定和原来的老版本路径一致!!!
第四步:使用kill -USR2启动新版本的Nginx软件
# ps -ef |grep nginx
# kill -USR2 老版本的PID编号
其主要功能会根据上一次的启动方式,在重新运行一次之前的启动命令。
# cd /usr/local/nginx
# sbin/nginx -c /usr/local/nginx/conf/nginx.conf
第五步:首先关闭老版本Nginx的所有子进程
# kill -WINCH 老版本的PID编号
第六步:关闭老版本的Nginx的主进程(到此完成新旧版本的交替工作)
# kill -QUIT 老版本的PID编号
二、企业级Nginx服务的配置
1、Nginx配置文件
在Nginx的安装目录中,有一个conf文件夹,其内部拥有一个nginx.conf的配置文件。这就是Nginx的主配置文件。
编译的nginx默认的配置文件位置:/usr/local/nginx/conf/nginx.conf
使用grep删除注释与空行:grep -Ev '#|^$' conf/nginx.conf
原则上:
一个nginx.conf配置文件拥有一个http区块,其有且仅有一个http区块,所有的http请求都会直接打在http区块上
一个http区块可以同时拥有多个server区块,一个server区块就称之为一个虚拟主机,一个虚拟主机就对应一个项目
一个server区块可以同时拥有多个location区块,每个location区块就是一个url连接的匹配规则
2、server区块配置(虚拟主机配置)
☆ 基于域名的虚拟主机
在实际生产业务环境中,一台web服务器,需要使用多个网站部署。搭建vhost虚拟机主机实现不同域名,解析绑定到不同的目录。
案例:绑定一个www.devops.com域名,指向html/devops文件夹
第一步:创建devops项目目录
# cd /usr/local/nginx
# mkdir html/devops
第二步:编辑nginx.conf文件,添加一个server区块
# vim conf/nginx.conf
http {...server {#监听端口listen 80;#绑定域名server_name www.devops.com;#root定义项目目录root html/devops;#location /定义任意链接规则location / {#index设置默认首页index index.html index.htm index.php;}#把php请求转发给php解析器location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}...
}
第三步:重新加载nginx软件
# sbin/nginx -s reload
第四步:创建一个php测试文件
# vim html/devops/index.php
<?phpecho 'hello devops!';
?>
第五步:在windows劫持www.devops.com域名指向10.1.1.11服务器
# C:\Windows\System32\drivers\etc\hosts
10.1.1.11 www.devops.com
在浏览器中访问www.devops.com域名,如下图所示:
注:尽量使用Google或Firefox火狐浏览器
☆ 扩展:多虚拟主机配置
如果一个服务器上要同时部署多个项目,我们就需要在nginx.conf文件中同时配置多个虚拟主机,这样后期nginx.conf文件非常不便于管理。为了解决这个问题,可以把配置文件进行分离。
# cd /usr/local/nginx
# mkdir conf/conf.d => conf.d相当于配置文件的子目录
虚拟主机分离
# sed -n '11,24p' conf/nginx.conf > conf/conf.d/devops.conf
注:11,24代表取nginx.conf中11~24行中的server区块
使用include选项把子配置文件包含到nginx.conf文件中
# vim conf/nginx.conf
http {...include conf.d/*.conf;...
}
重载nginx.conf配置文件
# sbin/nginx -s reload
☆ 基于IP的虚拟主机
多个IP访问同一台服务器主机,不同的IP解析到不同的vhost虚拟机中。
核心:ens33绑定多个IP地址(选做一个临时绑定ip或者配置文件绑定ip)
第一步:使用ifconfig为ens33临时绑定一个虚拟网卡IP
# ifconfig ens33:1 10.1.1.100
运行结果:# ifconfig
第二步:建立一个虚拟主机,绑定虚拟网卡IP
# cd /usr/local/nginx
# vim conf/nginx.conf
设置完成后,重启nginx
# sbin/nginx -s reload
第三步:在浏览器端,使用10.1.1.100访问devops目录下的index.php文件
☆ 基于端口的虚拟主机
优势:默认不占用80端口,能够稍微隐秘一些。说白了就是不同的端口请求,访问不同的虚拟主机。
第一步:编辑nginx.conf文件
# vim conf/nginx.conf
第二步:配置完成后,重载nginx.conf配置文件
# sbin/nginx -s reload
第三步:使用IP:端口号访问不同的虚拟主机
10.1.1.11:80
10.1.1.11:8080
3、DSShop商城系统上线部署
第一步:在系统中创建一个/home/www目录作为商城系统的项目目录
# mkdir /home/www
第二步:把dsshop.zip源代码上传到/home/www目录下,然后进行解压缩
# yum install unzip -y
# unzip dsshop.zip
第三步:编辑nginx.conf文件,对其进行备份操作,然后删除nginx.conf文件的注释和空行
# cd /usr/local/nginx
# cp conf/nginx.conf conf/nginx.conf.bak
# grep -Ev '#|^$' conf/nginx.conf
worker_processes 1;
events {worker_connections 1024;
}
http {include mime.types;default_type application/octet-stream;sendfile on;keepalive_timeout 65;server {listen 80;server_name localhost;root html;location / {index index.html index.htm;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}error_page 500 502 503 504 /50x.html;location = /50x.html {}}
}
第四步:在nginx.conf配置文件中定义server区块,设置虚拟主机
# vim conf/nginx.conf
...
http {################# 配置开始 ################server {listen 80;server_name www.shop.com;root /home/www/public;location / {index index.html index.htm index.php;}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}################# 配置结束 ################...
}http://www.shop.com
等价于
http://www.shop.com/index.html
http://www.shop.com/index.htm
http://www.shop.com/index.php
传统的PHP项目,其项目目录直接指定到/home/www即可,但是如果这个项目采用的是PHP框架进行开发的(ThinkPHP或Laravel),必须指定到其内部的public文件夹。
设置完成后,一定要重新加载nginx.conf配置文件
# sbin/nginx -s reload
第五步:在Windows中劫持www.shop.com域名
# C:\Windows\System32\drivers\etc\hosts
10.1.1.11 www.shop.com
第六步:设置目录权限(需要向项目中写入配置信息、模板文件等等)
设置权限:
# cd /home/www
# chmod a+w public/uploads
# chmod a+w runtime
# chmod a+w public/install
# chmod a+w application/database.php
第七步:数据库兼容性配置
默认情况下,我们安装的这个开源的商城系统是基于5.6及5.6以下的MYSQL数据库,我们安装的是5.7,所以要在my.cnf中配置兼容性(向前兼容)
# cd /usr/local/mysql
# vim my.cnf
[mysqld]
basedir=/usr/local/mysql
datadir=/usr/local/mysql/data
socket=/tmp/mysql.sock
port=3306
log-bin=/usr/local/mysql/data/binlog
log-error=/usr/local/mysql/data/mysql.err
server-id=10
character_set_server=utf8mb4
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES# service mysqld restart
注:兼容性问题解决,就是依靠sql_mode最后一段内容
第八步:设置管理选项(添加一个后台管理的账号和密码)
第九步:设置URL地址重写模式(支持伪静态)
方案一:
# cd /usr/local/nginx
# vim conf/nginx.conf
http {...################# 配置开始 ################server {listen 80;server_name www.shop.com;root /home/www/public;#匹配首页且仅能匹配首页location =/ {rewrite / /index.php redirect;}location / {index index.html index.htm index.php;################ 配置开始 #################if (!-e $request_filename) {rewrite ^/index.php(.*)$ /index.php?s=$1 last;break;}################ 配置结束 #################}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}################# 配置结束 ################...
}
rewrite重写规则:匹配所有链接,如果是404,则跳入if结构。^(.*)$匹配链接地址,然后替换为/index.php?s=/home/search/index/cate_id/75.html
方案二:
# cd /usr/local/nginx
# vim conf/nginx.conf
http {...################# 配置开始 ################server {listen 80;server_name www.shop.com;root /home/www/public;location / {index index.html index.htm index.php;################ 配置开始 #################if (!-e $request_filename) {rewrite ^/index.php(.*)$ /index.php?s=$1 last;rewrite ^(.*)$ /index.php?s=$1 last;break;}################ 配置结束 #################}location ~ \.php$ {fastcgi_pass 127.0.0.1:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;include fastcgi_params;}}################# 配置结束 ################...
}
到此,整个DSShop商城系统就部署完毕了!
三、Nginx默认官方模块
1、什么是官方模块
所谓的Nginx官方模块主要是Nginx软件安装完成后自带的一些模块,不需要独立安装。其可以实现一些特殊的功能。
2、GZIP压缩
压缩文件大小变小了,传输更快了。目前市场上大部分浏览器是支持GZIP的。IE6以下支持不好,会出现乱码情况。
GZIP压缩主要针对:CSS文件、JS文件以及图片等静态资源
配置项:
http://nginx.org/en/docs/http/ngx_http_gzip_module.html
gzip on;
gzip_min_length 1k;
gzip_buffers 4 16k;
gzip_http_version 1.0;
gzip_comp_level 2;
gzip_types text/plain text/css text/javascript application/x-javascript image/jpeg image/gif image/png;
gzip_vary off;
gzip_disable "MSIE [1-6]\.";
案例:压缩bmp图片
设置完成后,重载Nginx
# sbin/nginx -s reload
使用火狐浏览器,禁止缓存,F12查看传输信息
3、缓存模块(针对客户端浏览器)
告知浏览器获取的信息是在某个区间时间段是有效的,基本格式:
expires 30s; //表示把数据缓存30秒
expires 30m; //表示把数据缓存30分
expires 10h; //表示把数据缓存10小时
expires 3d; //表示把数据缓存3天
案例:缓存图片/js/css文件,缓存时间为1天
location ~ \.(jpg|jpeg|gif|png|js|css)$ {expires 1d;
}
运行结果: