Nginx服务搭建案例

Nginx服务

安装和启动

  1. 解压源码
tar -xvf nginx-xx.xx.xx.tar.gz
  1. 配置(模块有很多,这里以ssl为例)
# 配置安装路径,指定服务运行时使用的用户,安装HTTP SSL模块
./configure --prefix=/usr/local/nginx --user=nginx --with-http_ssl_module
  1. 编译和安装
make -j4 && make install
  1. 创建用户
user -M nginx -s /sbin/nologin
  1. 启动,关闭,重启,查看配置
# 启动
/usr/local/nginx/sbin/nginx
# 关闭 killall nginx也可行
/usr/local/nginx/sbin/nginx -s stop
# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
# 查看版本和配置
/usr/local/nginx/sbin/nginx -V

网站认证

  1. 编辑配置文件
vim /usr/local/nginx/conf/nginx.confserver {...auth_basic "请输入用户名和密码";  # 提示信息auth_basic_user_file "/usr/local/nginx/pass";  # 存放网站账户的文件...
}
  1. 创建验证文件
yum install -y httpd-tools
# 第一次需要创建pass文件,所以需要加-c
htpasswd -c /usr/local/nginx/pass test
New password: # 输入密码
Re-type new password: # 再次输入密码
Adding password for user test01# 添加第二个用户,不要加-c
htpasswd /usr/local/nginx/pass bhlu
New password: # 输入密码
Re-type new password: # 再次输入密码
Adding password for user test02
  1. 重新加载配置
/usr/local/nginx/sbin/nginx -s reload

多域名访问

  1. 编辑配置文件
vim /usr/local/nginx/conf/nginx.confhttp {...server {listen  80; server_name www.a.com;  # www.a.com这个域名root html_b;  # 网站根目录index index.html;  # 主页文件}server {listen  80; server_name www.b.com;  # www.b.com这个域名root html_b;  # 网站根目录index index.html;  # 主页文件}
}
  1. 创建网站根目录和主页文件
mkdir /usr/local/nginx/{html_a,html_b}
echo "aaa" > /usr/local/nginx/html_a/index.html
echo "bbb" > /usr/local/nginx/html_b/index.html
  1. 重新加载配置
/usr/local/nginx/sbin/nginx -s reload

配置加密网站

  1. 编辑配置文件
vim /usr/local/nginx/conf/nginx.confserver {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;}
}
  1. 创建网站根目录,并创建主页文件
mkdir /usr/local/nginx/https
echo "test https~~~" > /usr/local/nginx/https/index.html
  1. 生成私钥
openssl genrsa > /usr/local/nginx/conf/cert.key
# 输出
Generating RSA private key, 2048 bit long modulus
..........................................................................................................................................................................................+++
........................+++
e is 65537 (0x10001)
  1. 根据私钥生成公钥
openssl req -x509 -key /usr/local/nginx/conf/cert.key > /usr/local/nginx/conf/cert.pem
# 输出
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:cn  # 国家
State or Province Name (full name) []:JiangSu   # 省份         
Locality Name (eg, city) [Default City]:WuXi  # 城市
Organization Name (eg, company) [Default Company Ltd]:test  # 公司
Organizational Unit Name (eg, section) []:test  # 部门
Common Name (eg, your name or your server's hostname) []:test-server  # 服务器名称
Email Address []:test@test.com  # 电子邮件
  1. 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
  1. 进行测试
curl -k https://www.a.com
# test https~~~

LNMP

LNMP环境

  • Llinux操作系统
  • NNginx网站服务
  • Mmariadb(mysql)数据库
  • Pphp编写动态网站的语言工具
  1. 初始化nginx服务
# 关闭之前实验的nginx,并将配置恢复默认
killall nginx
cp /usr/local/nginx/conf/nginx.conf.default /usr/local/nginx/conf/nginx.conf
cp:是否覆盖"/usr/local/nginx/conf/nginx.conf"? y
  1. 安装相关软件包
# 数据库相关,这里为了简单,使用的是mariadb,mariadb(数据库客户端)、mariadb-server(数据库服务端)、mariadb-devel(数据库开发环境依赖包)
yum install -y mariadb mariadb-server mariadb-devel
systemctl start mariadb && systemctl enable mariadb
systemctl status mariadb# php相关,php(解释器)、php-fpm(帮助nginx解析php编写的动态网站的服务)、php-mysql(php与mysql关联的软件包)
yum install -y php php-fpm php-mysql
systemctl start php-fpm && systemctl enable php-fpm
systemctl status php-fpm
# php-fpm的配置文件在/etc/php-fpm.d/www.conf,里面包含了端口,服务端口,最小守护进程数量等,一个服务进程大概是25M左右
  1. 准备动态网站页面
cp /data/test.php /usr/local/nginx/html/
  1. 启动nginx服务,设置相关配置
# 启动
/usr/local/nginx/sbin/nginx# 编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
...
# 匹配以.php结尾的
location ~ \.php$ {root           html;  # 网站位置fastcgi_pass   127.0.0.1:9000;  # 找本地9000端口fastcgi_index  index.php;  # 默认主页# fastcgi_param  SCRIPT_FILENAME  /scripts$fastcgi_script_name;  # 这行无用,需要注释include        fastcgi.conf;  # 这里需要修改,使用了是另一个配置文件
}
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload

地址重写

格式:rewrite 匹配路径 实际路径 选项

  • 选项
    • redirect:临时重定向,302
    • permanent:永久重定向,301
    • last:不再读其他rewrite还是除rewrite之外的其他语句的
    • break:不再读其他语句
  1. 访问a.html实际显示b.html
vim /usr/local/nginx/conf/nginx.conf...
rewrite ^/a\.html$ /b.html;
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
  1. 访问本地的任意页面,跳转到指定网站的同页面
vim /usr/local/nginx/conf/nginx.conf...
rewrite /(.*) http://www.test.com/$1;
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
  1. 根据浏览器的不同访问不同的页面
vim /usr/local/nginx/conf/nginx.conf...
# $http_user_agent是nginx内置变量,存储了用户的信息
if ($http_user_agent ~* firefox){rewrite /(.*) /firefox/$1;
}
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
  1. last选项
# last
vim /usr/local/nginx/conf/nginx.conf...
server {...location / {rewrite /a.html /b.html last;  # 这里使用last,不再读其他的rewrite...}rewrite /b.html /c.html;
}
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload# 测试
curl 127.0.0.1/a.html  # 结果是b.html的页面
  1. break选项
# last
vim /usr/local/nginx/conf/nginx.conf...
server {...location / {rewrite /a.html /b.html break;  # 这里如果使用的是last,那么访问a.html,会显示c.html的内容,所以这里需要使用break...}location /b.html {rewrite /b.html /c.html;}
}
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload# 测试
curl 127.0.0.1/a.html  # 结果是b.html的页面

代理功能(网站业务)

环境

  • proxy:192.168.3.1
  • web1:192.168.3.100
  • web2:192.168.3.200
  1. 开启web1web2的网站服务(这里使用httpd服务)
# web1和web2
yum install -y httpd
systemctl start httpd# web1
echo "web1" > /var/www/html/index.html# web2
echo "web2" > /var/www/html/index.html
  1. proxy主机上使用nginx的代理功能
# 将之前的nginx服务删除
killall nginx
rm -rf /usr/local/nginx# 安装nginx
tar -xvf nginx-1.17.6.tar.gz
cd nginx-1.17.6/
./configure
make && make install# 编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
...
http {...# 创建集群,集群名称叫做webupstream web {server 192.168.3.100:80;server 192.168.3.200:80;}server {listen 80;...localtion / {proxy_pass http://web;  # 调用集群root html;index index.html index.htm;}...}...
}
...# 启动nginx
/usr/local/nginx/sbin/nginx
  1. 测试是否成功
for i in {1..5}; do curl 192.168.3.1; done
# web1 web2 web1 web2 web1
  1. 集群优化,设置权重,配置健康检查,相同客户机访问相同服务器
# 编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
...
http {...# 创建集群,集群名称叫做webupstream web {server 192.168.3.100:80;# weight=2: 权重2,默认权重是1# max_fails=2: 检测两次如果都失败,则判为故障# fail_timeout=30: 故障机器30s再次测试server 192.168.3.200:80 weight=2 max_fails=2 fail_timeout=30;;}server {listen 80;...localtion / {proxy_pass http://web;  # 调用集群root html;index index.html index.htm;}...}...
}
...# 重新加载配置
/usr/local/nginx/sbin/nginx -s reload
  1. 再次测试
for i in {1..5}; do curl 192.168.3.1; done
# web1 web2 web2 web1 web2

如果想要将集群中某个主机不参与集群活动

server 192.168.3.200 down;即可

四层代理(其他业务)

环境

  • proxy:192.168.3.1
  • server1:192.168.3.100
  • server2:192.168.3.200
  1. 将nginx恢复默认配置
/usr/local/nginx/sbin/nginx -s stop
cp /usr/local/nginx/conf/nginx.conf.default /usr/local/nginx/conf/nginx.conf
cp:是否覆盖"/usr/local/nginx/conf/nginx.conf"? y
  1. 重新配置编译,添加四层代理模块
# 先查看之前nginx编译所带模块
/usr/local/nginx/sbin/nginx -V
# 因为上个实验没有加模块,所以最后一行只有configure arguments: cd ~/nginx-1.17.6/
./configure --with-stream  # --with-stream 四层代理,如果之前的nginx有模块,需要在后面加上去
make  # 注意这里只需编译即可,不需要安装# 检查新编译的nginx是否符合要求
./objs/nginx -V
# 最后一行: configure arguments: --with-stream# 将新编译的nginx拷贝过去
cp ./objs/nginx /usr/local/nginx/sbin/nginx 
cp:是否覆盖"/usr/local/nginx/sbin/nginx"? y# 启动nginx试试
/usr/local/nginx/sbin/nginx
  1. 配置四层代理
vim /usr/local/nginx/conf/nginx.conf...
# 新业务,跟http同级
stream {# 新集群,叫backend,这里以集群的sshd服务作为示例upstream backend {server 192.168.3.100:22;server 192.168.3.200:22;}server {listen 10022;  # 监听端口号,访问这个端口号,就会跳转到集群中proxy_pass backend;  # 调用集群}
}http {...
}# 加载配置,如果安装的nginx没有加--with-stream,这里会报错
/usr/local/nginx/sbin/nginx -s reload
  1. 测试是否成功
ssh -p 10022 root@192.168.3.1
# 进入server1ssh -p 10022 root@192.168.3.1
# 进入server2

常见的nginx问题

  1. 配置404报错
vim /usr/local/nginx/conf/nginx.conf...
http {...server {...error_page  404              /404.html;  # 设置404页面...}
}
...
  1. 查看网站后台数据
# 需要添加一个新的模块--with-http_stub_status_module
# 查看现在的nginx
killall nginx
/usr/local/nginx/sbin/nginx -V
# nginx version: nginx/1.17.6
# built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
# configure arguments: --with-stream# 重新编译并拷贝过去
cd ~/nginx-1.17.6/
./configure --with-stream --with-http_stub_status_module  # 添加上之前的模块
make
cp ./objs/nginx /usr/local/nginx/sbin/nginx 
cp:是否覆盖"/usr/local/nginx/sbin/nginx"? y# 编辑配置文件
vim /usr/local/nginx/conf/nginx.conf
...
http {...server {...location / {root   html;index  index.html index.htm;}# 添加下面几行location /status {stub_status on;  # 显示后台的数据allow 192.168.3.1;  # 只允许192.168.3.1查看deny all;  # 拒绝其他}...}
}
...# 启动nginx
/usr/local/nginx/sbin/nginx# 本机测试查看,其他机器访问会报错403
curl 192.168.3.1/status
: << 'EOF'
Active connections: 1 
server accepts handled requests14       14      14 
Reading: 0 Writing: 1 Waiting: 0Active connections: 当前活动的连接数量,即当前有多少用户访问该网站
accepts: 已接收客户端的连接总数
handled: 已处理客户端的连接总数
requests: 客户端发送的请求数
Reading: 当前服务器正在读取客户端请求头的数量
Writing: 当前服务器正在写响应信息的数量
Waiting: 当前多少客户端在等待服务器的响应EOF

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python中的sort()与sorted()用法

Python中的sort()函数主要用于对列表&#xff08;list&#xff09;中的元素进行排序。它有两种形式&#xff1a;一种是列表的方法&#xff08;即直接对列表对象调用&#xff09;&#xff0c;另一种则是内置的sorted()函数&#xff0c;它返回一个新的已排序列表&#xff0c;而不…

因为使用ArrayList.removeAll(List list)导致的机器重启

背景 先说一下背景&#xff0c;博主所在的业务组有一个核心系统&#xff0c;需要同步两个不同数据源给过来的数据到redis中&#xff0c;但是每次同步之前需要过滤掉一部分数据&#xff0c;只存储剩下的数据。每次同步的数据与需要过滤掉的数据量级大概在0-100w的数据不等。 由…

代码随想录算法训练营第三十四天| 1005.K次取反后最大化的数组和、134. 加油站、 135. 分发糖果

1005 题目&#xff1a; 给你一个整数数组 nums 和一个整数 k &#xff0c;按以下方法修改该数组&#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。以这种方式修改数组后&#xff0c;返回数组 可能的最大和…

ccf201512-1数位之和

charAt&#xff0c;与字符’0’,做差值。 import java.util.Scanner;public class Main3 {public static void main(String[] args) {Scanner scanner new Scanner(System.in);String num scanner.nextLine();char[] arr num.toCharArray();int sum 0;for(char c : arr){i…

tmux 替换 nohup

替换方案 tmux 训练PyTorch模型的时候一个基本步骤&#xff1a; [terminal]: tmux new -s model-ft # 创建一个会话&#xff0c;并设置会话名:model-ft [tmux]: conda activate your_env # 在tmux会话中&#xff0c;我们激活我们要使用的conda环境 [tmux]: pyth…

JVM_垃圾收集器

GC垃圾收集器 文章目录 GC垃圾收集器GC垃圾回收算法和垃圾收集器关系GC算法主要有以下几种四种主要的垃圾收集器SerialParallelCMSG1垃圾收集器总结查看默认垃圾收集器 默认垃圾收集器有哪些各垃圾收集器的使用范围部分参数说明 新生代下的垃圾收集器并行GC(ParNew)并行回收GC&…

【C++航海王:追寻罗杰的编程之路】探寻实用的调试技巧

目录 1 -> 什么是bug&#xff1f; 2 -> 调试是什么&#xff1f;有多重要&#xff1f; 2.1 -> 调试是什么&#xff1f; 2.2 -> 调试的基本步骤 2.3 -> Debug和Release的介绍 3 -> Windows环境调试介绍 3.1 -> 调试环境的准备 3.2 -> 学会快捷键…

:-1: error: Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn‘t set

qt报错 错误1 : error: Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isnt set 错误1 : error: Project ERROR: msvc-version.conf loaded but QMAKE_MSC_VER isn’t set bug的现象:qtcreator无法通过点击pro文件来打开项目 方法:参考 根据上面的参考,我么找到…

【React】React hooks 清除定时器并验证效果

React hooks 清除定时器并验证效果 目录结构如下useTime hookClock.tsx使用useTime hookApp.tsx显示Clock组件显示时间&#xff08;开启定时器&#xff09;隐藏时间&#xff08;清除定时器&#xff09; 总结参考 目录结构如下 useTime hook // src/hooks/common.ts import { u…

如何批量获取商品详情数据(淘宝1688京东商品采集示例)

批量获取商品详情数据&#xff0c;尤其是在淘宝、1688和京东这样的电商平台上&#xff0c;通常涉及到网络爬虫技术。然而&#xff0c;需要注意的是&#xff0c;这些平台都有自己的反爬虫机制&#xff0c;直接爬取可能会违反其使用条款&#xff0c;甚至可能触犯法律。因此&#…

三角测量法恢复深度

参考&#xff1a;单目vo中的深度确定方法--三角测量_单目相机三角测量-CSDN博客 方法一&#xff1a;直接法 由于我们已经通过本质矩阵分解或者单应矩阵分解获得了R与t&#xff0c;此时想求的是两个特征点的深度 bool depthFromTriangulation(const SE3& T_search_ref,co…

电脑开机提示“no bootable device”,无法进入系统

当您的Windows 10电脑开机时提示“no bootable device”,这意味着计算机无法找到一个可以启动操作系统的设备。这个问题通常与硬件连接、BIOS设置、硬盘问题、引导扇区故障或系统文件损坏等有关。以下是一系列详细的解决步骤: 检查硬件连接:关闭电脑,拔掉电源线,打开机箱检…

如何创建Windows下google Chrome便携版?

创建google Chrome便携版教程 准备工作&#xff1a; 1&#xff0c;下载GoogleChromePortable启动器 2&#xff0c;下载谷歌浏览器 3&#xff0c;下载7-ZIP 解压提取器 用7zip解压GoogleChromePortable&#xff0c;得到GoogleChromePortable.exe启动器 解压谷歌浏览器 用7…

Java入门基础day29

day29 内部类 分类 非静态成员内部类 静态成员内部类 局部内部类 匿名内部类 概念 在一个类的内部&#xff0c;再定义一个完整的类 特点&#xff1a; 编译之后可以生成一个独立的字节码class文件 内部类可以直接访问外部类的私有成员&#xff0c;而不会破坏其封装性 可以为外…

Flutter之TabBar篇

总结了一下项目中用到的几种TabBar&#xff0c;针对不同的样式&#xff0c;有采用系统提供的&#xff0c;也有三方插件提供的&#xff0c;也有自定义的&#xff0c;效果如下&#xff08;后续如果遇到新的样式&#xff0c;会不间断地记录更新&#xff0c;避免重复造轮子…&#…

性能分析-数据库与磁盘知识

数据库 数据库&#xff0c;其实是数据库管理系统dbms。 数据库管理系统&#xff0c; 常见&#xff1a; 关系型数据库&#xff1a; mysql、pg、 库的表&#xff0c;表与表之间有关联关系&#xff1b; 表二维表统一标准的SQL&#xff08;不局限于CRUD&#xff09;非关系型数据…

ssm034学生请假系统+jsp

学生请假系统设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生请假系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处…

C++11 新特性:std::array

std::array是 C11 中引入的容器类型&#xff0c;它封装了固定大小的数组&#xff0c;提供了类似于 STL 容器的接口&#xff0c;同时保持了 C 风格数组的性能特性。 与普通数组相比&#xff0c;std::array更安全、更易于使用&#xff0c;并且支持迭代器。以下是std::array提供的…

-webkit-input-placeholder的意思

-webkit-input-placeholder是一个CSS伪类选择器&#xff0c;用于设置表单输入字段的占位文本样式。-webkit-input-placeholder是Webkit浏览器私有的前缀&#xff0c;用于适用于Webkit内核的浏览器&#xff08;如Chrome和Safari&#xff09;。 使用-webkit-input-placeholder&a…

鸿蒙HarmonyOS开发实例:【简单时钟】

简单时钟 介绍 本示例通过使用[ohos.display]接口以及Canvas组件来实现一个简单的时钟应用。 效果预览 主页 使用说明 1.界面通过setInterval实现周期性实时刷新时间&#xff0c;使用Canvas绘制时钟&#xff0c;指针旋转角度通过计算得出。 例如&#xff1a;"2 * M…