如何在 Ubuntu VPS 上从 Apache Web 服务器迁移到 Nginx

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。

简介


在启动网站或应用程序时,您需要做出许多选择。有时,您的需求会发生变化,新技术变得可行,或者您的用户群会意外膨胀。无论您的原因是什么,您可能会考虑更改应用程序堆栈的组件之一,即 Web 服务器。

尽管 Apache Web 服务器目前是世界上最流行的 Web 服务器,但 Nginx 正以迅猛的速度获得市场份额。这并不令人意外,考虑到 Nginx 在使用少量资源的同时表现出色。对于许多网站来说,迁移到 Nginx 可以提高性能。

在本指南中,我们将讨论如何将网站从 Apache 迁移到 Ubuntu 12.04 VPS 上的 Nginx。我们将尽量保持建议的通用性,但会为您提供一些可能需要根据自己的目的进行调整的提示。

本指南假定您已经使用此教程安装了 LAMP(Linux、Apache、MySQL 和 PHP)堆栈。如果您在创建 droplet 时只是选择了一键 LAMP 映像,则您的服务器也将具有此配置。

安装 Nginx


我们要做的第一件事是安装新的服务器软件,这将使我们能够通过查看当前的 Apache 配置文件来配置新的服务器。

幸运的是,Nginx 默认情况下存在于 Ubuntu 仓库中。让我们现在安装它:

sudo apt-get update
sudo apt-get install nginx

在我们的用例中,一个非常重要的实现细节是,Nginx 将任何动态处理都转移到一个单独的进程。这使得 Nginx 保持精简和快速。它可以专注于其核心功能,而无需尝试通过模块添加 PHP 支持。相反,它只是将其转移到专为此目的构建的应用程序。

这一点是在此时提到的,是因为我们还需要安装一个 PHP 处理程序,以便处理 PHP 脚本。标准选择是 php5-fpm,它与 Nginx 配合良好:

sudo apt-get install php5-fpm

您应该已经拥有了所有需要的软件来将您的站点切换到 Nginx。我们仍然需要配置我们的软件以模拟 Apache 运行的配置。

设置测试 Nginx 配置


由于我们当前正在运行 Apache,如果可能的话,我们希望独立于 Apache 配置我们的 Nginx 服务器,以便在过渡期间我们的站点仍然可以正常运行。

这只是在另一个端口上测试 Nginx,直到我们准备好巩固我们的更改。这样,我们可以同时运行两个服务器。

首先打开默认 Nginx 站点的配置文件:

sudo nano /etc/nginx/sites-available/default

server { 部分,添加一个 listen 指令,告诉 Nginx 监听除端口 80 以外的端口(Apache 仍在使用端口 80 来提供请求)。在我们的教程中,我们将使用端口 8000。

server {
    listen 8000;
    . . .
    . . .

保存并关闭文件。现在是时候进行抽查,看看我们是否可以访问我们的 Nginx 服务器。启动 Nginx 来测试:

sudo service nginx start

使用我们配置的端口号访问默认的 Nginx 配置。在浏览器中输入:

http://your_ip_or_domain:8000

您的 Apache 实例应该仍在默认端口 80 上运行。您也可以通过访问您的站点(末尾没有 :8000,我们的示例只是提供默认的 Apache 页面。如果您已经配置了您的网站,那么这里将会是您的网站)来检查:

http://your_ip_or_domain

翻译您的 Apache 配置


现在您已经运行了两个服务器,您可以开始迁移和翻译您的 Apache 配置,以便在 Nginx 中使用。这必须手动完成,因此重要的是您了解 Nginx 的配置方式。

这项任务主要涉及编写 Nginx 服务器块,这类似于 Apache 虚拟服务器。Apache 将这些文件保存在 /etc/apache2/sites-available/,而 Nginx 也遵循相同的做法,在 Ubuntu 上将其服务器块声明保存在 /etc/nginx/sites-available/ 中。

对于每个虚拟服务器声明,您将创建一个服务器块。如果您查看您的 Apache 文件,您可能会发现类似于以下内容的虚拟主机:

<VirtualHost *:80>
    ServerAdmin webmaster@your_site.com
    ServerName your_site.com
    ServerAlias www.your_site.com

    DocumentRoot /var/www

    <Directory />
        Options FollowSymLinks
        AllowOverride None
    </Directory>

    <Directory /var/www/>
        Options Indexes FollowSymLinks MultiViews
        AllowOverride None
        Order allow,deny
        allow from all
    </Directory>

    ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    <Directory "/usr/lib/cgi-bin">
        AllowOverride None
        Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
        Order allow,deny
        Allow from all
    </Directory>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel warn
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    Alias /doc/ "/usr/share/doc/"
    <Directory "/usr/share/doc/">
        Options Indexes MultiViews FollowSymLinks
        AllowOverride None
        Order deny,allow
        Deny from all
        Allow from 127.0.0.0/255.0.0.0 ::1/128
    </Directory>
</VirtualHost>

我们可以开始使用此配置构建我们的 Nginx 服务器块。

在您的 /etc/nginx/sites-available/ 目录中,打开我们之前编辑以声明 Nginx 端口的文件:

sudo nano /etc/nginx/sites-available/default

暂时忽略注释行,它应该看起来像这样:

server {
    listen 8000;

    root /usr/share/nginx/www;
    index index.html index.htm;

    server_name localhost;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }
}

您应该已经开始看到一些似乎对应于我们的 Apache 配置的项目。一般来说,主要指令的翻译如下:

Apache                                 Nginx
------                                 ------

<VirtualHost *:80>                     server {
                                            listen 80;

ServerName yoursite.com
ServerAlias www.yoursite.com           server_name yoursite.com www.yoursite.com;

DocumentRoot /path/to/root             root /path/to/root;

AllowOverride All                      (No Available Alternative)

DirectoryIndex index.php               index index.php;

ErrorLog /path/to/log                  error_log /path/to/log error;

CustomLog /path/to/log combined        access_log /path/to/log main;

Alias /url/ "/path/to/files"           location /url/ {
<Directory "/path/to/files">                 alias /path/to/files;

如果我们要创建一个模拟上述虚拟主机文件功能的服务器块,它可能看起来像这样:

server {
    listen 8000;   # 我们故意保留此设置,以避免冲突

    root /var/www;
    server_name your_site.com www.your_site.com;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php5-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }

    location /doc/ {
        alias /usr/share/doc/;
        autoindex on;
        allow 127.0.0.1;
        deny all;
    }

    location ~/\.ht {
        deny all;
    }

}

我们已经删除了一些项目,并添加了一些额外的行,我们应该解释一下。

首先,错误日志行已从配置中删除。这是因为它们已经在 /etc/nginx/nginx.conf 文件中定义。这为我们提供了一个默认值,我们将使用它。

我们还删除了 ServerAdmin 指令,因为 Nginx 不会将该信息嵌入其错误页面。

PHP 处理也有所改变。由于 PHP 在 Nginx 中是单独处理的,我们将这些文件传递给我们之前安装的 php-fpm 程序。这是通过一个套接字实现的(我们需要立即配置)。

文档部分已更改以反映 Nginx 文档。它在其他方面基本上是类似的。

最后,我们配置 Nginx 拒绝访问任何以 .ht 开头的 .htaccess 或其他文件。这些是 Apache 特定的配置文件,它们与 Nginx 不兼容。最好不要公开这些配置文件。

完成后保存并关闭文件。

我们必须重新启动我们的 Nginx 服务器,以便识别这些更改:

sudo service nginx restart

配置 PHP-FPM


现在我们已经大部分完成了 Nginx 配置,我们需要修改 php-fpm 配置以便使用我们指定的通道进行通信。

首先,我们应该修改 php.ini 文件,以便它不会以不安全的方式提供文件。

sudo nano /etc/php5/fpm/php.ini

我们需要修改的行将要求 PHP 服务于精确请求的文件,而不是猜测是否存在不完整的匹配。这可以防止 PHP 可能向正在探测 PHP 处理程序弱点的人提供或暴露敏感数据。

找到指定 cgi.fix_pathinfo 指令的行,并修改为:

cgi.fix_pathinfo=0

保存并退出该文件。

接下来,我们将更改 php-fpm 连接到服务器的方式。在编辑器中打开以下文件:

sudo nano /etc/php5/fpm/pool.d/www.conf

找到并修改 listen 指令,使其与我们在服务器块配置文件中设置的值匹配:

listen = /var/run/php5-fpm.sock

如果您在处理大量 PHP 请求时遇到问题,您可能需要回来增加可以同时生成的子进程数量。您需要更改的行是:

pm.max_children = Num_of_children

保存并关闭该文件。

现在,我们的 php-fpm 程序应该已经正确配置。我们需要重新启动它以使更改生效。

sudo service php5-fpm restart

再次重新启动 Nginx 也不会有问题:

sudo service nginx restart

测试您在根目录中拥有的任何 PHP 文件是否能够正常运行。您应该能够像在 Apache 中一样执行 PHP 文件。

如果我们访问在 Ubuntu LAMP 教程中创建的 info.php 文件,它应该呈现如下:

http://your_ip_or_domain:8000/info.php

!DigitalOcean Nginx PHP files

PHP Variables 部分,您应该看到 Nginx 被列为 “SERVER_SOFTWARE” 变量:

!DigitalOcean Nginx server software

迁移您的 Nginx 站点


在进行了广泛的测试之后,您可以尝试将您的站点从 Apache 无缝迁移到 Nginx。

这是可能的,因为这两个服务器在重新启动之前都不会实施更改。这使我们能够设置好一切,然后在一个瞬间切换。

实际上,我们唯一需要做的就是修改 Nginx 服务器块中的端口。现在打开该文件:

sudo nano /etc/nginx/sites-available/default

将端口更改回默认的端口 80。这将使其在重新启动后立即开始接受常规的 HTTP 流量。

server {
    # listen 8000;
    listen 80;
    . . .

保存并关闭该文件。

如果您只是将一些站点迁移到 Nginx 并继续从 Apache 提供一些内容,您需要禁用在端口 80 上提供请求的 Apache 虚拟服务器。这是必要的以避免冲突。如果这样做得不正确,Nginx 将无法启动,因为端口已被占用。

如果您计划继续运行 Apache,请检查以下文件和位置以查找端口 80 的使用情况:

/etc/apache2/ports.conf
/etc/apache2/apache2.conf
/etc/apache2/httpd.conf
/etc/apache2/sites-enabled/  ## 在该目录中搜索所有站点

在您确信已经更改了所有必要的端口后,您可以像这样重新启动两个服务:

sudo service apache2 reload && sudo service nginx reload

Apache 应该重新加载,释放端口 80。随后,Nginx 应该重新加载并开始接受该端口上的连接。如果一切顺利,您的站点现在应该由 Nginx 提供服务。

如果您不再打算使用 Apache 来提供站点的任何部分,您可以完全停止其 Web 进程:

sudo service apache2 stop && sudo service nginx reload

如果您不再使用 Apache,那么此时您可以卸载 Apache 文件。您可以通过输入以下命令轻松找到与 Apache 相关的文件:

dpkg --get-selections | grep apache

然后使用 apt-get 卸载它们。例如:

sudo apt-get remove apache2 apache2-mpm-prefork apache2-utils apache2.2-bin apache2.2-common libapache2-mod-auth-mysql libapache2-mod-php5

您还可以删除所有不再需要的依赖包:

sudo apt-get autoremove

迁移复杂性


在尝试切换到 Nginx 时,Apache 世界中有一些常见的事情可能会让您感到困惑。

重写转换和 .htaccess 文件


最基本的区别之一是 Nginx 不遵守目录覆盖。

Apache 使用 .htaccess 文件,结合在位置块中的 AllowOverride All 指令。这允许您在包含文件的目录中放置特定于目录的配置。

Nginx 不允许这些文件。如果配置错误,将配置与正在提供的文件放在一起可能会带来安全问题,并且很容易查看集中式配置文件而不意识到通过 .htaccess 文件进行了设置覆盖。

因此,您在活动 .htaccess 文件中列出的所有配置必须放置在服务器块配置的位置块中。这通常并不更复杂,但您必须像处理虚拟主机定义一样翻译这些规则。

在 .htaccess 文件中保留的常见内容是 Apache 的 mod_rewrite 模块的规则,该模块修改内容的访问 URL 以使其更用户友好。Nginx 有一个类似的重写模块,但使用不同的语法。不幸的是,在本指南的范围之外重写 URL 在 Nginx 中。

模块和外部配置复杂性


另一件需要牢记的事情是,您需要意识到已启用的 Apache 模块提供了哪些功能。

一个简单的例子是 dir 模块。启用后,您可以通过在虚拟主机文件中添加以下行来指定 Apache 将尝试作为目录索引提供的文件顺序:

DirectoryIndex index.html index.htm

此行将确定此虚拟主机的处理方式。但是,如果此行不存在,并且已启用 dir 模块,则提供的文件顺序将由此文件确定:

sudo nano /etc/apache2/mods-enabled/dir.conf

<IfModule mod_dir.c>

          DirectoryIndex index.php index.html index.cgi index.pl index.xhtml index.htm

</IfModule>

提出这一点的目的是,您必须意识到模块或任何外部配置可能在幕后执行某些操作,而这些操作在 Nginx 中必须显式执行。

在此示例中,您可以通过将以下内容添加到服务器块中来指定 Nginx 中的目录索引顺序:

server {
    . . .
    index index.php index.html index.htm;
    . . .

这一点很重要。

如果您正在迁移复杂的站点配置,可能会有所帮助的一点是将所有单独获取的配置文件复制粘贴到一个单一的文件中,并系统地逐行翻译每一行。

这可能会让人头疼,但对于生产服务器来说,它可以节省您大量时间,以便找出导致您无法准确确定的奇怪行为的原因。

结论


从 Apache 迁移到 Nginx 的复杂性几乎完全取决于您特定配置的复杂性。Nginx 可以处理几乎任何 Apache 可以处理的事情,并且以更少的资源完成。这意味着您的站点可以顺利为更多用户提供服务。

虽然迁移对于所有站点都没有意义,而且 Apache 是一个很好的服务器,可以满足许多项目的需求,但您可能会在 Nginx 中看到性能提升或可扩展性增加。如果您仍需要 Apache,另一种选择是将 Nginx 用作 Apache 服务器的反向代理。这种方法可以强大地发挥两个服务器的优势。

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

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

相关文章

Golang | Leetcode Golang题解之第457题环形数组是否存在循环

题目&#xff1a; 题解&#xff1a; func circularArrayLoop(nums []int) bool {n : len(nums)next : func(cur int) int {return ((curnums[cur])%n n) % n // 保证返回值在 [0,n) 中}for i, num : range nums {if num 0 {continue}slow, fast : i, next(i)// 判断非零且方…

docker简述

1.安装dockers&#xff0c;配置docker软件仓库 安装&#xff0c;可能需要开代理&#xff0c;这里我提前使用了下好的包安装 启动docker systemctl enable --now docker查看是否安装成功 2.简单命令 拉取镜像&#xff0c;也可以提前下载使用以下命令上传 docker load -i imag…

大数据毕业设计选题推荐-B站热门视频数据分析-Python数据可视化-Hive-Hadoop-Spark

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

使用C语言获取iostat中的await值的方法和方案

使用C语言获取iostat中的await值的方法和方案 1. 准备工作2. 调用iostat命令并获取输出3. 解析iostat输出4. 完整实现和错误处理5. 注意事项在Linux系统中,iostat命令是sysstat软件包的一部分,用于监控系统的CPU、网卡、tty设备、磁盘、CD-ROM等设备的活动情况和负载信息。其…

鸿蒙OS投票机制

(基于openharmony5.0) 投票机制 param get | grep ohos.boot.time 图 投票机制参数图 只有当所有的投票完成&#xff0c;开机动画才会退出&#xff0c;整理需要投票的系统应用&#xff08;三方应用不参与投票&#xff09;如下图所示&#xff1a; 以进程foundation为例&…

基于Kafka2.1解读Producer原理

文章目录 前言一、Kafka Producer是什么&#xff1f;二、主要组件1.Kafka Producer1.1 partitioner1.2 keySerializer1.3 valueSerializer1.4 accumulator1.5 sender 2.Sender2.1 acks2.2 clientinFlightBatches 3. Selector3.1 nioSelector3.2 channels 4. 全局总览 总结 前言…

Arduino UNO R3自学笔记20 之 Arduino如何测定电机速度?

注意&#xff1a;学习和写作过程中&#xff0c;部分资料搜集于互联网&#xff0c;如有侵权请联系删除。 前言&#xff1a;在学习了Arduino的相关基础知识后&#xff0c;现在做个综合应用&#xff0c;给旋转的电机测速。 1.实验目的 测定旋转电机的转速。 2.实验器材-编码器 …

【hot100-java】二叉树的最近公共祖先

二叉树篇 我觉得是比两个节点的深度&#xff0c;取min&#xff08;一种情况&#xff09; DFS解题。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode(int x) { val x; }* }*/ clas…

力扣题11~15

题11&#xff08;中等&#xff09;&#xff1a; 思路&#xff1a; 这种题目第一眼就是双循环&#xff0c;但是肯定不行滴&#xff0c;o(n^2)这种肯定超时&#xff0c;很难接受。 所以要另辟蹊径&#xff0c;我们先用俩指针&#xff08;标志位&#xff09;在最左端和最右端&am…

基于SpringBoot智能垃圾分类系统【附源码】

基于SpringBoot智能垃圾分类系统 效果如下&#xff1a; 系统首页界面 用户注册界面 垃圾站点页面 商品兑换页面 管理员登录界面 垃圾投放界面 物业登录界面 物业功能界图 研究背景 随着城市化进程的加速&#xff0c;生活垃圾的产量急剧增加&#xff0c;传统的垃圾分类方式已…

【C++】二叉搜索树+变身 = AVL树

&#x1f680;个人主页&#xff1a;小羊 &#x1f680;所属专栏&#xff1a;C 很荣幸您能阅读我的文章&#xff0c;诚请评论指点&#xff0c;欢迎欢迎 ~ 目录 前言一、AVL树二、AVL树的实现2.1 平衡因子2.2 旋转处理2.2.1 左单旋&#xff1a;插入新节点后单纯的右边高2.2.2 …

光路科技TSN交换机:驱动自动驾驶技术革新,保障高精度实时数据传输

自动驾驶技术正快速演进&#xff0c;对实时数据处理能力的需求激增。光路科技推出的TSN&#xff08;时间敏感网络&#xff09;交换机&#xff0c;在比亚迪最新车型中的成功应用&#xff0c;显著推动了这一领域的技术进步。 自动驾驶技术面临的挑战 自动驾驶系统需整合来自雷达…

大模型基础:基本概念、Prompt、RAG、Agent及多模态

随着大模型的迅猛发展&#xff0c;LLM 作为人工智能的核心力量&#xff0c;正以前所未有的方式重塑着我们的生活、学习和工作。无论是智能语音助手、自动驾驶汽车&#xff0c;还是智能决策系统&#xff0c;大模型都是幕后英雄&#xff0c;让这些看似不可思议的事情变为可能。本…

43 C 程序动态内存分配:内存区域划分、void 指针、内存分配相关函数(malloc、calloc、realloc、_msize、free)、内存泄漏

目录 1 C 程序内存区域划分 1.1 代码区 (Code Section) 1.2 全局/静态区 (Global/Static Section) 1.3 栈区 (Stack Section) 1.4 堆区 (Heap Section) 1.5 动态内存分配 2 void 指针&#xff08;无类型指针&#xff09; 2.1 void 指针介绍 2.2 void 指针的作用 2.3 …

Java基本数据类型和String类型的转换

1.基本介绍 在程序开发中&#xff0c;我们经常需要将基本数据类型转换成String类型。或者将String类型转为基本数据类型。 2.基本类型转String类型 语法&#xff1a;将 基本数据类型的值 “” 即可 3.String类型转基本数据类型 语法&#xff1a;通过基本类型的包装类调用…

【DataSophon】DataSophon1.2.1 整合Zeppelin并配置Hive|Trino|Spark解释器

目录 ​一、Zeppelin简介 二、实现步骤 2.1 Zeppelin包下载 2.2 work配置文件 三、配置常用解释器 3.1配置Hive解释器 3.2 配置trino解释器 3.3 配置Spark解释器 一、Zeppelin简介 Zeppelin是Apache基金会下的一个开源框架&#xff0c;它提供了一个数据可视化的框架&am…

浏览器动态移动的小球源码分享

浏览器动态移动的小球源码分享 <script>(function(a){var width100,height100,borderRadius100,circlefunction(){};circle.prototype{color:function(){let colour "#"Math.floor(Math.random()*255).toString(16)Math.floor(Math.random()*255).toString…

爬虫案例——爬取腾讯社招

案例需求&#xff1a; 1.爬取腾讯社招的数据&#xff08;搜索 | 腾讯招聘&#xff09;包括岗位名称链接时间公司名称 2.爬取所有页&#xff08;翻页&#xff09; 3.利用jsonpath进行数据解析 4.保存数据&#xff1a;txt文本形式和excel文件两种形式 解析&#xff1a; 1.分…

hdfs伪分布式集群搭建

1 准备 vmware 虚拟三台centos系统的节点三台机器安装好jdk环境关闭防火墙&#xff08;端口太多&#xff0c;需要的自行去开关端口&#xff09;hadoop压缩包解压至三台服务器 可在一台节点上配置完成后克隆为三台节点 2 host修改 vi /etc/hosts在每个节点上添加三台机器的i…

【Linux】Shell脚本基础+条件判断与循环控制

目录 一、介绍 1. Linux提供的Shell解析器 2. bash和sh关系 3. Centos默认的Shell解析器是bash 二、定义 1. 变量名的定义规则 2. 等号周围没有空格 3. 查看变量 4. 删除变量 5. 正确地定义数组 6. 将局部环境变量提升为全局 7. 正确选择引号 8. 特殊变量名 三…