安装nginx源码包、nginx配置文件、定义多个虚拟主机、配置ssl加密服务
> 注意:httpd和nginx同时使用会争抢80端口,出现端口占用报错,注意端口占用情况
一、安装nginx源码包
服务端操作
解压lnmp_soft.tar.gz包
安装nginx源码包
> 安装源码包操作详见 "一阶段第三周第三天"
修改nginx配置文件
开启服务并重载配置文件
解压——配置——编译——安装
> 需要前置依赖,yum安装gcc、make、pcre-devel、openssl-devel
>
> 后三个分别为:编译工具、正则表达式依赖包、ssl加密依赖包
1.进入源码包根目录,在根目录下配置如下:
```shell
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module
```
> --prefix:nginx安装目录
>
> --user:操作nginx的用户(该用户不需要登陆系统所以创建用户时用sbin/nologin)
>
> --group:组用户
>
> --with-http_ssl_module:使用加密模块
2.make #编译
3.make install #安装
创建用户:
```shell
useradd nginx -s /sbin/nologin
```
启动服务:
```shell
/usr/local/nginx/sbin/nginx
```
> nginx服务默认通过80端口监听客户端请求
ss [参数] #命令可以查看系统中启动的端口信息
-a #显示所有端口的信息
-n #以数字格式显示端口号
-t #显示TCP连接的端口
-u #显示UDP连接的端口
-l #显示服务正在监听的端口信息,如httpd启动后,会一直监听80端口
-p #显示监听端口的服务名称是什么(也就是程序名称)
ss -antlp | grep 80 #监听测试
/usr/local/nginx/sbin/nginx [参数]
-V #查看软件信息
-s reload #重新加载配置文件
-s stop #关闭服务
二、nginx配置文件及用户认证
```shell
配置文件结构如下:
http {
...
server {
listen 80; #监听端口
server_name localhost; #网络服务器域名
#认证提示符信息,可省略
auth_basic "Input Password:";
#认证的密码文件,可省略
auth_basic_user_file "/usr/local/nginx/[密码文件]";
location / {
root html; #网页文件根目录
#完整路径:/usr/local/nginx/html
index index.html index.htm; #网页主页文件
}
...
}
...
}
```
用户认证
使用htpasswd命令创建账户文件,需要系统安装httpd-tools
htpasswd -c /usr/local/nginx/[密码文件] [用户名] #创建密码文件,-c新创建
> 如果不使用参数-c,会与重定向">"一样覆盖源文件的内容
修改后重启服务
> #确保nginx是启动状态,否则运行重启命令会报错
>
> #[error] open() "/usr/local/nginx/logs/nginx.pid" failed (2: No such file or directory)
htpasswd /usr/local/nginx/[密码文件] [用户名] #追加用户
三、定义多个虚拟主机
基于域名的虚拟主机
服务器:
1.修改nginx配置
2.创建网页文件
> 3.设置DNS服务,如果不配置,需要客户端配置本地域名映射
客户端:
修改hosts本地域名映射文件
1.
```shell
http {
.. ..
server {
listen 80; #端口
server_name www.testnginx.com; #定义虚拟主机域名
location / {
root testhtml; #指定网站根路径
index test.html; #默认页面
}
}
server {
listen 80; #端口
server_name www.examplenginx.com; #定义虚拟主机域名
location / {
root examplehtml; #指定网站根路径
index example.html; #默认页面
}
}
```
修改配置文件后重载配置文件
2.在对应的路径下创建网页
/usr/local/nginx/testhtml/test.html #创建网页测试
/usr/local/nginx/examplehtml/example.html #创建网页测试
客户端配置hosts本地域名映射文件
扩展补充:
win环境配置hosts文件目录:C:\Windows\System32\drivers\etc\hosts
打开hosts文本,在最后添加ip与域名:[192.168.88.5] [www.a.com www.b.com]
基于端口的虚拟主机
基于ip的虚拟主机
四、配置ssl加密服务
服务端操作:
修改nginx配置文件
```shell
server {
listen 443 ssl; #监听端口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;
}
}
```
生成公(证书)、私钥
```shell
openssl genrsa > conf/cert.key #生成私钥,放到cert.key文件
```
```shell
openssl req -x509 -key conf/cert.key > conf/cert.pem #-x509格式,生成证书,生成过程会询问诸如你在哪个国家之类的问题,可以随意回答
```
修改配置文件后重载配置文件
客户端操作:
```shell
curl -k https://192.168.88.5 #检验,-k是忽略安全风险
```
> 公私钥需要阿里云、亚马逊等平台购买才能使用,自己生成不会得到认可,所以会出现安全风险提示
部署LNMP并配置动静分离、Nginx地址重写、通过systemd管理Nginx服务
一、部署LNMP并配置动静分离
<img src="LINUXNSD_V01OPERATIONDAY02_005.png" style="zoom:50%;" />
> 前置安装包需求:mariadb(数据库客户端软件)、mariadb-server(数据库服务器软件)、mariadb-devel(依赖包)、php(识别php语言)、php-fpm(进程管理器服务)、php-mysqlnd(PHP的数据库扩展包)
启用mariadb和php服务
配置动静分离
两种连接方式:ip端口和socket
1.ip端口连接:
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
location ~ \.php$ { #~是使用正则表达式匹配以.php结尾,\转义
root html;
fastcgi_pass 127.0.0.1:9000; #将请求转发给本机php-fpm的9000端口
fastcgi_index index.php; #网站默认页
include fastcgi.conf; #加载fastcgi配置文件
}
```
修改php-fpm配置文件:/etc/php-fpm.d/www.conf
```shell
listen = 127.0.0.1:9000 #更改php-fpm端口号(使用网络通信)
```
重启php服务和nginx
验证
```shell
ss -antlp | grep 9000 #查看监听端口
真机下使用浏览器访问192.168.88.5/[html文件]
cp /root/lnmp_soft/php_scripts/mysql.php /usr/local/nginx/html #拷贝动态网站测试页面到nginx中
查看后进入mysql添加账户
create user dc@localhost identified by '123'; #创建测试账户
刷新后再次验证
```
2.socket连接:
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
location ~ \.php$ { #匹配以.php结尾
root html;
fastcgi_pass unix:/run/php-fpm/www.sock; #将请求转发给php-fpm进程
fastcgi_index index.php;
include fastcgi.conf; #加载fastcgi配置文件
}
```
修改php-fpm配置文件:/etc/php-fpm.d/www.conf
```shell
listen = /run/php-fpm/www.sock #socket方式(使用进程通信)
```
重启php服务和nginx,最后验证
二、Nginx地址重写
<img src="LINUXNSD_V01OPERATIONDAY02_031.png" style="zoom:50%;" />
<img src="LINUXNSD_V01OPERATIONDAY02_037.png" style="zoom:50%;" />
地址重定向:
不同网站跳转
不同网站相同子页面跳转
相同网站不同浏览器跳转不同页面
1.不同网站跳转
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
server {
listen 80;
server_name localhost;
rewrite /[源网址] /[跳转地址] #源地址重定向到跳转地址
#rewrite ^/a\.html$ /b.html;
#rewrite ^/a\.html$ /b.html redirect; #redirect重定向
#rewrite / http://www.test.cn/; #访问网站的任意内容都跳转到新网站
...
location / {
root html;
index index.html index.htm;
}
}
```
重载reload,验证
> 纯跳转后地址栏不会显示跳转的网址,使用redirect重定向跳转后地址栏会显示跳转的网址
2.不同网站相同子页面跳转
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
server {
listen 80;
server_name localhost;
#访问源网址下的子页面重定向至跳转地址下相同的子页面
rewrite /(.*) http://www.test.cn/$1;
location / {
root html;
index index.html index.htm;
}
}
```
重载reload,验证
> nginx与shell的$1参数含义不一样
3.相同网站不同浏览器跳转不同页面
创建针对不同浏览器的网页目录做实验
/usr/local/nginx/html/
├── other.html #other IE
├── chrome
│ └── index.html #test chrome
└─── firefox
└── index.html #test firefox
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
server {
listen 80;
server_name localhost;
#如果用户使用了火狐浏览器就进行地址重写,让用户看到火狐专用页面
if ($http_user_agent ~* firefox) {
rewrite (.*) /firefox/$1;
}
if ($http_user_agent ~* chrome) {
rewrite (.*) /chrome/$1;
}
location / {
root html;
index other.html;
}
```
重载reload,验证
> $http_user_agent是nginx的内置变量,包含了发起 HTTP 请求的客户端的用户代理(User-Agent)字符串,比如用的什么浏览器
三、通过systemd管理Nginx服务
| 语句 | 描述 |
| :-------------: | :-----------------------------------: |
| Description | 描述信息 |
| After | 在哪个服务之后启动 |
| Before | 在哪个服务之前启动 |
| type | 服务类型,默认为simple |
| EnvironmentFile | 定义变量文件 |
| ExecStart | 执行systemctl start需要启动的进程名称 |
| ExecStop | 执行systemctl stop需要停止的进程名称 |
| ExecReload | 执行systemctl reload需要执行的命令 |
系统服务路径:/usr/lib/systemd/system
> 拷贝一份service文件,修改内容当作nginx.service
```shell
[Unit]
Description=The Nginx Server #描述信息
#在网络程序,网络文件系统,域名解析等服务启动之后,再启动nginx
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking #forking多进程类型服务
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
#kill给程序发送QUIT退出信号,关闭nginx,相比于stop直接杀死进程,这个做法更加温和
ExecStop=/bin/kill -s QUIT $MAINPID
[Install]
WantedBy=multi-user.target
```
Nginx反向代理(七层代理)、Nginx的TCP/UDP调度器(四层代理)、
一、Nginx反向代理(七层代理)
步骤:
部署后端web服务器集群
配置Nginx代理服务器
配置upstream集群池
调节集群池权重比
<img src="/home/student/Desktop/QYF笔记&nsd2411/资源包/image-20241008213058281.png" style="zoom: 67%;" />
1.部署后端web服务器集群
两个服务器web1和web2安装httpd服务,并创建不同网页用以实验
```shell
#进入web1操作:
yum -y install httpd
echo "test web1" > /var/www/html/index.html
systemctl enable httpd --now
```
```shell
#进入web2操作:
yum -y install httpd
echo "test web2" > /var/www/html/index.html
systemctl enable httpd --now
```
2.配置Nginx代理服务器:/usr/local/nginx/conf/nginx.conf
> 配置upstream集群池并调节权重比
```shell
http {
...
#使用upstream集群池定义后端服务器集群,集群名称自定义
#使用server定义集群中的具体服务器和端口
upstream webtestserver {
#设置相同客户端访问相同Web服务器
ip_hash;
#设置权重控制weight后台服务器访问比例,权重越大任务的分配量就越大
server 192.168.99.100:80 weight=2;
#设置健康检查
#max_fails设置后台服务器连接失败的次数
#fail_timeout设置后台服务器连接失败后再次连接的等待时间
server 192.168.99.200:80 max_fails=2 fail_timeout=30;
#设置down标记使主机暂时不参与集群活动,用于停机修复或者做项目时临时借调
server 192.168.99.120:80 down;
}
server {
listen 80;
server_name localhost;
location / {
root html;
index index.html index.htm;
#通过proxy_pass将用户的请求转发给服务器集群,名称同上
proxy_pass http://webtestserver;
}
...
```
> 设置ip_hash后用户访问只会被分配给上次请求相同的服务器
二、Nginx的TCP/UDP调度器(四层代理)
使用Nginx实现TCP/UDP调度器功能,采用轮询的方式调用后端SSH服务器
<img src="image-20241008213311333.png" style="zoom: 67%;" />
```shell
添加stream参数开启4层代理模块
./configure --with-stream
/usr/local/nginx/sbin/nginx -V #查看安装模块情况
```
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
...
stream { #stream与http同级
upstream testssh { #创建集群,名称自定义
server 192.168.99.100:22; #后端SSH服务器的IP和端口
server 192.168.99.200:22;
}
server { #调用集群
listen 2222; #Nginx代理监听的端口,可以自己定义
proxy_pass testssh; #调用backend集群
}
}
http {
...
}
```
重载配置、测试连接到nginx代理服务器监听的2222接口,而不是代理服务器的22端口或者后端的web服务器
```shell
ssh 192.168.99.5 -p 12345 #使用该命令多次访问查看轮询效果
```
三、nginx的优化与查错
1.优化客户端使用浏览器访问不存在的页面192.168.99.5/xxxxxxx时提示404文件未找到
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
charset utf-8; #仅在需要中文时修改该选项,可以识别中文
error_page 404 /404.html; #当网站发生404报错时,给用户看的页面
echo "抱歉!您访问的页面不存在呢?" > html/404.html
------------------------------------------------------------------
HTTP常见状态码列表:
200 正常
301 & 302 重定向
400 请求语法错误
401 访问被拒绝
403 禁止访问
404 资源找不到
414 请求URI头部太长
500 服务器内部错误
502 代理服务器无法正常获取下一个服务器正常的应答
```
重载,测试
2.查看nginx服务网站的状态信息
需要使用--with-http_stub_status_module开启状态页面模块
```shell
[root@proxy nginx-1.22.1]# /usr/local/nginx/sbin/nginx -V
nginx version: nginx/1.22.1
built by gcc 8.5.0 20210514 (Red Hat 8.5.0-10) (GCC)
configure arguments: --with-stream --with-http_stub_status_module
```
修改nginx配置文件:/usr/local/nginx/conf/nginx.conf
```shell
server {
listen 80;
server_name localhost;
location /status { #定义状态页面
stub_status on;
allow 192.168.99.5; #允许99.5访问
deny all; #其他人全部拒绝
}
charset utf-8;
}
```
重载,测试
```shell
[root@proxy nginx-1.22.1]# curl 192.168.99.5/status
Active connections: 1
server accepts handled requests
1 1 1
Reading: 0 Writing: 1 Waiting: 0
------------------------------------------------------------------
Active connections:当前活动的连接数量,有多少人访问网站
Accepts:已经接受客户端的连接总数量,有多少人曾经来过
Handled:已经处理客户端的连接总数量
Requests:客户端发送的请求数量
Reading:当前服务器正在读取客户端请求头的数量
Writing:当前服务器正在写响应信息的数量,指服务器正在给客户回应信息
Waiting:当前多少客户端在等待服务器的响应
```
3.优化Nginx并发量
并发测试,使用测试主机作为海量客户访问proxy主机
```shell
#-n任务量,-c是连接数
ab -n 10000 -c 10000 http://192.168.99.5/
socket: Too many open files (24) #linux系统有限制,文件打开数量不超过1024
```
优化Linux内核参数可打开最大文件数量(临时)
```shell
ulimit -n #查看最大文件数量
ulimit -n 100000 #临时设置最大文件数量
```
修改后,再次测试;
设置可打开最大文件数量目录(永久):/etc/security/limits.conf
```shell
* soft nofile 100000
* hard nofile 100000
#用户或组 软限制或硬限制 需要限制的项目 限制的值
```
重启系统生效
服务器主机增加并发量修改Nginx配置文件目录:/usr/local/nginx/conf/nginx.conf
```shell
worker_processes 2; #与真机CPU核心数量一致
events {
worker_connections 50000; 单个工作进程可接受访问的数量
}
```
重载,测试
4.优化Nginx数据包头缓存支持超长地址
默认情况下nginx无法支持长地址栏,会报414错误
修改Nginx配置文件,增加数据包头部缓存大小
```shell
http {
client_header_buffer_size 200k; #请求包头信息的缓存大小,默认1k
large_client_header_buffers 4 200k; #请求包头部信息的缓存个数与容量
include mime.types;
default_type application/octet-stream;
....
}
```
重载,测试
5.浏览器本地缓存静态数据
修改Nginx配置文件,定义对静态页面的缓存时间
```shell
server {
...
location ~* \.(jpg|txt|png|html|php)$ {
expires 30d; #新添加,定义客户端缓存时间为30天
}
....
}
```
重载,测试,火狐浏览器查看本地缓存数据访问about:cache