Linux基础19

安装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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值