Nginx 生产环境部署的最佳实践

在这里插入图片描述

你好呀,我是赵兴晨,文科程序员。

最近一段时间,我一直在和大家一起探讨Nginx的相关话题。期间,我收到了很多小伙伴的私信,他们好奇地问我:在生产环境中,Nginx应该如何配置?

他们在日常的开发工作中,大多只接触到了增删改查等基础操作,对于Nginx的部署并不熟悉。

今天,就让我们来一起深入了解一下,打破“Java程序员不能部署Nginx”的刻板印象。我们来动手实践,看看如何将Nginx部署到生产环境中

文章篇幅过长建议先收藏后再细品。

实验环境:Centos7.9 4核8g SSD 100G

步骤1: 安装依赖

yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel make wget

• gcc: 这是GNU编译器集合(GNU Compiler Collection),用于编译C、C++等语言编写的源代码。它是开发新程序和编译现有程序的核心工具
• pcre: PCRE(Perl Compatible Regular Expressions)是一个Perl库,用于正则表达式模式匹配。它提供了对正则表达式的实现,这在文本处理和字符串分析中非常有用。
• pcre-devel: 这是PCRE的开发版本,包含了头文件和库文件,用于开发需要使用PCRE功能的程序。
• zlib: zlib是一个提供数据压缩功能的库。它支持DEFLATE压缩算法,广泛用于网络传输和文件压缩。
• zlib-devel: 与zlib类似,但这是开发版本,包含了开发新软件时所需的头文件和开发库。
• openssl: OpenSSL是一个强大的开源工具包,用于实现安全套接层(SSL)和传输层安全(TLS)协议,以及加密、解密、证书生成等安全功能。
• openssl-devel: 这是OpenSSL的开发版本,包含了用于开发支持SSL/TLS功能的应用程序的开发库和头文件。
• make: Make是一个构建自动化工具,它自动编译和链接程序,根据依赖关系来确定哪些部分需要重新编译。它通常用于大型项目,其中源代码分布在多个文件中。

步骤2: 创建nginx用户

# 创建名为nginx的新用户组
groupadd nginx

# 创建名为nginx的用户 指定用户的主目录为/home/nginx 并添加到nginx用户组
useradd nginx -m  -d /home/nginx -g nginx

# 设置用户 nginx的密码为 nginx 生产环境可以设置的再复杂一些
echo nginx:nginx|chpasswd

步骤3: 创建nginx相关目录

# 创建相关目录
mkdir -p /usr/local/nginx/{cache,log,conf/conf.d}

# 授权/usr/local/nginx目录 所属nginx用户
chown -R nginx:nginx /usr/local/nginx

步骤4: 下载nginx包并解压

# 创建目录 用于保存下载的nginx压缩包
mkdir /opt/software/

# 切换到 /opt/software/ 目录
cd /opt/software/

# 下载 nginx-1.20.1.tar.gz
wget http://nginx.org/download/nginx-1.20.1.tar.gz

# 解压
tar -zxvf nginx-1.20.1.tar.gz

步骤5: 编译并安装 nginx

# 切换到刚解压的 nginx-1.20.1目录
cd nginx-1.20.1

# 设置预编译
./configure \
--prefix=/usr/local/nginx \
--sbin-path=/usr/sbin/nginx \
--conf-path=/usr/local/nginx/conf/nginx.conf \
--error-log-path=/usr/local/nginx/log/error.log \
--http-log-path=/usr/local/nginx/log/access.log \
--pid-path=/usr/local/nginx/nginx.pid \
--lock-path=/usr/local/nginx/nginx.lock \
--http-client-body-temp-path=/usr/local/nginx/cache/client_temp \
--http-proxy-temp-path=/usr/local/nginx/cache/proxy_temp \
--http-fastcgi-temp-path=/usr/local/nginx/cache/fastcgi_temp \
--http-uwsgi-temp-path=/usr/local/nginx/cache/uwsgi_temp \
--http-scgi-temp-path=/usr/local/nginx/cache/scgi_temp \
--user=nginx \
--group=nginx \
--with-file-aio \
--with-threads \
--with-http_addition_module \
--with-http_auth_request_module \
--with-http_dav_module \
--with-http_flv_module \
--with-http_gunzip_module \
--with-http_gzip_static_module \
--with-http_mp4_module \
--with-http_random_index_module \
--with-http_realip_module \
--with-http_secure_link_module \
--with-http_slice_module \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-http_sub_module \
--with-http_v2_module \
--with-mail \
--with-mail_ssl_module \
--with-stream \
--with-stream_realip_module \
--with-stream_ssl_module \
--with-stream_ssl_preread_module 

# 开始编译并安装
make  && make install

以下是对预编译配置相关模块的解释,都是常用的nginx模块,按需安装即可

–prefix=/usr/local/nginx 设置Nginx安装的基本目录。

–sbin-path=/usr/sbin/nginx 指定Nginx二进制文件的安装路径。

–conf-path=/usr/local/nginx/conf/nginx.conf 指定Nginx主配置文件的路径。

–error-log-path=/usr/local/nginx/log/error.log 指定错误日志文件的存放路径。

–http-log-path=/usr/local/nginx/log/access.log 指定HTTP访问日志文件的存放路径。

–pid-path=/usr/local/nginx/nginx.pid 指定存放Nginx进程ID文件的路径。

–lock-path=/usr/local/nginx/nginx.lock 指定存放Nginx锁定文件的路径。

–http-client-body-temp-path=/usr/local/nginx/cache/client_temp 指定存放客户端请求体的临时文件目录。

–http-proxy-temp-path=/usr/local/nginx/cache/proxy_temp 指定存放代理请求的临时文件目录。

–http-fastcgi-temp-path=/usr/local/nginx/cache/fastcgi_temp 指定FastCGI进程的临时文件目录。

–http-uwsgi-temp-path=/usr/local/nginx/cache/uwsgi_temp 指定uWSGI进程的临时文件目录。

–http-scgi-temp-path=/usr/local/nginx/cache/scgi_temp 指定SCGI进程的临时文件目录。

–user=nginx 指定运行Nginx进程的用户名。

–group=nginx 指定运行Nginx进程的用户组名。

–with-file-aio 启用文件异步I/O支持。

–with-threads 启用线程支持。

–with-http_addition_module 启用HTTP addition模块。

–with-http_auth_request_module 启用HTTP auth request模块。

–with-http_dav_module 启用HTTP DAV模块。

–with-http_flv_module 启用HTTP FLV模块。

–with-http_gunzip_module 启用HTTP gunzip模块。

–with-http_gzip_static_module 启用HTTP gzip static模块。

–with-http_mp4_module 启用HTTP MP4模块。

–with-http_random_index_module 启用HTTP random index模块。

–with-http_realip_module 启用HTTP realip模块。

–with-http_secure_link_module 启用HTTP secure link模块。

–with-http_slice_module 启用HTTP slice模块。

–with-http_ssl_module 启用HTTP SSL模块。

–with-http_stub_status_module 启用HTTP stub status模块。

–with-http_sub_module 启用HTTP sub模块。

–with-http_v2_module 启用HTTP/2模块。

–with-mail 启用邮件支持。

–with-mail_ssl_module 启用邮件SSL模块。

–with-stream 启用RTMP或WebRTC流模块。

–with-stream_realip_module 启用流realip模块。

–with-stream_ssl_module 启用流SSL模块。

–with-stream_ssl_preread_module 启用流SSL预读取模块。

步骤6: 修改nginx配置文件,并调优,整段复制下面的内容到终端回车。

根据自身业务需求去调整配置文件,相关配置均以注释。

cat << EOF | tee /usr/local/nginx/conf/nginx.conf
# 配置 worker 进程所属用户,用户组
user nginx nginx;

# 配置 worker 进程数量,为避免 cpu 切换损耗,配置和系统内核数一样即可,或者 auto
worker_processes auto;

#nginx pid文件
pid /usr/local/nginx/nginx.pid;

# 配置 cpu 亲和,auto 代表自动绑定
worker_cpu_affinity auto;

# nginx 进程打开文件描述符数目,此值覆盖 ulimit -n 的值,最好与优化后的ulimit -n的值相同。
worker_rlimit_nofile 1024000;

events {
    # 用这个模型来高效处理异步事件
    use epoll;

    # 设置为 on worker 进程轮流接受新链接,官方推荐设置为 off.高负载的情况下设置为 on.
    accept_mutex on;

    # worker进程是否同时接受连接所有新请求。默认为off,表示一次只接受一个新的请求。官方推荐 off
    multi_accept on;

    # 配置 一个 woker 进程处理的连接数;nginx最大的连接数:Maxclient = work_processes * worker_connections
    worker_connections 65535;
}

http {   
    include mime.types;
    # 关闭日志
    access_log off;
    # 隐藏响应头中的有关操作系统和web server(Nginx)版本号的信息,这样对于安全性是有好处的。
    server_tokens off;
    sendfile on;
    # 设置为非零值时,可限制单个 sendfile() 调用时传输的数据量。如果没有限制,一个快速 连接可能会完全占用工作进程。
    #sendfile_max_chunk 5m;
    # tcp_nopush 和 tcp_nodeny 可以一起生效
    # 等数据包累计到一定大小发送,启用 sendfile 生效
    tcp_nopush on;
    # 该选项仅在连接转换到 keep-alive ,长连接状态时启用。让 tcp 尽快发包。
    tcp_nodelay on;
    # 为了尽快释放连接,可以设置小点. 15 至 30
    keepalive_timeout 30;
    gzip on;
    # 在响应头中增加,Vary: Accept-Encoding
    #gzip_vary on;
    # gzip压缩级别1-9,数字越大压缩效果越好,压缩时间也就越长CPU越高
    #gzip_comp_level 5;
    # 申请内存时大小,如果源文件 9k,超过了 8K,那会申请 16*8K。
    #gzip_buffers 8 128k;
    #gzip_min_length 5K;
    #gzip_proxied any;
    #gzip_disable msie6;
    #gzip_http_version 1.1;
    # 文本(js、text、css、xml、json)压缩比较好,图片已经进行过压缩,在压缩,效果不是很明显,还浪费 cpu
    #gzip_types text/plain text/css text/xml text/javascript application/javascript application/json application/xml+rss application/rss+xml application/atom+xml image/svg+xml;
    # 安全相关 header
    #add_header X-Frame-Options "SAMEORIGIN" always;
    #add_header Feature-Policy "autoplay 'none'; camera 'none'" always;
    #add_header X-XSS-Protection "1; mode=block" always;
    #add_header X-Content-Type-Options "nosniff" always;
    #add_header Referrer-Policy "no-referrer-when-downgrade" always;
    #add_header Content-Security-Policy "default-src 'self' http: https: data: blob: 'unsafe-inline'" always;
    #add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
    include /usr/local/nginx/conf/conf.d/*.conf;
}
EOF

步骤7: 设置nginx开机自启

以下内容整段复制到终端回车即可。

cat << EOF |tee /etc/systemd/system/nginx.service
[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true
[Install]
WantedBy=multi-user.target
EOF

设置开机自启,并启动nginx

systemctl daemon-reload && systemctl enable --now nginx

查看nginx启动状态

systemctl status nginx

到这nginx部署结束,nginx配置建议写在 /usr/local/nginx/conf/conf.d 以 .conf 结尾的文件即可

补充几个命令

# nginx 语法检测 (用于修改nginx配置文件之后 验证配置格式是否正确)
nginx -t

# nginx 加载配置文件(推荐使用)
systemctl reload nginx 

# 或者
nginx -s reload

# 停止nginx服务
systemctl stop nginx 

# 重启nginx服务
systemctl restart nginx 

# 启动nginx服务
systemctl rtart nginx 

最后,我想说的是:点赞和分享不仅仅是一种美德,更是对未来美好生活的投资。愿每一个点在看的朋友,未来都能收获满满的幸福和成功!

你好,我是赵兴晨,一名文科程序员。我期待在文章下方看到你的留言,让我们一起交流,共同进步。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode题练习与总结:不同的二叉搜索树--96

一、题目描述 给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5示例 2&#xff1a; 输入&#xff1a;n 1 输出&…

平衡三进制小数详解与进制转换

标准三进制是“逢三进一&#xff0c;退一还三”的机制&#xff0c;平衡三进制与之类似&#xff0c;但就是偏移了一下变得对称了&#xff0c;平衡三进制与标准三进制可以相互转换&#xff0c;但这样显得有点多余了&#xff0c;所以这里只讲平衡三进制与十进制的转换。 数字系统的…

_pickle.UnpicklingError: STACK_GLOBAL requires str

导致这个报错的原因是我跑yolo的时候修改数据集了&#xff0c;里面的label.cache没有删除&#xff0c;咱只要删除掉缓存就行&#xff01;&#xff01; 我这里是已经删除掉了&#xff0c;所以图片里面没有&#xff0c;一般就是在箭头所示位置有.cache文件的

Python 全栈体系【四阶】(四十三)

第五章 深度学习 九、图像分割 3. 常用模型 3.4 DeepLab 系列 3.4.1 DeepLab v1(2015) 3.4.1.1 概述 图像分割和图像分类不一样&#xff0c;要对图像每个像素进行精确分类。在使用CNN对图像进行卷积、池化过程中&#xff0c;会导致特征图尺寸大幅度下降、分辨率降低&…

windows驱动开发-PCI和中断(二)

谈到中断使用PCI总线来作为例子是最合适的&#xff0c;在Windows发展过程中&#xff0c;PCI作为最成功的底层总线&#xff0c;集成了大量的外设&#xff0c;不夸张的说&#xff0c;目前PCI几乎是唯一的总线选择&#xff0c;故大部分情况下&#xff0c;只有PCI设备驱动程序会遇到…

【回溯】1240. 铺瓷砖

本文涉及知识点 回溯 LeetCode1240. 铺瓷砖 你是一位施工队的工长&#xff0c;根据设计师的要求准备为一套设计风格独特的房子进行室内装修。 房子的客厅大小为 n x m&#xff0c;为保持极简的风格&#xff0c;需要使用尽可能少的 正方形 瓷砖来铺盖地面。 假设正方形瓷砖的…

【C++小语法】引用和内联函数(完结篇)

在使用C语言编程过程中&#xff0c;C语言的要求之严格&#xff0c;编程过程之繁琐&#xff0c;大同小异的重复性工作&#xff0c;令C之父使用C语言编程时也深受其扰&#xff0c;于是乎C兼容C小语法诞生了 一、引用 1.引用概念 在C中&#xff0c;引用&#xff08;Reference&am…

SpringCloud------Feign,Geteway

Feign 所以我们使用一门新的技术&#xff1a;声明式的http客户端Feign 第一步&#xff1a;引入依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency> …

C++ | Leetcode C++题解之第90题子集II

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<int> t;vector<vector<int>> ans;vector<vector<int>> subsetsWithDup(vector<int> &nums) {sort(nums.begin(), nums.end());int n nums.size();for (int mask …

C++青少年简明教程:赋值语句

C青少年简明教程&#xff1a;赋值语句 赋值语句是编程中最基本也是最常用的概念之一&#xff0c;它用于将一个值分配给一个变量。 使用等号&#xff08; 称为赋值运算符&#xff09;来给变量赋值&#xff0c;赋值语句的左边是要赋值的变量&#xff0c;右边是要赋给变量的值。C…

PHP 自提时间

前端: 后台设置: 代码: public function getBusinessHour(){// 需求单门店$data (new StoreModel())->limit(1)->select()->toArray();$days explode(,, $data[0][shop_hours]);$businessHours $days[1];// 使用 explode 分割字符串&#xff0c;获取开始和结束时…

Nodejs 第七十章(OSS)

OSS OSS&#xff08;Object Storage Service&#xff09;是一种云存储服务&#xff0c;提供了一种高度可扩展的、安全可靠的对象存储解决方案 OSS 对象存储以对象为基本存储单元&#xff0c;每个对象都有唯一的标识符&#xff08;称为对象键&#xff09;和数据。这些对象可以…

【教程】Jetson安装PyQt5和CUDA版OpenCV

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;请不吝给个[点赞、收藏、关注]哦~ 安装PyQt5 注意目前似乎只支持Python3.6&#xff01;&#xff01;&#xff01; sudo apt install pyqt5* -y sudo apt-get install python3-pyqt…

基于HTTP GET方式获取网络时间的实现

上一节&#xff0c;我们介绍了基于NTP服务器获取网络时间的例子&#xff0c;但在有些情况下&#xff0c;比如我最近在使用RNDIS协议通过4G模块上网&#xff0c;这个协议不支持UDP协议&#xff0c;所以就用不了NTP服务器。或者有时候我们需要有更多的网络时间获取方式&#xff0…

python数据分析——seaborn绘图2

参考资料&#xff1a;活用pandas库 # 导入库 import pandas as pd import matplotlib.pyplot as plt import seaborn as sns tipspd.read_csv(r"...\seaborn常用数据案例\tips.csv") print(tips.head()) 1、成对关系表示 当数据大部分是数据时&#xff0c;可以使用…

AI图像生成-调整

一、两张图画风不相似 2、在两张图的共同输出口新添加一个空白正面提示词板块和条件合并板块 二、预处理插件&#xff08;提取人物姿态&#xff09; 1、新建节点-》ControlNet预处理器-》面部与姿态-》Openpose姿态预处理器 2、添加上传图片板块与预览图片板块 3、提取姿态 右…

数据库学习之select语句练习

目录 素材 练习 1、显示所有职工的基本信息。 结果 2、查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号。 结果 3、求出所有职工的人数。 结果 4、列出最高工和最低工资。 结果 5、列出职工的平均工资和总工资。 结果 6、创建一个只有职…

【全开源】房屋出租出售预约系统支持微信小程序+H5+APP

一款基于FastAdminThinkPHPUniapp开发的房屋出租出售预约系统&#xff0c;支持小程序、H5、APP&#xff1b;包含房客、房东(高级授权)、经纪人(高级授权)三种身份。核心功能有&#xff1a;新盘销售、房屋租赁、地图找房、小区找房&#xff0c;地铁找房等方式。 特色功能&#…

Salesforce AI研究: 从奖励建模到在线RLHF工作流

摘要 该研究在本技术报告中介绍了在线迭代基于人类反馈的强化学习(Online Iterative Reinforcement Learning from Human Feedback, RLHF)的工作流程,在最近的大语言模型(Large Language Model, LLM)文献中,这被广泛报道为大幅优于其离线对应方法。然而,现有的开源RLHF项目仍然…

【爬虫之scrapy框架——尚硅谷(学习笔记two)--爬取电影天堂(基本步骤)】

爬虫之scrapy框架--爬取电影天堂——解释多页爬取函数编写逻辑 &#xff08;1&#xff09;爬虫文件创建&#xff08;2&#xff09;检查网址是否正确&#xff08;3&#xff09;检查反爬&#xff08;3.1&#xff09; 简写输出语句&#xff0c;检查是否反爬&#xff08;3.2&#x…