# Linux运维Day01:Nginx基础

一、Nginx 安装

环境准备

  • 主机名:server
  • IP:192.168.8.101/24
  • 工具:WindTerm 远程连接

Web 服务器对比

  • Unix和Linux平台下
    • Apache(php)、Nginx(高并发)、Tengine、Lighttpd
    • Tomcat(java)、BM WebSphere、Jboss

Apache,Tomcat和Nginx都支持http和https协议

  • Windows平台下
    • 微软公司的IIS(Internet Information Server)

Nginx 简介

  • Nginx("engine x")
  • 是俄罗斯人编写的十分轻量级的HTTP服务器
  • 是一个高性能的HTTP和反向代理服务器,同时也是一个IMAP/POP3/STMP代理服务器
  • 默认端口号:80
  • 官方网站:http://nginx.org/

Nginx 两种安装方式

  • Nginx安装有两种方式:
    • rpm软件包安装
    • 源码编译安装(功能可以自定义、更加灵活)
  • nginx-1.22.1.tar.gz (可以在Nginx官网下载)上传至虚拟机/root目录
    • Nginx的依赖包:
      • gcc:C语言解释器
      • pcre-devel:是nginx支持正则表达式的扩展功能包
      • openssl-devel:是nginx支持加密功能的扩展功能包
      • make:提供make编译命令

源码编译安装完整步骤

1. 安装依赖
bash 复制代码
dnf -y install gcc pcre-devel openssl-devel make
2. 创建运行用户
bash 复制代码
useradd nginx				#创建用于用于启动服务
3. 上传并解压源码包
bash 复制代码
tar -xf /root/nginx-1.22.1.tar.gz    	 #解压源码包
cd nginx-1.22.1							 #切换目录
4. 配置编译参数
bash 复制代码
./configure \       							  #初始化
> --prefix=/usr/local/nginx \                     #指定安装目录为/usr/local/nginx
> --user=nginx \                                  #指定用户名(运行服务后进程的所有者)
> --group=nginx \                                 #指定组(运行服务后进程的组)
> --with-http_ssl_module                          #支持加密功能
5. 编译并安装
bash 复制代码
make && make install    #编译 并 编译安装
6. 查看安装目录
bash 复制代码
ls /usr/local/nginx     #查看安装目录,有数据表示已安装

Nginx 目录结构

  • /usr/local/nginx:安装根目录
  • conf配置文件目录
    • conf/nginx.conf主配置文件
  • html:(/usr/local/nginx/html)默认网页根目录
  • logs:存放日志文件的目录
  • sbin主程序目录
    • sbin/nginx:启动程序

二、Nginx 进程管理

  • 启动Nginx服务:
    • 通过源码编译安装的程序使用脚本程序来管理服务的启停
    • nginx的服务管理程序:/usr/local/nginx/sbin/nginx
    • -V(大写):查看编译参数(小写v仅查看版本)
    • -t:检查主配置文件语法

查看版本与编译参数

bash 复制代码
/usr/local/nginx/sbin/nginx -V  #查看nginx版本信息和编译时的参数

/usr/local/nginx/sbin/nginx -v   #仅查看nginx版本信息

检查配置文件语法

bash 复制代码
/usr/local/nginx/sbin/nginx -t

服务控制命令

  • Nginx服务启动、停止、重新加载配置文件
  • nginx启动后不能重复启动,否则会报错端口被占用(Address already in use)
bash 复制代码
# 停止Nginx
/usr/local/nginx/sbin/nginx -s stop

# 启动Nginx
/usr/local/nginx/sbin/nginx

# 重新加载配置(不中断业务)
/usr/local/nginx/sbin/nginx -s reload

查看端口与进程

bash 复制代码
ss -nutlp | grep :80
ps aux | grep nginx

进程说明

  • master:主管理进程
  • worker:工作进程(真正提供服务)

一个master可以管理多个worker进程

访问测试

浏览器访问(网络路径):http://192.168.8.101

默认首页位置(实际路径):/usr/local/nginx/html/index.html

/usr/local/nginx/html是nginx服务默认的网页根目录,存放所有网页


三、Nginx 配置文件详解

  • Nginx主配置文件:/usr/local/nginx/conf/nginx.conf
  • Nginx主配置文件解析,无需操作

核心配置段

bash 复制代码
[root@server ~]# vim /usr/local/nginx/nginx.conf       #打开Nginx主配置文件
#user  nobody;                        #指定启动用户
worker_processes  1;                  #工作进程数(与cpu数相同)

#error_log  logs/error.log;            #错误日式位置(相对路径):/usr/local/nginx/logs/error.log
#error_log  logs/error.log  notice;     #只要notice的日志
#error_log  logs/error.log  info;

#pid        logs/nginx.pid;            

#nginx的PID存放位置。
#当运行Nginx时就会自动创建,Nginx停止自动删除。
#必须要有这个pid文件才能正常停止nginx进程,否则会报错;nginx每次运行都会重新创建pid文件;若在运行前就存在,则会被新建的覆盖


events {
    worker_connections  1024;          #每个工作进程的最大连接数(最大并发量)。影响Nginx访问量的取决于硬件
}


http {
    include       mime.types;
    default_type  application/octet-stream;

    #log_format  main  '$remote_addr - $remote_user [$time_local] "$request" ' #定义了日志格式
    #                  '$status $body_bytes_sent "$http_referer" '
    #                  '"$http_user_agent" "$http_x_forwarded_for"';

    #access_log  logs/access.log  main;

    sendfile        on;
    #tcp_nopush     on;

    #keepalive_timeout  0;
    keepalive_timeout  65;        #会话保持时间。客户端长连接超时65秒,网页空闲65秒无请求则断开,节省服务器开支

    #gzip  on;
    server {                                #虚拟web主机配置,一个server就是一个网站
        listen       80;                    #监听80端口,没有写IP地址,默认就是本机所有IP地址都监听
        server_name  localhost;             #域名

        #charset koi8-r;

        #access_log  logs/host.access.log  main;    #访问日志

        location / {                        #匹配用户的访问URL,如果的意思,后边会重点讲解
            root   html;                    #此虚拟web主机的默认网页根目录
            index  index.html index.htm;    #此虚拟web主机的默认首页文件,匹配即停止
        }

        #error_page  404              /404.html;

        # redirect server error pages to the static page /50x.html
        #
        error_page   500 502 503 504  /50x.html;   #报错之后的处理
        location = /50x.html {
            root   html;                            #报错之后找这个
        }

        # proxy the PHP scripts to Apache listening on 127.0.0.1:80
        #
        #location ~ \.php$ {                    #Nginx支持php动态页面的配置
        #    proxy_pass   http://127.0.0.1;
        #}

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        #
        #location ~ \.php$ {                   #Nginx支持php动态页面的配置
        #    root           html;
        #    fastcgi_pass   127.0.0.1:9000;
        #    fastcgi_index  index.php;
        #    fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;
        #    include        fastcgi_params;
        #}

        # deny access to .htaccess files, if Apache's document root
        # concurs with nginx's one
        #
        #location ~ /\.ht {
        #    deny  all;
        #}
    }


    # another virtual host using mix of IP-, name-, and port-based configuration
    #
    #server {                            #虚拟web主机模板
    #    listen       8000;
    #    listen       somename:8080;
    #    server_name  somename  alias  another.alias;

    #    location / {
    #        root   html;
    #        index  index.html index.htm;
    #    }
    #}


    # HTTPS server
    #
    #server {                            #加密的虚拟web主机模板
    #    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   html;
    #        index  index.html index.htm;
    #    }
    #}

}

Nginx虚拟web主机核心语法

  • user:运行用户
  • worker_processes:工作进程数
  • worker_connections:单进程最大连接数
  • keepalive_timeout:长连接超时时间
  • listen:监听端口
  • server_name:域名
  • root:网页根目录
  • index:默认首页
bash 复制代码
server  {
  listen            监听端口;  #直接写个端口号就默认所有ip监听此端口
  server_name       域名;
  location / {                  #匹配用户访问的URL(后边重点讲,暂时知道即可)
      root          网页根目录;
      index         首页文件;
  }
}

注意server与{之间的空格;每一个语句结束都要以分号结尾

Apache和Nginx虚拟主机的语法对比:


四、Nginx 用户认证

  • 为了使站点访问时更加安全,可以为站点增加用户认证
bash 复制代码
[root@server ~]# cp /usr/local/nginx/conf/nginx.conf    /opt    #备份nginx主配置文件,防止出错
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf           #修改主配置文件
...此处省略1万字...
server  {
...此处省略1万字...
 location / {    #如果访问此网站
            root   html;
            index  index.html index.htm;
            auth_basic "auth-domain";                      #开启用户认证功能,指定提示文字
            auth_basic_user_file "/usr/local/nginx/pass";  #指定认证文件位置
        }
...此处省略1万字...
}
  • 根据nginx主配置文件中的内容,创建用户认证文件
  • 使用htpasswd命令 创建登录的认证用户(用户名admin,密码123456)
    • -c:创建指定的用户名密码存放的文件(如已存在此文件则无需重复-c,否则覆盖原有用户。不加-c会在该文件中追加新用户。指定的位置必须和配置文件中配置的一样)
bash 复制代码
[root@server ~]# dnf -y install httpd-tools                  #安装软件包,提供htpasswd命令
[root@server ~]# htpasswd -c /usr/local/nginx/pass  admin    #创建登录用户,并记录至指定文件
New password:           #密码123456,输入后回车,不显示
Re-type new password:   #确认密码,输入后回车,不显示
[root@server ~]# htpasswd  /usr/local/nginx/pass  tom        #无需重复-c创建新文件(密码123456)
[root@server ~]# /usr/local/nginx/sbin/nginx  -s  reload     #重新加载nginx配置文件
[root@server ~]# ss -nutlp | grep  :80                       #确保端口正常运行
  • 使用Windows浏览器访问测试
  • 刷新nginx配置文件后,如果网页未能及时更新,请清空浏览器缓存重新访问
    • 用户名:admin
    • 密码:123456

注意:该配置写在哪个server,就对哪个server的网站生效

服务的配置文件是用来控制服务的功能的


五、Nginx 虚拟 Web 主机

  • 虚拟web主机技术:使用一个nginx服务搭建多个web网站

虚拟主机三种类型

  1. 基于域名(最常用)
  2. 基于端口
  3. 基于 IP
基于域名虚拟主机配置模板(重点)
  • 基于域名的虚拟web主机:访问的域名不同,则访问的网站不同
nginx 复制代码
server {
    listen 80;
    server_name www.a.com;  #域名1
    location / {
        root /usr/local/nginx/a;   #域名1的网页根目录
        index index.html;   #默认首页
    }
}

server {
    listen 80;
    server_name www.b.com;  #域名2
    location / {
        root /usr/local/nginx/b;  #域名2的网页根目录
        index index.html;
    }
}
基于端口虚拟主机配置模板
  • 基于端口的虚拟web主机:访问的端口不同,则访问的网站不同
bash 复制代码
server  {
  listen  8080;                   #端口8080
  server_name  www.haha.com;      #同一个域名
  ...
  root  /usr/local/nginx/haha;    #网页根目录1
  ...
}
server  {
  listen  8000;                   #端口8000
  server_name  www.haha.com;      #同一个域名  
  ...
  root  /usr/local/nginx/xixi;    #网页根目录2
  ...
}

访问www.haha.com8080与www.haha.com:8000会进入不同的网站

基于IP地址的虚拟主机配置模板
  • 基于IP地址的虚拟web主机:访问的IP地址不同,则访问的网站不同
bash 复制代码
server  {
  listen  192.168.8.101:80;          #第一个IP地址监听80端口
  server_name  www.haha.com;         #同一个域名
  ...
  root  /usr/local/nginx/haha;       #网页根目录1
  ...
}
server  {
  listen  192.168.2.101:80;        #第二个IP地址监听80端口
  server_name  www.haha.com;         #同一个域名  
  ...
  root  /usr/local/nginx/xixi;       #网页根目录2
  ...
}

实战配置步骤

  • 完成以下两个基于域名的虚拟web主机
  • 第一个虚拟web主机
    • 监听端口:80
    • 域名:www.a.com
    • 网页根目录:/usr/local/nginx/a
    • 默认首页:index.html
    • 默认首页内容:aaa
  • 第二个虚拟web主机
    • 监听端口:80
    • 域名:www.b.com
    • 网页根目录:/usr/local/nginx/b
    • 默认首页:index.html
    • 默认首页内容:bbb
  • 配置第一个虚拟web主机
bash 复制代码
[root@server ~]# cp /usr/local/nginx/conf/nginx.conf /opt/    #备份nginx主配置文件,防止写错
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf         #修改主配置文件
...此处省略1万字,在第33行下方插入...
    server {                                    #server {} 表示这是一个虚拟web主机
        listen 80;                              #监听80端口
        server_name www.a.com;                  #域名为www.a.com
        location / {                            #匹配此域名
                root /usr/local/nginx/a;        #指定网页根目录
                index index.html index.htm;     #指定首页文件,匹配即停止
        }   
    } 
 ...此处省略1万字...
 [root@server ~]# mkdir /usr/local/nginx/a                    #创建网页根目录
 [root@server ~]# echo aaa > /usr/local/nginx/a/index.html    #创建首页文件,内容为aaa
  • 配置第二个虚拟web主机
bash 复制代码
[root@server ~]# cp /usr/local/nginx/conf/nginx.conf /opt/    #备份nginx主配置文件,防止写错
[root@server ~]# vim /usr/local/nginx/conf/nginx.conf         #修改主配置文件
...此处省略1万字,在第41行下方插入...
    server {                                    #server {} 表示这是一个虚拟web主机
        listen 80;                              #监听80端口
        server_name www.b.com;                  #域名为www.b.com
        location / {                            #匹配此域名
                root /usr/local/nginx/b;        #指定网页根目录
                index index.html index.htm;     #指定首页文件,匹配即停止
        }   
    } 
 ...此处省略1万字...
 [root@server ~]# mkdir /usr/local/nginx/b                    #创建网页根目录
 [root@server ~]# echo bbb > /usr/local/nginx/b/index.html    #创建首页文件,内容为aaa
  • 修改完配置nginx服务的配置文件,需要重新加载配置文件
bash 复制代码
[root@server ~]# /usr/local/nginx/sbin/nginx -s reload        #重新加载配置文件
[root@server ~]# ss -nutlp | grep :80                         #查看端口,确保端口正常运行

如果nginx修改完配置文件,重新加载配置文件报错,可以根据提示进行错误定位,排错

也可以使用/usr/local/nginx/sbin/nginx -t 检查主配置文件的语法是否正确,如有报错,则定位错误配置并排查

bash 复制代码
[root@client ~]# vim /etc/hosts
...在最后一行下方追加如下内容...
192.168.8.101 www.a.com www.b.com
[root@client ~]# curl   www.a.com            #客户端访问域名测试
aaa
[root@client ~]# curl   www.b.com            #客户端访问域名测试
bbb

六、HTTPS 加密网站

6.1 加密算法分类

  • 加密算法一般分为对称算法、非对称算法、信息摘要
    • 对称算法有:AES、DES,主要应用在单机数据加密
    • 非对称算法有:RSA、DSA,主要应用在网络数据加密
    • 信息摘要:MD5、sha256,主要应用在数据完整性校验
6.1.1对称加密

核心就是怎么加密,怎么解密

  • AES
  • DES
  • 应用案例:RAR5、ZIP压缩加密(单机加密)
  • 对称加密一般不用于网站加密

对称加密加解密快,但没法安全分发密钥;网站是陌生人双向通信,做不到私下提前约定同一个密钥,所以不能单独用,只能配合非对称加密用。

6.1.2非对称加密

加密、解密使用不同密钥,一把公钥、一把私钥,成对存在。

  • RSA

  • DSA

  • 应用案例:网络加密(https、ssh)

  • 非对称加密由服务端生成密钥对

  • 将公钥传递给客户端,私钥始终保存在自己的服务器上,不传递

    当进行数据传递时,客户端将公钥加密的数据传递到服务端,服务端使用私钥进行解密。

6.1.3信息摘要Hash值
  • MD5
  • SHA256
  • SHA512
  • 应用案例:数据完整性校验,只与文件内容 有关
    通过Hash可以判断文件是否被更改
    (只跟数据有关,跟文件名,权限等完全无关。
    改动数据之后再改回去Hash值就会恢复)
bash 复制代码
[root@server ~]# echo 123 > /opt/a.txt              #创建文件,内容123
[root@server ~]# md5sum /opt/a.txt                  #查看md5值
ba1f2511fc30423bdbb183fe33f3dd0f  /opt/a.txt
[root@server ~]# echo 456 >> /opt/a.txt             #修改文件内容
[root@server ~]# md5sum /opt/a.txt                  #查看md5值,已变化
c010aff9dc6276fdb7efefd1a2757658  /opt/a.txt

6.2 SSL加密网站实操步骤

步骤一:生成密钥

  • SSL加密网站的核心技术是非对称生成密钥,使用openssl加密工具
  • 公钥、私钥、证书(内含公钥)
bash 复制代码
[root@server ~]# cd  /usr/local/nginx/conf          #切换目录
[root@server ~]# openssl genrsa > cert.key 2048     #生成一个2048位的私钥,保存至cert.key
[root@server ~]# openssl req -new -x509 -key cert.key > cert.pem  #生成证书
#注:req请求, -x509生成证书,-new新的证书,-key使用刚才的私钥文件,保存在cert.pem
  • 修改Nginx主配置文件,配置加密的虚拟web主机
  • 默认配置文件最下方有配置模板,打开注释修改即可
  • 一定要确定在nginx安装的时候开启了加密模块(--with-http_ssl_module)

步骤二:4.5.2 配置加密的虚拟web主机

  • 修改Nginx主配置文件,配置加密的虚拟web主机
bash 复制代码
[root@server conf]# vim /usr/local/nginx/conf/nginx.conf      #修改配置文件
...此处省略1万字...
server {                                      #定义虚拟web主机
        listen       443 ssl;                 #开启SSL
        server_name  www.test.com;            #指定域名

        ssl_certificate      cert.pem;        #指定证书文件
        ssl_certificate_key  cert.key;        #指定私钥文件
        ...
        location / {
            root   https;                     #指定网页根目录/usr/local/nginx/https
            index  index.html index.htm;
        }
    }
...此处省略1万字...
  • 创建加密虚拟web主机的网页根目录,创建默认首页文件
  • 重新加载配置文件
bash 复制代码
[root@server conf]# mkdir    /usr/local/nginx/https                          #创建网页根目录
[root@server conf]# echo "nginx-https"  >  /usr/local/nginx/https/index.htl  #创建首页文件
[root@server conf]# /usr/local/nginx/sbin/nginx -s reload                    #重新加载配置文件
[root@server conf]# ss -nutlp | grep nginx          #查看nginx拥有443和80端口两个端口
  • 服务端重新加载配置文件
  • 客户端client主机修改/etc/hosts文件,指定域名解析,访问测试
bash 复制代码
[root@client ~]# vim /etc/hosts
...此处省略1万字...
192.168.8.101 www.a.com www.b.com www.test.com
[root@client ~]# curl -k https://www.test.com:443      #访问测试,-k忽略安全风险
  • Windows使用浏览器访问:https://192.168.8.11:443
  • Windows没有做域名解析,可以直接使用IP地址访问
相关推荐
kyle~1 小时前
调试器---GDB(Linux/Unix平台下编译型语言,C++、Go、Rust)
linux·c++·unix
头发够用的程序员1 小时前
WSL2 Ubuntu 24.04 离线安装 Docker 全流程
linux·ubuntu·docker
xingfujie1 小时前
第1章:整体架构与准备工作
linux·云原生·容器·架构·kubernetes·kubelet
jsons11 小时前
linux 用户内存保障管理配置
linux·运维·服务器
IT大白鼠1 小时前
Ansible vs 运维智能体:自动化工具的优劣对比与适用场景分析
运维·自动化·ansible
北京智和信通1 小时前
智和信通助力某信息工程大学实现校园全域运维监控
运维·服务器·网络监控·网络管理软件·网管软件·网管运维·网络管理系统
用户2367829801681 小时前
Linux top 命令深度解析:进程监控的性能优化实战
linux
老王谈企服1 小时前
从技术选型角度看跨境电商全流程自动化解决方案的演进
运维·自动化
运维老郭1 小时前
【K8S调度避坑指南】5类调度策略硬核拆解:nodeSelector不够用?亲和性、污点与容忍度生产级实战
运维·云原生·kubernetes