一、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. 安装依赖
dnf -y install gcc pcre-devel openssl-devel make
2. 创建运行用户
useradd nginx				#创建用于用于启动服务
3. 上传并解压源码包
tar -xf /root/nginx-1.22.1.tar.gz    	 #解压源码包
cd nginx-1.22.1							 #切换目录
4. 配置编译参数
./configure \       							  #初始化
> --prefix=/usr/local/nginx \                     #指定安装目录为/usr/local/nginx
> --user=nginx \                                  #指定用户名(运行服务后进程的所有者)
> --group=nginx \                                 #指定组(运行服务后进程的组)
> --with-http_ssl_module                          #支持加密功能
5. 编译并安装
make && make install    #编译 并 编译安装
6. 查看安装目录
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:检查主配置文件语法

查看版本与编译参数

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

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

检查配置文件语法

/usr/local/nginx/sbin/nginx -t

服务控制命令

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

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

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

查看端口与进程

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主配置文件解析,无需操作

核心配置段

[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:默认首页
server  {
  listen            监听端口;  #直接写个端口号就默认所有ip监听此端口
  server_name       域名;
  location / {                  #匹配用户访问的URL(后边重点讲,暂时知道即可)
      root          网页根目录;
      index         首页文件;
  }
}

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

Apache和Nginx虚拟主机的语法对比:
请添加图片描述


四、Nginx 用户认证

  • 为了使站点访问时更加安全,可以为站点增加用户认证
[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会在该文件中追加新用户。指定的位置必须和配置文件中配置的一样)
[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主机:访问的域名不同,则访问的网站不同
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主机:访问的端口不同,则访问的网站不同
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.com:8080与www.haha.com:8000会进入不同的网站

基于IP地址的虚拟主机配置模板
  • 基于IP地址的虚拟web主机:访问的IP地址不同,则访问的网站不同
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主机
[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主机
[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服务的配置文件,需要重新加载配置文件
[root@server ~]# /usr/local/nginx/sbin/nginx -s reload        #重新加载配置文件
[root@server ~]# ss -nutlp | grep :80                         #查看端口,确保端口正常运行

如果nginx修改完配置文件,重新加载配置文件报错,可以根据提示进行错误定位,排错
也可以使用/usr/local/nginx/sbin/nginx -t 检查主配置文件的语法是否正确,如有报错,则定位错误配置并排查

  • client主机修改/etc/hosts文件,解析www.a.cm和www.b.com,并且访问域名测试
[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值就会恢复)
[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加密工具
  • 公钥、私钥、证书(内含公钥)
[root@server ~]# cd  /usr/local/nginx/conf          #切换目录
[root@server ~]# openssl genrsa 2048 > cert.key    #生成一个2048位的私钥,保存至cert.key
[root@server ~]# openssl req -new -x509 -key cert.key > cert.pem  #生成证书(内含公钥)
#注:req请求, -x509生成证书,-new新的证书,-key使用刚才的私钥文件,保存在cert.pem

openssl:开源加密工具套件,Linux 默认自带,专门用来生成密钥、证书、加密解密。
genrsa:openssl 子命令,专门生成 RSA 非对称私钥。

补充优化写法: 加有效期,默认只有 30 天,改成十年:

  • openssl req -new -x509 -key cert.key -days 3650 -out cert.pem

  • days 3650:证书有效期 10 年

  • out 标准输出,比 > 更规范


  • 修改Nginx主配置文件,配置加密的虚拟web主机
  • 默认配置文件最下方有配置模板,打开注释修改即可
  • 一定要确定在nginx安装的时候开启了加密模块(–with-http_ssl_module)
[root@serverwork conf]# openssl req -new -x509 -key cert.key > cert.pem
...此处省略一段文字...

Country Name (2 letter code) [XX]:CN   #这里填国家,我们就写CN
State or Province Name (full name) []:BJ  #省份,随便填或直接回车留空
Locality Name (eg, city) [Default City]:  #城市名:回车跳过
Organization Name (eg, company) [Default Company Ltd]:  #公司 / 组织名:回车跳过
Organizational Unit Name (eg, section) []:  #部门:回车跳过
Common Name (eg, your name or your server's hostname) []:www.oa.com   #重点!填你的域名,比如 www.haha.com,没有域名就填服务器 IP
Email Address []:  #邮箱:直接回车跳过

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

  • 修改Nginx主配置文件,配置加密的虚拟web主机

注:这一段不必手敲,在主配置文件下面有注释的模板

[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;        #指定私钥文件
        
        ssl_session_cache    shared:SSL:1m; #下面四段是默认配置,不用管
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;
        
        location / {
            root   https;                     #指定网页根目录/usr/local/nginx/https
            index  index.html index.htm;
        }
    }
...此处省略1万字...
  • 创建加密虚拟web主机的网页根目录,创建默认首页文件
  • 重新加载配置文件
[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文件,指定域名解析,访问测试
[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地址访问

步骤总结:

请添加图片描述

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐