目录
Nginx是俄罗斯人编写的十分轻量级的HTTP服务器,Nginx,它的发音为“engine X”,是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/SMTP 代理服务器。
nginx做为HTTP服务器,有以下几项基本特性:
- 处理静态文件,索引文件以及自动索引;打开文件描述符缓冲.
- 无缓存的反向代理加速,简单的负载均衡和容错.
- FastCGI,简单的负载均衡和容错.
- 模块化的结构。包括gzipping, byte ranges, chunked responses,以及 SSI-filter等filter。如果由FastCGI或其它代理服务器处理单页中存在的多个SSI,则这项处理可以并行运行,而不需要相互等待。
- 支持SSL 和 TLSSNI.
一、nginx安装
1.1 环境准备
# 禁止防火墙自启动并立刻关闭防火墙
systemctl disable firewalld.service --now
# 安装所需软件
yum -y install gcc make pcre-devel openssl-devel
- gcc 可以编译 C,C++,Ada,Object C和Java等语言(安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境)
- pcre-devel 是一个perl库,包括perl兼容的正则表达式库,nginx的http模块使用pcre来解析正则表达式,所以需要安装pcre库
- openssl-devel 是一个强大的安全套接字层密码库,囊括主要的密码算法、常用的密钥和证书封装管理功能及 SSL 协议,并提供丰富的应用程序供测试或其它目的使用。
- make 编译工具
1.2 安装nginx
nginx安装包网址:https://nginx.org/
# 下载nginx
wget https://nginx.org/download/nginx-1.22.1.tar.gz
# 解压
tar xvf nginx-1.22.1.tar.gz
cd nginx-1.22.1
# 配置(带有https模块)
./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module
# 编译安装
编译:make
安装:make install
1.3 nginx基本使用
- nginx安装目录- conf 配置文件- sbin 主程序- html 网站页面- logs 日志
nginx命令用法
# 提高安全性
useradd -s /sbin/nologin nginx
# 启动服务
/usr/local/nginx/sbin/nginx
# 关闭服务
/usr/local/nginx/sbin/nginx -s stop
# 重新加载配置文件
/usr/local/nginx/sbin/nginx -s reload
# 查看软件信息
/usr/local/nginx/sbin/nginx -v
1.4 使用systemd管理Nginx服务
编写service文件
vim /lib/systemd/system/nginx.service
[Unit]
Description=nginx service
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
# 写好service文件后systemctl daemon-reload重新加载配置
systemctl daemon-reload
进行systemctl 管理
# 开机自启
systemctl enable nginx.service
# 取消开机自启动
systemctl disable nginx.service
# 启动
systemctl start nginx.service
# 关闭
systemctl stop nginx.service
# 重启服务
systemctl restart nginx.service
# 查看状态
systemctl status nginx.service
1.5 Nginx配置文件
- nginx 配置文件有三部分组成
- 每次修改完配置文件后都要reload一下,使文件生效
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;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
1.5.1 第一部分:全局块
从配置文件开始到 events 块之间的内容,主要会设置一些影响nginx 服务器整体运行的配置指令,主要包括配 置运行 Nginx 服务器的用户(组)、允许生成的 worker process 数,进程 PID 存放路径、日志存放路径和类型以 及配置文件的引入等。
比如上面第一行配置的:
worker_processes 1;
这是 Nginx 服务器并发处理服务的关键配置,worker_processes 值越大,可以支持的并发处理量也越多,但是 会受到硬件、软件等设备的制约。
1.5.2 第二部分:events块
events {
worker_connections 1024;
}
events 块涉及的指令,主要影响 Nginx 服务器与用户的网络连接,常用的设置包括是否开启对多 work process 下的网络连接进行序列化,是否允许同时接收多个网络连接,选取哪种事件驱动模型来处理连接请求,每个 word process 可以同时支持的最大连接数等
一般来说,有多少cpu就有多少 worker_processes,worker_connections的连接数就是CPU数量×1024
1.5.3 第三部分
http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
}
- http全局块- http全局块配置的指令包括文件引入、MIME-TYPE 定义、日志自定义、连接超时时间、单链接请求数上限等
- server 块- 每个 http 块可以包括多个 server 块,而每个 server 块就相当于一个虚拟主机。- 而每个 server 块也分为全局 server 块,以及可以同时包含多个 locaton 块。- 最常见的配置是本虚拟机主机的监听配置和本虚拟主机的名称或IP配置
- location 块- 这块的主要作用是基于 Nginx 服务器接收到的请求字符串(例如server_name/uri-string),对虚拟主机名称 (也可以是IP 别名)之外的字符串(例如 前面的 /uri-string)进行匹配,对特定的请求进行处理。 地址定向、数据缓 存和应答控制等功能,还有许多第三方模块的配置也在这里进行
二、HTTPS加密网站
- 源码安装Nginx时必须使用--with-http_ssl_module参数,启用加密模块,对于需要进行SSL加密处理的站点添加ssl相关指令(设置网站需要的私钥和证书)。
- 加密算法一般分为对称算法、非对称算法、信息摘要。
- 对称算法有:AES、DES,应用在单机数据加密。(加密解密同一密码,用的最多)
配置SSL虚拟主机
2.1 修改Nginx配置文件
- ssl_certificate cert.pem- 这里是证书文件(文件要自己创建)文件要创建配置文件conf下
- ssl_certificate_key cert.key- 这里是私钥文件(文件要自己创建)
- 加密网站根目录,最好改成https
[root@proxy nginx]#vim /usr/local/nginx/conf/nginx.conf
… …
server {
listen 443 ssl;
server_name localhost;
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 https; #加密网站根目录
index index.html index.htm;
}
}
2.2 生成私钥与证书(公钥)
[root@proxy nginx]#openssl genrsa > conf/cert.key #生成私钥
[root@proxy nginx]#openssl req -x509 -key conf/cert.key > conf/cert.pem #生成证书,生成过程会询问诸如你在哪个国家之类的问题,可以随意回答
Country Name (2 letter code) [XX]:dc 国家名
State or Province Name (full name) []:dc 省份
Locality Name (eg, city) [Default City]:dc 城市
Organization Name (eg, company) [Default Company Ltd]:dc 公司
Organizational Unit Name (eg, section) []:dc 部门
Common Name (eg, your name or your server's hostname) []:dc 服务器名称
Email Address []:[email protected] 电子邮件
2.3 重新加载配置
[root@proxy nginx]# mkdir https #创建安全网站的目录
[root@proxy nginx]# echo "https~~~~ " > https/index.html #创建安全网站的页面
[root@proxy nginx]# sbin/nginx #服务没开的话开服务
[root@proxy nginx]# sbin/nginx -s reload #已经开了的话重加载配置
[root@proxy nginx]# curl -k https://192.168.99.5 #检验,-k是忽略安全风险
https~~~~ #看到这个内容就说明实验成功
[root@proxy nginx]# systemctl stop firewalld #如果用真机的火狐浏览器测试需要
关闭防火墙,然后输入https://192.168.99.5
# 启动Nginx服务,如果服务器上已经启动了其他监听80端口的服务(如httpd),则需要先关闭该服务。
[root@proxy ~]# systemctl stop httpd #如果该服务存在则关闭该服务
[root@proxy ~]# /usr/local/nginx/sbin/nginx #启动Nginx服务
[root@proxy ~]# ss -utnlp | grep :80
# 启动MySQL服务
[root@proxy ~]# systemctl enable mariadb --now #启动服务器,并设置开机自启
# 启动PHP-FPM服务
[root@proxy ~]# systemctl enable php-fpm --now #启动fpm,并设置开机自启
三、nginx地址重写
- 什么是地址重写?- 获得一个URL的请求,然后改成服务器可以处理的另一个URL
- 地址重写好处- 缩短URL,隐藏实际路径提高安全性- 易于用户记忆
- 关于Nginx服务器的地址重写,主要用到的配置参数是rewrite- rewrite regex replacement flag- regex:表示正则匹配规则 replacement:表示跳转后的内容 flag:表示rewrite支持的flag标记- rewrite 旧地址 新地址 [选项]
3.1 地址重写的选项
- redirect 临时重定向,状态码302,爬虫不更新URI(redirect 自动跳到修改后的地址)
- permanent 永久重定向,状态码301,爬虫更新URI
- last 不再读其他语句,但还会继续匹配其他location语句
- **break **不再读其他语句,结束请求
# redirect 服务器会返回一个302状态码,告诉浏览器该页面已被重定向
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
location /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 redirect;
}
# permanent 返回301永久重定向,浏览器地址栏会显示跳转后的URL地址
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
location /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 permanent;
}
# last 本条规则匹配完成后,继续向下匹配新的location URL规则,一般用在server和if中
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
location /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 last; #没有其他location语句时,打开此页面,若有其他location,跳转其他页面
}
location /images {
rewrite ^/images/(.*\.jpg)$ https://music.y444.cn/#/ last;
}
# break 本条规则匹配完成即终止,不在匹配后面的任何规则,一般使用在location中
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
location = /imgs {
rewrite ^/imgs/(.*\.jpg)$ /images/$1 break; #break可以阻止后面的语句
}
3.2 简单地址重写
访问a.html重定向到b.html
[root@proxy nginx]# vim conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite /a.html /b.html;
location / {
root html;
index index.html index.htm;
}
}
访问192.168.99.5/下面子页面,重定向至www.tmooc.cn/下相同的子页面
$1 = 粘贴前面第一个小括号里的东西
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite /(.*) http://www.tmooc.cn/$1;
location / {
root html;
index index.html index.htm;
}
}
3.3 不同网站跳转
/ 不管你访问什么网站 都往后面那个域名跳, 访问192.168.99.5的请求重定向至www.tmooc.cn
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
server {
listen 80;
server_name localhost;
rewrite / http://www.tmooc.cn/;
location / {
root html;
index index.html index.htm;
}
}
3.4 if判断
3.4.1 基本语法
if (condition) { … }
if 可以支持如下条件判断匹配符号
~ 正则匹配 (区分大小写)
~* 正则匹配 (不区分大小写)
!~ 正则不匹配 (区分大小写)
!~* 正则不匹配 (不区分大小写)
-f 和!-f 用来判断是否存在文件
-d 和!-d 用来判断是否存在目录
-e 和!-e 用来判断是否存在文件或目录
-x 和!-x 用来判断文件是否可执行
#在匹配过程中可以引用一些Nginx的全局变量
$args 请求中的参数;
$document_root 针对当前请求的根路径设置值;
$host 请求信息中的"Host",如果请求中没有Host行,则等于设置的服务器名;
$limit_rate 对连接速率的限制;
$request_method 请求的方法,比如"GET"、"POST"等;
$remote_addr 客户端地址;
$remote_port 客户端端口号;
$remote_user 客户端用户名,认证用;
$request_filename 当前请求的文件路径名(带网站的主目录/usr/local/nginx/html/images/a.jpg)
$request_uri 用于表示客户端请求的完整 URI,也就是请求地址,它记录了客户端发起的请求地址
$query_string 与$args相同;
$scheme 用的协议,比如http或者是https
$server_protocol 请求的协议版本,"HTTP/1.0"或"HTTP/1.1";
$server_addr 服务器地址,如果没有用listen指明服务器地址,使用这个变量将发起一次系统调用以取得地址(造成资源浪费);
$server_name 请求到达的服务器名;
$document_uri 与$uri一样,URI地址;
$server_port 请求到达的服务器端口号;
假如旧的域名是www.lty.com,有需要使用新的域名www.liutianyang.com代替,但是旧域名不能废除,需要跳转到新的域名上,而且后面的参数保持不变
//修改配置文件,写入rewrite和if结合使用
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
server {
listen 80;
server_name www.lty.com;
location / {
if ($host = 'www.lty.com') {
rewrite ^/(.*)$ http://www.liutianuang.com/$1 permanent;
}
root html;
index index.html index.htm;
四、nginx反向代理
反向代理(Reverse Proxy)方式是指以代理服务器来接受Internet上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给Internet上请求连接的客户端,此时代理服务器对外就表现为一个服务器。
反向代理的好处
- 可以起到保护网站安全的作用,因为任何来自Internet的请求都必须先经过代理服务器。
- 通过缓存静态资源,加速Web请求。
- 实现负载均衡。顺便说下,目前市面上,主流的负载均衡方案,硬件设备有F5,软件方案有四层负载均衡的LVS,七层负载均衡的Nginx、Haproxy等。
4.1 部署实施后端Web服务器
后端部署两台web服务器
4.2 配置Nginx服务器
修改/usr/local/nginx/conf/nginx.conf配置文件
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
.. ..
#使用upstream定义后端服务器集群,集群名称任意(如webserver)
#使用server定义集群中的具体服务器和端口
upstream webserver {
server 192.168.99.100:80;
server 192.168.99.200:80;
}
.. ..
server {
listen 80;
server_name localhost;
location / {
#通过proxy_pass将用户的请求转发给webserver集群
proxy_pass http://webserver;
}
}
.. ..
}
4.3 设置权重
weight 可以设置后台服务器的权重,权重越大任务的分配量就越大,权重值默认 1
就是访问两次web1,在访问一次web2,然后重复
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
server 192.168.99.100 weight=2;
server 192.168.99.200;
}
4.4 设置健康检查
max_fails可以设置后台服务器的失败次数,fail_timeout可以设置后台服务器的失败超时时间
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
server 192.168.99.100;
server 192.168.99.200 max_fails=2 fail_timeout=30;
}
4.5 设置相同客户端访问相同Web服务器
ip_hash根据客户端IP分配固定的后端服务器
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
ip_hash;
server 192.168.99.100 ;
server 192.168.99.200 ;
}
4.6 添加down标记
down标记可以让集群主机暂时不参与集群活动
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
upstream webserver {
server 192.168.99.100 ;
server 192.168.99.200 down;
}
五、Nginx优化
5.1 自定义报错页面
优化前,客户端使用浏览器访问不存在的页面,会提示404文件未找到
修改Nginx配置文件,自定义报错页面
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
charset utf-8; #仅在需要中文时修改该选项
error_page 404 /test.jpg; #自定义错误页面为一张图片,图片可以从真机拷入
.. ..
[root@proxy ~]# nginx -s reload
优化后,客户端再次使用浏览器访问不存在的页面,会看到图片
5.2 查看服务器状态信息
编译安装时使用--with-http_stub_status_module开启状态页面模块
[root@proxy nginx]# cd ~/lnmp_soft/nginx-1.22.1/
[root@proxy nginx-1.22.1]# ./configure \
> --with-stream #开启4层代理模块
> --with-http_stub_status_module #开启status状态页面
[root@proxy nginx-1.22.1]# make #编译
[root@proxy nginx-1.22.1]# killall nginx
[root@proxy nginx-1.22.1]# cp objs/nginx /usr/local/nginx/sbin/ #覆盖原文件
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx #开启nginx
修改Nginx配置文件,定义状态页面
[root@proxy ~]# cat /usr/local/nginx/conf/nginx.conf
… …
location /status {
stub_status on;
#allow IP地址;
#deny all;
}
… …
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
优化后,查看状态页面信息
[root@proxy ~]# curl http://192.168.99.5/status
Active connections: 1
server accepts handled requests
10 10 3
Reading: 0 Writing: 1 Waiting: 0
Active connections:当前活动的连接数量。
Accepts:已经接受客户端的连接总数量。
Handled:已经处理客户端的连接总数量。
Requests:客户端发送的请求数量。
Reading:当前服务器正在读取客户端请求头的数量。
Writing:当前服务器正在写响应信息的数量。
Waiting:当前多少客户端在等待服务器的响应。
5.3 优化Nginx并发量
优化前使用ab高并发测试,使用web1或proxy自己作为海量客户(防火墙与selinux都关闭
[root@proxy ~]# ab -n 100 -c 100 http://192.168.99.5/ #-n任务量,-c是连接数
...
...
100% #成功
[root@proxy ~]# ab -n 2000 -c 2000 http://192.168.99.5/
Benchmarking 192.168.99.5 (be patient)
socket: Too many open files (24) #失败
修改Nginx配置文件,增加并发量
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
worker_processes 2; #与CPU核心数量一致
events {
worker_connections 50000; #每个worker最大并发连接数
}
.. ..
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
优化Linux内核参数(最大文件数量)
[root@proxy ~]# ulimit -n #查看最大文件数量
[root@proxy ~]# ulimit -n 100000 #临时设置最大文件数量
[root@proxy ~]# vim /etc/security/limits.conf
.. ..
* soft nofile 100000
* hard nofile 100000
#该配置文件分4列,分别如下:
#用户或组 硬限制或软限制 需要限制的项目 限制的值
5.4 优化Nginx数据包头缓存
优化前,使用脚本测试超长头部请求是否能获得响应
默认情况下nginx无法支持长地址栏,会报414错误
[root@proxy ~]# cat lnmp_soft/buffer.sh
#!/bin/bash
URL=http://192.168.99.5/index.html?
for i in {1..5000}
do
URL=${URL}v$i=$i
done
curl $URL #经过5000次循环后,生成一个超长的URL地址
[root@proxy ~]# ./buffer.sh
.. ..
<center><h1>414 Request-URI Too Large</h1></center> #访问失败
修改Nginx配置文件,增加数据包头部缓存大小
[root@proxy ~]# vim /usr/local/nginx/conf/nginx.conf
.. ..
http {
client_header_buffer_size 200k; #请求包头信息的缓存大小
large_client_header_buffers 4 200k; #大请求包头部信息的缓存个数与容量
.. ..
}
[root@proxy ~]# /usr/local/nginx/sbin/nginx -s reload
六、Session共享
当nginx将用户的请求分发到不同的服务器时,如果用户的两次请求被分发到了不同的服务器,而这些服务器之间没有共享session信息,就会出现session不一致的问题。具体来说,如果用户的第一次请求被分发到服务器A,并在该服务器上创建了session,而第二次请求被分发到服务器B,但服务器B上没有该用户的session信息,那么服务器B就无法识别用户的会话状态,导致用户需要重新登录或遇到其他会话相关的问题。
Nginx的Session共享主要解决以下几个问题:
- 单点登录(SSO):在单点登录系统中,用户只需要在一个地方登录,就可以访问所有与之关联的服务。Nginx通过Session共享,可以确保用户在不同服务之间的会话状态保持一致。
- 服务器集群:在服务器集群环境中,Nginx作为负载均衡器,将用户请求分发到不同的服务器上。如果每个服务器都独立维护Session,那么当用户请求被分发到不同的服务器时,可能会出现Session不一致的情况。通过Session共享,可以确保无论请求被分发到哪个服务器,用户都能保持一致的会话状态。
我们将使用Session共享存储:使用共享存储后端(如Redis、Memcached等)来存储Session数据。Nginx将用户的Session数据存储在共享存储中,并通过某种机制(如Session标识符)来关联用户的请求和Session数据。当用户请求到达不同的服务器时,这些服务器可以从共享存储中获取用户的Session数据,从而实现Session共享。
6.1 构建redis服务
redis安装-CSDN博客
6.2 服务器安装redis扩展
web主机上安装redis扩展
yum -y install phpredis-5.1.0-1.x86_64.rpm
6.3 服务器上部署Session共享
修改PHP-FPM配置文件,并重启服务
[root@web1 ~]# vim /etc/php-fpm.d/www.conf #修改该配置文件的两个参数
# 最后一页的部分内容,修改前效果如下:
php_value[session.save_handler] = files
php_value[session.save_path] = /var/lib/php/session
# 修改后效果如下:
php_value[session.save_handler] = redis
php_value[session.save_path] = "tcp://192.168.99.5:6379"
[root@web1 ~]# systemctl restart php-fpm
版权归原作者 我爱云计算 所有, 如有侵权,请联系我们删除。