web服务器—nginx
Posted 芷阳99
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了web服务器—nginx相关的知识,希望对你有一定的参考价值。
一、nginx介绍
Nginx(“engine x”)是一款是由俄罗斯的程序设计师Igor Sysoev所开发高性能的 Web和 反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。和apache一样,都是web服务器软件,因为其性能优异,所以被广大运维喜欢。又因为nginx是一个轻量级的web服务器,相比apache来说资源消耗更低。
nginx官网:http://nginx.org/
nginx与apache的比较,Nginx适合处理静态页面,apache处理动态页面
Web服务器 | Nginx | Apache |
反向代理 | 非常好 |
|
Rewrite规则 | 非常好 | 好 |
系统压力比较 | 很小 | 小 |
内存消耗 | 非常小 | 很大 |
静态文件处理 | 非常好 | 一般 |
稳定性 | 非常好 | 好 |
安全性 | 一般 | 好 |
技术资料 | 很少 | 非常多 |
虚拟主机 | 支持 | 支持 |
热部署 | 支持 | 不支持 |
FastCGI | 好 | 差 |
二、nginx部署
安装部署
下载nginx源码包
wget http://nginx.org/download/nginx-1.19.3.tar.gz -P /usr/src
安装依赖包
yum -y install gcc pcre-devel zlib-devel openssl-dev
- gcc: 源码编译工具
- pcre-devel: nginx url_rewrite 功能提供包,支持nginx的正则表达
- zlib-devel: nginx 压缩功能提供包
- openssl-dev:安全网络功能
解压nginx源码包
tar xf nginx-1.19.3.tar.gz
cd nginx-1.19.3/
配置nginx源码
./configure --prefix=/usr/local/nginx
配置目的:
(1)检查环境是否满足安装条件,依赖解决
(2)指定安装方式,配置文件、命令文、各种文件放哪里
(3)开启模块功能【内置模块 三方模块】
(4)指定软件安装在那里
编绎源码
make
安装
make install
相关目录
—安装目录:/usr/local/nginx/
—主配置文件:conf/nginx.conf
—网页目录:html
—日志文件:logs
—启动脚本:sbin/nginx
—模块目录:modules
—进程目录:pid
nginx启动管理
配置文件测试:/usr/local/nginx/sbin/nginx -t
启动:/usr/local/nginx/sbin/nginx
停止:/usr/local/nginx/sbin/nginx -s stop
关闭:/usr/local/nginx/sbin/nginx -s quit 【优雅关闭,在退出前完成已经接受的连接请求】
关闭:killall -s QUIT nginx
加载:/usr/local/nginx/sbin/nginx -s reload 【重新加载配置文件】
2.启动测试
nginx安装完毕,接下来就可以启动nginx了,nginx启动后如何测试nginx的启动状态呢?可以通过以下三种方式去测试,这个可以根据自己的习惯选择一种测试就行了。
使用netstat命令查看启动端口
netstat -ntpl
使用losf命令查看启动端口
lsof -i :80
使用文本浏览器访问nignx默认网站
elinks http://192.168.65.21
3.编辑服务脚本
vim /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - web server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true
[Install]
WantedBy=multi-user.target
重新加载系统服务
systemctl daemon-reload
启动服务
systemctl start nginx
开机自启
systemctl enable nginx.service
三、nginx配置
最基本配置
worker_processes 1; # 默认为1,表示开户一个业务进程
events # 事件驱动模块
worker_connections 1024; # 单个业务进程可接受连接数
http
include mime.types; # 引入http mime类型
default_type application/octet-stream;# 如果mime类型没匹配上,默认使用二进制流的方式传输
sendfile on; # 使用linux的sendfile(socket,file,len)高效网络传输,也就是数据0拷贝。未开户senfile
keepalive_timeout 65; # 保持连接配置
server # 虚拟主机
listen 80; # 监听的端口号
server_name localhost; # 主机名、域名
location / # location是匹配用户输入的路径,url
root html; # 默认存放网页的目录路径
index index.html index.htm; # 默认网页
error_page 500 502 503 504 /50x.html; # 发生错误展示的页面
location = /50x.html
root html;
nginx默认配置文件大概分为几个区域:
没有被 包裹的部分为全局配置:
—如worker_processes 1; 设置工作进程(子进程)数为 1
events 为 nginx 连接配置的模块:
—如worker_connections 1024; 设置每一个子进程最大允许连 接 1024 个连接
http 为 nginxhttp 核心配置模块
—而 http 中还有 server ,以及 server 中的 location
server 为虚拟主机配置模块,包括监听端口、监听域名、IP等内容
—在一个 Nginx 的配置文件里面,我们是可以指定多个 Sever 区块的配置的。
location URI 匹配
—细分到针对不同的路径和请求而进行的配置。一个站点中 URI 通常会很多,在 Location 区块设置,可以写多个 Location 的配置的。
虚拟主机
原本一台服务器只能对应一个站点,通过虚拟主机技术可以虚拟化成多个站点同时对外提供服务。
2.1、域名解析、端口监听
基于域名的虚拟主机,实现两个基于域名的虚拟主机,可以在server_name匹配多个域名
基于端口的虚拟主机,实现两个基于端口的虚拟主机,可以listen监听多个端口
http框架是定义与nginx网站相关的配置
server:虚拟主机
listen:端口
server_name:主机,可以填IP或域名
location:网页地址
http
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server # 第一个虚拟主机
listen 80; # 端口
server_name www.s.com; # 主机、域名
location /
root /www/www;
index index.html index.htm;
server # 第二个虚拟主机
listen 88; # 端口
server_name vod.s.com; # 主机、域名
location /
root /www/vod;
index index.html index.htm;
ServerName匹配规则
ServerName匹配是从上往下的顺序,前面匹配成功了,就不会向下匹配了。
完整匹配:可以在同一个servername中匹配多个域名
server_name vod.s.com vod1.s.com;
通配符匹配
server_name *.s.com; # *通配符匹配,*.s.com域名匹配同一个网页
通配符结束匹配
server_name vod.*; # *通配符匹配,不管vod.*域名访问都是同一个网页
正则匹配:比较适用于二级域名系统,符合哪些规则就进入到对应的server里面进行转发。
server_name ~^[0-9]+\\.s\\.com$;
2.2、location
相同类型的表达式,字符串长的会优先匹配
按优先级排列
① = 类型
② ^~类型表达式
③ 正则表达式 (~和 ~*) 类型
④常规字符串匹配类型,按前缀匹配
⑤ 通用匹配(/),如果没有其他匹配,任何请求都会匹配到
location优先级规则
①匹配某个具体文件:(location=完整路径) >(location ~ 完整路径) > (location ~ *完整路径) >(location~完整路径) > (location完整路径) > (location /)
②用目录做匹配访问某个文件:(location=目录) >(location ^ ~ 目录/) > (location ~ 目录 ) > (location~*目录) > (location目录) > (location /)
反向代理
正向代理:搭建一个属于自己的代理服务器
①用户发送请求到自己的代理服务器
②自己的代理服务器发送请求到服务器
③服务器将数据返回到自己的代理服务器
④自己的代理服务器再将数据返回给用户
反向代理:七层代理,调度作用,该功能可以通过组建后台集群提高网站性能
①用户发送请求到服务器(访问的其实是 反向代理 服务器,但用户不知道)
②反向代理服务器发送请求到真正的服务器
③真正的服务器将数据返回给反向代理服务器
④反向代理服务器再将数据返回给用户
3.1、代理服务器
proxy_pass:location模块内配置,和网页目录同级别,定义的服务器列表,可以填写域名、IP。不支持代理https服务器
location /
proxy_pass http://www.baidu.com; # 请求转向baidu,proxy_pass和root目录二选一
集群代理
upstream:http模块内配置,模块内的server是服务器列表,和server模块同级别。
proxy_pass:调用集群,在location模块内配置,和upstream集群名保持一致。
upstream jiangying # 创建集群,定义代理的服务器列表
server 192.168.65.22:80; # 是IP、端口、状态的配置
server 192.168.65.10:80;
server
listen 80;
server_name localhost;
location /
proxy_pass http://jiangying; # 请求转向到jiangying定义的服务器列表
error_page 500 502 503 504 /50x.html;
location = /50x.html
root html;
3.2、UpStream
3.2.1、上游服务器
UpStream工作流程:proxy_pass 向上游服务器请求数据共有6个阶段
- 初始化
- 与上游服务器建立连接
- 向上游服务器发送请求
- 处理响应头
- 处理响应体
- 结束
配置说明
参 数 | 作 用 | 案 例 |
set_header | 设置header | |
proxy_connect_timeout | 与上游服务器连接超时时间、快速失败 | |
proxy_send_timeout | 定义nginx向后端服务发送请求的间隔时间(不是耗时)。默认60秒,超过这个时间会关闭连接 | |
proxy_read_timeout | 后端服务给nginx响应的时间,规定时间内后端服务没有给nginx响应,连接会被关闭,nginx返回504 Gateway Time-out。默认60秒 | |
proxy_requset_buffering | 缓冲区,是否完全读到请求体之后再向上游服务器发送请求,on打开,off关闭 | |
proxy_buffering | 是否缓冲上游服务器数据,on打开,off关闭 | |
proxy_buffers | 缓冲区大小 32个128k大小内存缓冲块 | proxy_buffers 32 128k; |
proxy_buffer_size | header缓冲区大小 | proxy_buffer_size 64k; |
proxy_busy_buffers_size | ||
proxy_max_temp_file_size | 临时文件最大值 | proxy_max_temp_file_size 1024m; |
proxy_temp_file_write_size | 当启用从代理服务器到临时文件的响应的缓冲时,一次限制写入临时文件的数据的大小。默认情况下,大小由proxy_buffer_size和proxy_buffers指令设置的两个缓冲区限制。临时文件的最大大小由proxy_max_temp_file_size指令设置。 |
3.2.1、负载均衡策略
轮询
最基本的配置方法,它是upstream模块默认的负载均衡默认策略。每个请求会按时间顺序逐一分配到不同的后端服务器。在轮询中,如果服务器down掉了,会自动剔除该服务器。此策略适合服务器配置相当,无状态且短平快的服务使用。
weight:权重方式,在轮询策略的基础上指定轮询的几率。权重越高分配到需要处理的请求越多,此策略可以与least_conn和ip_hash结合使用,适合服务器的硬件配置差别比较大的情况。
upstream jiangying
server 192.168.65.22:80 weight=8;
server 192.168.65.10:80 weight=2;
down:标记服务器永久停机了。
upstream jiangying
server 192.168.65.22:80 down;
server 192.168.65.10:80;
backup:标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
upstream jiangying
server 192.168.65.22:80;
server 192.168.65.10:80 backup;
健康检查
max_fails:允许失败的次数
fail_timeout:与max_fails结合使用。检查失败后,需要等30s,再重新连接
fail_time:失败后,暂停服务的时间,服务器会被认为停机的时间长度,默认为10s。
upstream jiangying
server 192.168.65.22:80;
server 192.168.65.10:80 max_fails=2 fail_timeout=30;
3.2.3、least_conn
最少连接访问。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果。此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。
upstream jiangying
least_conn;
server 192.168.65.22:80;
server 192.168.65.10:80;
3.2.4、第三方策略
第三方的负载均衡策略的实现需要安装第三方插件。
fair:根据后端服务器响应时间来分配请求,响应时间短的优先分配。
url_hash:按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,要配合缓存命中来使用。同一个资源多次请求,可能会到达不同的服务器上,导致不必要的多次下载,缓存命中率不高,以及一些资源时间的浪费。而使用url_hash,可以使得同一个url(也就是同一个资源请求)会到达同一台服务器,一旦缓存住了资源,再此收到请求,就可以从缓存中读取。
总结:以上便是6种负载均衡策略的实现方式,其中除了轮询和轮询权重外,都是Nginx根据不同的算法实现的。在实际运用中,需要根据不同的场景选择性运用,大都是多种策略结合使用以达到实际需求。
3.4、四层代理
其他业务集群:nginx四层代理(TCP/UDP高度),nginx从1.9版本才开始支持该功能
模块查询
./configure --help
配置四层代理模块--with-stream
./configure --with-stream
make && make install
http之外配置集群
stream # 四层代理模块
upstream backend # 创建集群
server 192.168.65.22:22;
server 192.168.65.10:22;
server
listen 12345;
proxy_pass backend; # 调用集群
验证:远程业务,可以轮询登录到后方集群的服务器
ssh 192.168.65.21 -p 12345
动静分离
因nginx的静态处理能力很强,但动态处理能力不足,所以在企业中常采用动静分离技术,针对php,将静态页面交给nginx处理,动态页面交给PHP-FPM模块或Apache处理。在nginx的配置文件中,是通过location配置段配合正则匹配来实现静态与动态页面的不同处理方式。在企业信息化应用环境中,服务器的安全性和响应速度需要根据实际情况进行相应参数配置,以达到最优的用户体验。默认的nginx安装参数只能供最基本的服务,还需要调整如网页缓存时间,连接超时,网页压缩等相应参数,餐能发挥出服务器的最大作用。
4.1、动静分离原理
Nginx动静分离概述
Nginx的静态处理能力很强,但是动态处理能力不足,因此,在企业中常用动静分离技术
针对PHP的动静分离
静态页面交给 Nginx处理
动态页面交给 PHP-FPM模块或 Apache处理
在 Nginx的配置中,是通过 ocation配置段配合正则匹配实现静态与动态页面的不同处理方式
Nginx实现动静分离配置
我们根据需要,将配置Nginx实现动静分离,对php页面的请求转发给LAMP或LNMP处理,而静态页面交给Nginx处理,从而实现动静分离。
部署 LNMP环境任务要求
— 安装Linux(操作系统)、Nginx(网站服务)、mysql(数据库)、PhP( 编写动态网站的语言工具,pythen也可以)环— 境启动Nginx、MySQL、PHP服务
— 测试Nginx及MySQL、PHP是否工作正常
LNMP常见问题
Nginx的默认访问日志文件为/usr/local/nginx/logs/access.log
Nginx的默认错误日志文件为/usr/local/nginx/logs/error.log
PHP默认错误日志文件为/var/log/php-fpm/www-error.log
4.2、动静分离部署(LNMP)
4.2.1、环境配置
安装相关软件,软件仓库没有mysql,安装mariadb
yum -y install mariadb mariadb-server mariadb-devel php php-mysql php-fpm
动态网站创建需要安装的软件
mariadb:数据库包
mariadb-server:客户端数据库包
mariadb-devel:数据库的依赖包,开发环境软件包
php(FastCGI):开发语言解释器
php-fpm:关联nginx与php的服务
php-mysql:关联php与数据库的服务
启动服务
systemctl start php-fpm
systemctl start mariadb
修改Nginx配置文件并启动服务
vim /usr/local/nginx/conf/nginx.conf
server
listen 80;
server_name localhost;
location ~ \\.php$
root html;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
include fastcgi.conf;
注:
~ \\.php$:~是开启正则表达式,\\转义作用,匹配.php结尾的文件,动态网页设置
fastCGI:快速公共网关接口,可以连接网站程序(nginx)到网站的语言解释器(如php),php-fpm为fastCGI的管理者。fastcgi.conf:fastcgi_params改成fastcgi.conf,更改扩展名称,安装php-fpm生成的文件,要比原有文件可靠。
4.2.2、案例1:php网页配置
查看php-fpm配置文件
vim /etc/php-fpm.d/www.conf
[www]
listen = 127.0.0.1:9000 # PHP端口号
listen.allowed_clients = 127.0.0.1
group = apache
pm = dynamic
pm.max_children = 50 # 最大进程数量
pm.start_servers = 5 # 最小进程数量
pm.min_spare_servers = 5
pm.max_spare_servers = 35
slowlog = /var/log/php-fpm/www-slow.log
php_admin_value[error_log] = /var/log/php-fpm/www-error.log
php_admin_flag[log_errors] = on
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
创建PHP页面
vim /usr/local/nginx/html/test.php
<html>
<body>
This is HTML message
</br>
<?php
$c = 12;
$d = 2;
if($c > $d)echo "c is bigger";
else echo "d is bigger";
?>
</body>
</html>
浏览器验证php网页:IP/test.php
4.2.3、案例2:动态网站调用数据库
创建PHP测试页面,连接并查询MariaDB数据库。
vim /usr/local/nginx/html/mysql.php
<?php
$mysqli = new mysqli('localhost','root','','mysql');
#注意:root为mysql数据库的账户名称,密码需要修改为实际mysql密码,无密码则留空即可
#localhost是数据库的域名或IP,mysql是数据库的名称
if (mysqli_connect_errno())
die('Unable to connect!'). mysqli_connect_error();
$sql = "select * from user";
$result = $mysqli->query($sql);
while($row = $result->fetch_array())
printf("Host:%s",$row[0]);
printf("</br>");
printf("Name:%s",$row[1]);
printf("</br>");
?>
进入数据库,创建新的用户‘jy’
systemctl restart mariadb.service
mysql
Welcome to the MariaDB monitor. Commands end with ; or \\g.
Your MariaDB connection id is 3
Server version: 5.5.68-MariaDB MariaDB Server
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\\h' for help. Type '\\c' to clear the current input statement.
MariaDB [(none)]> create user jy@localhost identified by '123';
Query OK, 0 rows affected (0.00 sec)
验证:浏览器访问IP/mysql.php,会看到Name:jy
安全配置
5.1、登录认证
在HTTP中,HttpAuthBasic模块可以使用用户名和密码基于 HTTP 基本认证(Basic access authentication),这是一种用来允许网页浏览器或其他客户端程序在请求时提供用户名和口令形式的身份凭证的一种登录验证方式。
默认值: auth_basic off 作用域: http, server, location, limit_except 该指令包含用于 HTTP 基本认证 的测试名和密码
在server模块中添加以下配置信息,开启认证提示
vim /usr/local/nginx/conf/nginx.conf
auth_basic "password"; # 自定义提示语句,开启认证提示
auth_basic_user_file "/usr/local/nginx/pass"; # 密码文件存放位置在pass文件中
注:
auth_basic 可设置为off或其它字符串,为off时表示不开启密码验证,或者#注释效果一样
auth_basic_user_file 为包含用户名和密码的文件,具体位置就是htpasswd生成账号及密码的存放路径
安装创建加密文件软件
yum -y install httpd-tools
首次创建加密文件、用户,增加用户不用-c
htpasswd -c /usr/local/nginx/pass tom # pass是加密文件,tom是用户,提示输入密码
验证:浏览器登录网页,输入用户和密码
5.2、https证书配置
--with-http_ssl_module是安全网站模块,源码安装Nginx时必须使用–with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。
openssl:包含SSL协议库、应用程序以及密码处法库,自签名openssl系统内置
加密算法
对称算法:AES、DES,使用相同的字符串加密和解密,主要应用在单机数据加密。应用案例 :RAR、ZIP压缩加密
非对称算法:RSA、DSA,利用公钥(锁)加密,私钥(钥匙)解密,主要应用在网络数据加密。应用案例:https、ssh
信息摘要:MD5、sha256、sha512,数据校验,主要应用在数据完整性校验。
5.2.1、加密网站设置
更改配置文件
vim /usr/local/nginx/conf/nginx.conf
server
listen 443 ssl;
server_name localhost; # IP或域名
ssl_certificate cert.pem; # 公钥
ssl_certificate_key cert.key; # 私钥
ssl_session_cache shared:SSL:1m;
ssl_session_timeout 5m;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;
location /
root html;
index index.html index.htm;
创建私钥,用来解密的
openssl genrsa > /usr/local/nginx/conf/cert.key # genrsa使用rsa非对称算法
创建证书(正式的证书需要花费,证明https是合规的),里面包含公钥
openssl req -x509 -key /usr/local/nginx/conf/cert.key > /usr/local/nginx/conf/cert.pem
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]:JY # 国家
State or Province Name (full name) []:JY # 省份
Locality Name (eg, city) [Default City]:JY # 城市
Organization Name (eg, company) [Default Company Ltd]:JY # 公司
Organizational Unit Name (eg, section) []:JY # 部门
Common Name (eg, your name or your server's hostname) []:JY # 服务器
Email Address []:JY@163.com # 邮箱
注:
req -x509:请求创建-x509格式的证书,-x509证书是国际通用标准。
-key /usr/local/nginx/conf/cert.key:指定私钥创建公钥
重新加载文件
systemctl reload nginx.service
验证
mkdir /usr/local/nginx/html_c
echo "nginx-c~~~~" > /usr/local/nginx/html_c/index.html
curl -k https://www.jiangying.com # -k忽略风险提示
6.地址重写
6.1、URL重写介绍
和apache等web服务软件一样,rewrite的主要功能是实现URL地址的重定向。Nginx的rewrite功能需要PCRE软件的支持,即通过perl兼容正则表达式语句进行规则匹配的。默认参数编译nginx就会支持rewrite的模块,但是也必须要PCRE的支持。
Rewrite功功能是Nginx服务器提供的一个重要功能。几乎是所有的web产品必备技能,用于实现URL重写。URL重写是非常有用的功能,比如它可以在我们在改变网站结构后,不需要客户端修改原来的书签,也不需要其他网站修改对我们网站的友情链接,还可以在一定程度上提高网站的安全性,能够让我们的网站显得更专业。
6.2、应用场景
域名变更(京东)
用户跳转 (从某个连接跳到另一个连接)
伪静态场景 (便于CDN缓存动态页面数据)
rewrite地址重写
可以定义用户的访问路径可以看到的实际内容。相同网站间的调转,获得一个来访的URL请求,然后改写成服务器可以的另一个URL的过程。地址重写可以是网页、域名、浏览器。
参考技术A
本文讲解Nginx安装后,nginx搭建静态资源web服务器需要的配置内容包括location,gzip,带宽限速等配置。
添加上图中的配置后, 客户端访问 http://172.16.204.5:90/ 时, 会以树的格式展示mine_html中的所有文件. 使用这种方式可以很好的共享静态资源.
(1)Nginx系列教程(2)nginx搭建静态资源web服务器
https://yq.aliyun.com/articles/752950
以上是关于web服务器—nginx的主要内容,如果未能解决你的问题,请参考以下文章
Nginx - Docker 容器化 Nginx 部署前端 Vue 项目访问 404
Nginx - Docker 容器化 Nginx 部署前端 Vue 项目访问 404