前言

我经常看到有新入网站制作的同学在群里问诸如“我的站点为什么出现 403?”,“***面板出现了***的问题怎么解决?”的问题,作为一个过来人,我不能否认面板对于初学者提供了极大的便利性,且降低了其准入门槛,但是毕竟不是自己校验过的东西,难免会出现一些奇怪的问题或者存在某些不为人知的漏洞。

所以我一直提倡抛弃面板管理站点,不仅可以提高自己的技术力,还能依靠自己的喜好更改站点配置,于是乎我撰写了这篇文章,文章面向的受众为有一定计算机基础(起码知道内外网吧)的准萌新,通过学习本篇教程,你应该可以抛弃面板独自配置 Web 环境,完善的建立并管理一个自己的站点(或是 CMS,或是一个静态网站)。

诚然,由于作者的水平有限难免会出现一些错误,也欢迎各位大佬指出,我将会进行修改,当然,假如你存在某些于本文完全相悖的理念或观点(我就想使用***面板,***面板天下第一),不必和我争论是非对错,你是对的,你可以关闭本篇教程了;-P

好了,让我们一起进入米奇妙 ♂ 妙屋吧!建议首先通读此教程之后再去部署站点,能对整个的操作流程有一个认知,以及选择你所需要的章节进行测试、实践,确保不会出现方向上的问题。

基础知识

Web 服务器

何为 Web 服务器?通俗的来讲就是接受客户端的 HTTP 请求并返回一定数据的服务器。众所周知,当你想访问某一个站点时,你的浏览器(client)会向该站点 URL 发送一个 HTTP 的请求,服务器(server)收到请求后,会根据请求的地址和方法返回一定的资源(通常是站点文件),Web 服务器的作用就是正确接受处理此事。注意,Web 服务器只能是一个被动式的应用程序,其不会主动和 client 进行交换数据,只有当处于网络上的其他计算机发出请求时,才会相应并返回数据。

这就意味着,如果你想把你的站点放在外网上供用户访问,你就需要一台具有外网地址(一般来说是公网 IP v4 地址,可以是动态也可以是静态)的服务器、任意一个未被定义的端口或常见的 HTTP 端口、一个 Web 服务器用于处理用户的请求、可选数据库交换存储数据、可选后端运行环境处理动态响应。

Web 服务器工作原理:[博客园/奔跑的兔子]

1、连接过程:Web 服务器和其浏览器之间所建立起来的一种连接。查看连接过程是否实现,用户可以找到和打开 socket 这个虚拟文件,这个文件的建立意味着连接过程这一步骤已经成功建立。

2、请求过程:Web 的浏览器运用 socket 这个文件向其服务器而提出各种请求。

3、应答过程:运用 HTTP 协议把在请求过程中所提出来的请求传输到 Web 的服务器,进而实施任务处理,然后运用 HTTP 协议把任务处理的结果传输到 Web 的浏览器,同时在 Web 的浏览器上面展示上述所请求之界面。

4、关闭连接:当上一个步骤–应答过程完成以后,Web 服务器和其浏览器之间断开连接之过程。

发行版信息

一般来说为了节省 Web 站点所在的服务器的性能,我们选择的多为不带图形界面的 Linux 发行版的最小安装/网络安装模式,其拥有极低的系统资源占用的同时也有较高的系统稳定性(我的站点服务器使用 Debian Stable 已经几近两个月没有重启依然非常稳定)。常用的 Linux 发行版有以下几种:Debian 系(Debian、Kali、Ubuntu 及一众衍生发行版),红帽系(RHEL、Fedora、CentOS、Rocky),OpenSUSE,ArchLinux 等等,不必刻意选择发行版系统,每个系统都有其独到之处,萌新建议 CentOS(转为滚动更新需注意)、Debian 或 Ubuntu 任选其一,它们的社区资源比较丰富,你可以很便捷的找到你所遇到问题的答案。在本篇教程中为了兼顾读者,我将使用 Debian 11 进行演示和操作,一般来说,同类发行版的操作和配置大同小异,不同类直接略有差别,如有异常报出可以尝试翻阅各发行版的 Wiki 或用户手册。

本文所使用的演示系统信息

>>>lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 11 (bullseye)
Release: 11
Codename: bullseye

基础 shell 语法

这里列举了一些常用的 Linux 发行版基础的命令,如果你想了解更多可以参考各大发行版 Wiki 或者其参考手册,初学者建议在熟练掌握之前使用非管理员账户在非 sudo 环境下进行测试学习!

>>>cd [DirPath]
>>>mv [DocuName] [DirPath]
>>>cp
>>>ls <-l>
>>>rm <-r/f> [DocuName]

还想了解更多?点击前往个人云盘阅读 Debian 的用户参考卡(英文版)。

资源文件系统

如果你使用的 Linux 发行版作为你的站点服务器系统,那么你就需要了解一下根目录里面的文件夹都是用来做什么的,这样你才能随心所欲的更改你想要更改的配置或者检索应用运行日志等操作。相对于 Windows 操作系统来说,Linux 发行版的入门确实要更为困难,但是作为初学者的我们,只需要掌握几个特定的文件夹作用就可以了,下面列出了本篇教程所需要的文件夹及其作用

/root:系统管理员(root)用户根目录
/home:用户主目录,拥有以用户账户命名的文件夹
/etc:etcetera,存放所有的系统管理所需要的配置文件和子目录,我们要修改的配置文件一般都存放在此处,并以应用/进程名字命名的文件夹,比如/etc/apache2等等
/var:variable,存放经常要被修改的文件,包括各类信息日志,我们一般将站点文件存放到此处/var/www/html,当然各类应用/进程的运行日志一般也保留在此文件夹

当你使用 root 账户登录至你的站点服务器时,默认会进入到/root目录,此时命令行会显示root@HostName:~#或类似的字段,“~”便代表这用户账户的主目录,你也可以使用~/appName来运行用户主目录里面的应用程序或脚本。要想进入系统根目录,就需要使用cd /的命令,执行后命令行会显示root@HostName:/#或类似的字段,表示当前在根目录,你也可以在任意目录里面使用cd /DirPath回到根目录文件夹。

Tips:

在 Linux 发行版里,“/”所代表的含义为根目录(注意!rm -rf /*意为删除根目录所有文件,此举动将会使系统崩溃!),“./”所代表的含义为当前目录,“../”所代表的含义为上一级目录,比如我当前所在的目录为/root/temp/note/linux,那么我可以使用以下命令进行切换目录

>>>pwd
# pwd意为打印输出当前路径
/root/temp/note/linux
>>>cd ..
>>>pwd
/root/temp/note
>>>cd ../tech
>>>pwd
/root/temp/tech
>>>cd /etc/apache2
>>>pwd
/etc/apache
>>>cd conf-enable
# 或者直接使用cd ./conf-enable同义
>>>pwd
/etc/apache2/conf-enable

当文件名或者路径名太长或太麻烦不想打完,或者忘记了路径时,你可以按下位于键盘左上角的Tab键,命令行会自动补全路径名称或提供此路径下同名文件。

还想了解更多?附录里面有着 Linux 发行版根目录所有文件夹的释义。

准备工作

SSH 客户端

一般而言,我们在 ISP 购买的服务器安装 Linux 发行版的话会默认安装为最小安装,意味着在大多数情况下,这种系统将不具备图形化应用、必备软件等等,只包含有诸如 Vi、SSH 等基本软件应用,故你只能通过 SSH 远程服务器进行操作,我也不是很建议在服务器安装图形化界面,Web 服务器本就需要低占用高稳定性运行,安装图形化界面除了会增加服务器占用外一无是处。

既然需要使用 SSH 工具,那么就需要部署一份 SSH 客户端,在 Win10 及以上的系统版本中,微软默认安装了 OpenSSH 客户端,你只需要启动 PowerShell 或者 CMD 即可使用:

>>>ssh -p [port] [user]@[host]
# 如果ssh端口为22默认端口,-p [port]参数可省略
The authenticity of host 'HostName (HostIP)' can't be established.
ECDSA key fingerprint is SHA256:HostKey.
Are you sure you want to continue connecting (yes/no/[fingerprint])?
# 确认该主机的ECDSA密钥指纹,输入yes
password:
# 输入用户账户密码,注意输入时不会显示
# 所以你键入键盘后依然空白属于正常现象
# 输入完成后回车即可

当然这个 SSH 客户端的功能甚是简陋,且不能解决我们本地编辑、下载上传文件的需求,你可以选择 SSH(Xshell、PuTTy)+SFTP(Xftp、WinSCP)两种软件共同使用(Xshell 和 Xftp 都可以在官网下载供家庭和学生使用的免费评估版本,推荐使用这两者),或者也可以选择诸如 MobaXterm 这类集成二者功能的软件使用,各自的安装及配置方式不再赘述,可自行检索。

富文本编辑器

在创建、修改站点时,你需要处理大量的配置文件,以及书写一定的测试文档,所以 SSH 客户端或系统自带的编辑器的表现总是不尽人意,你可以选择直接在命令行使用 Vim 编辑器,但是作为新入门的同学,我强烈建议本地安装一个富文本编辑器以处理各式各样的配置文件。

何为富文本编辑器?

富文本编辑器区分于普通的文本编辑软件(如 Windows 的 Notepad),前者拥有对于多种语言(如编程语言 C、Cpp、Java、Python 等,文本标记语言 HTML、Markdown 等,数据文件 Json、CSV 等,各类配置文件 Yaml、INI 等)的支持(代码高亮、代码格式化、异常报错等等)、浩如烟海的插件支持、自定义客制化 UI 主题以及和各类工具良好的集成兼容性(如 Git/SVN、Shell、SSH)

主流的富文本编辑器亦有很多种,如巨硬做的 VS Code,JB 做的 Fleet、个人开发的 Sublime Text(收费)、GitHub 做的 Atom 和 Linux 的 Vim,任选其一安装即可

我将使用 VS Code(注意区分 Visual Studio/VS,后者为 IDE 集成开发环境)进行演示,其他富文本编辑器的功能大抵都是大同小异,进入官网Visual Studio Code - Code Editing. Redefined,您可以直接点击主页上的“Download For Windows,Stable Build”进入下载页面;或者可以选择下面一行中的“other platforms”进入多平台选择页面,推荐选择“System Installer”一行(64 位、32 位和 ARM)。

安装应用以自己喜欢的方式安装即可,这里不再赘述,安装完成后运行会首先出现欢迎界面,您可以在其中自行选择配置主题、文件关联和学习技巧,右下角会提示安装“简体中文语言包/Simple Chinese Language Package”,选择 Install 安装重启应用即可,有关 VS Code 的配置、美化教程可自行检索。

ISP 控制台

并不是所有的 ISP(网络服务提供商)都会默认放行 80、443、8080 这类常见的 HTTP 服务端口,在开始部署你的网页服务之前,不妨先看看你的 ISP 控制台-服务器安全策略组/网络管理页面,如果没有放行 HTTP 端口,不妨先参考 ISP 的文档放行此类端口。

另外,某些国内的 ISP 在使用国内的机器时,访问 HTTP 服务会要求你的域名备案服务(即在中华人民共和国工信部 MIIT 进行记录备案,以及公安网进行备案)。当然各大 ISP 也基本上都提供了在线免费的傻瓜式备案服务,一般来说的流程为:提交个人材料证明信息、提交站点信息材料、实人认证、ISP 初审(1-2 天,会有专员反馈信息)、验证 MIIT 短信(24 小时内)、MIIT 省局终审(各省不尽相同,一般 7-14 天,成功会短信通知)。此处注意,备案的是你的域名和服务器所提供的网站信息的合法性,这就意味着如果你的服务器更换 ISP,某些严格要求的 ISP 可能会要求你进行一个转入备案的操作。

域名的解析也需要在 ISP 控制台进行,推荐先使用*的泛域名 A 记录解析到你的服务器公网 IP 之后在分别增加诸如 www 或 blog 的二级域名,这样有二级域名输入错误的同学也能重定向到你的默认站点,增加访问的容错性。具体如何使用不同的域名访问到一个服务器的不同站点,我在后面的“虚拟站点”一节会有详细介绍,这里有一个小贴士:请尽量规范化你的网址且尽量简短。

增加易用性

  • 安装必备软件

    Git,Zip/Unzip,vim,

  • 修改软件源

  • 将系统更新

Web Server

该章节

安装 Apache

在 Linux 发行版中,有的系统可能直接内置了诸如 Apache 或 Nginx 之类的 Web 服务器,你可以使用各自的指令运行测试(详见下一节),如果没有安装也没关系,Linux 拥有功能极为强大的包管理工具。你完全不必像寻找检索 Windows 软件那样,重定向到一些下载站或被捆绑安装一系列全家桶,Linux 发行版系统包管理工具将会自动检索该软件所需要的依赖问题,以及高度自动化的安装、更新和卸载,并且拥有校验软件源。

>>>apt update && upgrade
# 非必须,只是确保系统、软件处于最新的版本
>>>apt install apache2 -y
# Debian系的包管理工具为Apt,具体使用可以参考附录
# 在Debian及其下游的发行版中,Apache的包名为apache2
# ...省略安装过程
>>>
>>>apache2 -v
Server version: Apache/2.4.54 (Debian)
Server built: 2022-06-09T04:26:43
>>>apache2 -k start
[Wed Dec 28 09:22:09.129079 2022] [core:warn] [pid 4027] AH00111: Config variable ${APACHE_RUN_DIR} is not defined
apache2: Syntax error on line 80 of /etc/apache2/apache2.conf: DefaultRuntimeDir must be a valid directory, absolute or relative to ServerRoot

AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message

使用上面的指令出现问题?请检查你是否使用 root 账户或其他具有系统管理员的账户,也可以通过在指令前面添加sudo使用管理员执行或使用sudo su提升至管理员权限账户,问题不能解决请使用搜索引擎检索相关异常信息(一般来说你翻译一下便可得知为什么会出问题)

Tips:关于 update 和 upgrade

也许在翻阅这篇文章之前你有在网络上查找和阅读过其他教程,你会看到大多数教程都会让你在安装配置软件之前使用apt update && apt upgrade,为什么需要这样做?其实很简单,

测试站点

经过上述的操作,你已经了解了你在用什么发行版系统,并且在你的系统中成功部署了一份 Apache 站点服务器,但是我该怎么确定这个服务器是否运行正常呢?甚至于我是否成功安装了这个软件?强烈建议在进行下一步配置站点信息之前确定 Apache 是否运行正常,否则你可能会陷入更麻烦的境界。

在上一步安装完 Apache 服务器之后,你会发现我使用了httpd -V或者apache2 -V指令打印输出了一份 Apache 软件版本以及信息,这一步就是为了确定我是否在系统上成功部署了站点服务器。既然部署成功了,那就要测试是否能够运行,请注意,在进行下一步操作之前,务必在 ISP 控制台检查是否正确放行了 HTTP 服务端口(常见 80、443、8080 等)以及是否在本机防火墙放行了上述端口

Tips:这一份注释将概述在防火墙放行端口的几种方式

我在这里使用的是 UFW 防火墙,这是一种对用户友好的防火墙管理工具

Tips:这一份注释将教你如何使用系统工具管理 Apache 服务器

检查无误后,你可以访问你站点的 IP 地址或者已经正确解析 A 记录的域名地址(注意使用外网地址),如果不出什么意外的话,你会正确的定向到“HTTP SERVER TEST PAGE”、“Apache2 Debian Default Page”或类似的页面,不必惊慌,这个页面本来就是为了让你测试站点的!当你测试正常后,你便可以继续接下来的教程,如果出现了什么问题,可以试图参照下面的一份问题检查清单检查你的站点配置

无法正常访问测试站点的检查清单

  1. 站点显示 HTTP 错误码

    站点提示诸如 403、404、500 之类的数字 HTTP 状态码?这证明站点的 Web 服务器已经正常安装,但是看起来运行起来有点错误,你可以先行参考后面的异常处理章节,或者按部就班进行学习配置后再次尝试

  2. 站点显示连接超时等等

    如果你的站点提示为浏览器的异常:诸如访问超时,无法访问此站点等等,那这问题出在了服务器本身,重新检查测试 TCP 80/443/8080 端口是否开放且能正常访问,检查 IP 地址或 URL 是否输入正确,检查 Web 服务器是否成功安装、运行等等

  3. 还是无法访问

    请使用清除缓存强制刷新“Ctrl+F5”操作,或者更换浏览器,或者使用 IP 直接访问(防止 DNS 污染),依然不行就只能求助身边的大佬了

主流服务器

除外 Apache 外,你还可以使用其他的主流 Web 服务器例如 Nginx(常说的 LNMP 环境中的 N)和 IIS(捆绑于 Windows Server)等,这里简要概述一下,不做具体讲解。

  • Nginx

  • IIS

    Internet Information Services(IIS,互联网信息服务),作为巨硬家的 Web 服务器,IIS 一般内置在 Windows Server 系统里面不需要独立安装,你可以使用 IIS 在 Windows 系统下开设 Web 网页服务,用来搭载网站运行程序的平台,还能提供 FTP,SMTP 等服务。IIS 提供对.Net、PHP、JSP 等后端语言环境或后端框架的支持,也继承了 Windows 全图形化的配置更改模式,除非必要否则不建议个人使用 IIS 作为你的 Web 服务器。

    如果你非要使用 Windows Server 作为你的站点管理系统,你可以在 Windows 下使用 Apache 或者 Nginx,二者均提供了 Windows 平台的二进制分发包或应用管理程序,配置文件也大多通用,相比 IIS,这两种主流服务器应用程序对于个人来说意味着拥有更新更好的网络教程和安全措施,且对 PHP 等后端语言环境的支持是 IIS 所不能媲美的。当然,如果你说我就想用 IIS,我就想微软服务为我背锅,那请使用较新的 Windows Server 系统譬如 2022,以及使用正版商业授权确保可以得到巨硬的技术支持。

    IIS 并非一无是处,其在商业领域拥有可以媲美 Apache 的份额,且性能和安全也有巨硬背锅,是微软的战略产品,但是面向个人我少有看到个站站长使用 Windows+IIS 的奇怪组合,本篇教程也是面对 Linux 发行版的 LAMP/LNMP(Linux 发行版+Apache/Nginx 服务器+MySQL/MariaDB 数据库+PHP/Python 语言环境)的主流 Web 服务器运行模式,所以 IIS 相关的内容在后文不再予以提及,请自行参阅技术文档。

配置站点信息

-/etc/apache2/
|-conf-available/
|-conf-enabled/
|-mods-available/
|-mods-enabled/
|-sites-available/
|-sites-enabled/
|-apache2.conf
|-envvars
|-magic
`-ports.conf

主配置文件

主配置文件在/etc/apache2 目录,文件名为 apache2.conf

# This is the main Apache server configuration file.  It contains the
# configuration directives that give the server its instructions.
# See http://httpd.apache.org/docs/2.4/ for detailed information about
# the directives and /usr/share/doc/apache2/README.Debian about Debian specific
# hints.
#
#
# Summary of how the Apache 2 configuration works in Debian:
# The Apache 2 web server configuration in Debian is quite different to
# upstream's suggested way to configure the web server. This is because Debian's
# default Apache2 installation attempts to make adding and removing modules,
# virtual hosts, and extra configuration directives as flexible as possible, in
# order to make automating the changes and administering the server as easy as
# possible.

# It is split into several files forming the configuration hierarchy outlined
# below, all located in the /etc/apache2/ directory:
#
# /etc/apache2/
# |-- apache2.conf
# | `-- ports.conf
# |-- mods-enabled
# | |-- *.load
# | `-- *.conf
# |-- conf-enabled
# | `-- *.conf
# `-- sites-enabled
# `-- *.conf
#
#
# * apache2.conf is the main configuration file (this file). It puts the pieces
# together by including all remaining configuration files when starting up the
# web server.
#
# * ports.conf is always included from the main configuration file. It is
# supposed to determine listening ports for incoming connections which can be
# customized anytime.
#
# * Configuration files in the mods-enabled/, conf-enabled/ and sites-enabled/
# directories contain particular configuration snippets which manage modules,
# global configuration fragments, or virtual host configurations,
# respectively.
#
# They are activated by symlinking available configuration files from their
# respective *-available/ counterparts. These should be managed by using our
# helpers a2enmod/a2dismod, a2ensite/a2dissite and a2enconf/a2disconf. See
# their respective man pages for detailed information.
#
# * The binary is called apache2. Due to the use of environment variables, in
# the default configuration, apache2 needs to be started/stopped with
# /etc/init.d/apache2 or apache2ctl. Calling /usr/bin/apache2 directly will not
# work with the default configuration.


# Global configuration
#

#
# ServerRoot: The top of the directory tree under which the server's
# configuration, error, and log files are kept.
#
# NOTE! If you intend to place this on an NFS (or otherwise network)
# mounted filesystem then please read the Mutex documentation (available
# at <URL:http://httpd.apache.org/docs/2.4/mod/core.html#mutex>);
# you will save yourself a lot of trouble.
#
# Do NOT add a slash at the end of the directory path.
#
ServerRoot "/etc/apache2"

#
# The accept serialization lock file MUST BE STORED ON A LOCAL DISK.
#
# Mutex file:${APACHE_LOCK_DIR} default

#
# The directory where shm and other runtime files will be stored.
#

DefaultRuntimeDir ${APACHE_RUN_DIR}

#
# PidFile: The file in which the server should record its process
# identification number when it starts.
# This needs to be set in /etc/apache2/envvars
#
PidFile ${APACHE_PID_FILE}

#
# Timeout: The number of seconds before receives and sends time out.
#
Timeout 300

#
# KeepAlive: Whether or not to allow persistent connections (more than
# one request per connection). Set to "Off" to deactivate.
#
KeepAlive On

#
# MaxKeepAliveRequests: The maximum number of requests to allow
# during a persistent connection. Set to 0 to allow an unlimited amount.
# We recommend you leave this number high, for maximum performance.
#
MaxKeepAliveRequests 100

#
# KeepAliveTimeout: Number of seconds to wait for the next request from the
# same client on the same connection.
#
KeepAliveTimeout 5


# These need to be set in /etc/apache2/envvars
User ${APACHE_RUN_USER}
Group ${APACHE_RUN_GROUP}

#
# HostnameLookups: Log the names of clients or just their IP addresses
# e.g., www.apache.org (on) or 204.62.129.132 (off).
# The default is off because it'd be overall better for the net if people
# had to knowingly turn this feature on, since enabling it means that
# each client request will result in AT LEAST one lookup request to the
# nameserver.
#
HostnameLookups Off

# ErrorLog: The location of the error log file.
# If you do not specify an ErrorLog directive within a <VirtualHost>
# container, error messages relating to that virtual host will be
# logged here. If you *do* define an error logfile for a <VirtualHost>
# container, that host's errors will be logged there and not here.
#
ErrorLog ${APACHE_LOG_DIR}/error.log

#
# LogLevel: Control the severity of messages logged to the error_log.
# Available values: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the log level for particular modules, e.g.
# "LogLevel info ssl:warn"
#
LogLevel warn

# Include module configuration:
IncludeOptional mods-enabled/*.load
IncludeOptional mods-enabled/*.conf

# Include list of ports to listen on
Include ports.conf


# Sets the default security model of the Apache2 HTTPD server. It does
# not allow access to the root filesystem outside of /usr/share and /var/www.
# The former is used by web applications packaged in Debian,
# the latter may be used for local directories served by the web server. If
# your system is serving content from a sub-directory in /srv you must allow
# access here, or in any related virtual host.
<Directory />
Options FollowSymLinks
AllowOverride None
Require all denied
</Directory>

<Directory /usr/share>
AllowOverride None
Require all granted
</Directory>

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

#<Directory /srv/>
# Options Indexes FollowSymLinks
# AllowOverride None
# Require all granted
#</Directory>




# AccessFileName: The name of the file to look for in each directory
# for additional configuration directives. See also the AllowOverride
# directive.
#
AccessFileName .htaccess

#
# The following lines prevent .htaccess and .htpasswd files from being
# viewed by Web clients.
#
<FilesMatch "^\.ht">
Require all denied
</FilesMatch>


#
# The following directives define some format nicknames for use with
# a CustomLog directive.
#
# These deviate from the Common Log Format definitions in that they use %O
# (the actual bytes sent including headers) instead of %b (the size of the
# requested file), because the latter makes it impossible to detect partial
# requests.
#
# Note that the use of %{X-Forwarded-For}i instead of %h is not recommended.
# Use mod_remoteip instead.
#
LogFormat "%v:%p %h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" vhost_combined
LogFormat "%h %l %u %t \"%r\" %>s %O \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %O" common
LogFormat "%{Referer}i -> %U" referer
LogFormat "%{User-agent}i" agent

# Include of directories ignores editors' and dpkg's backup files,
# see README.Debian for details.

# Include generic snippets of statements
IncludeOptional conf-enabled/*.conf

# Include the virtual host configurations:
IncludeOptional sites-enabled/*.conf

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

端口配置

端口配置有两种方式可以选择,可以在 port.conf 里面统一管理,或者也可以在任一虚拟站点配置文件里面分开管理。

# If you just change the port or add more ports here, you will likely also
# have to change the VirtualHost statement in
# /etc/apache2/sites-enabled/000-default.conf

Listen 80

<IfModule ssl_module>
Listen 443
</IfModule>

<IfModule mod_gnutls.c>
Listen 443
</IfModule>

# vim: syntax=apache ts=4 sw=4 sts=4 sr noet

虚拟站点

虚拟站点的配置文件名为 vhost.conf

<VirtualHost  *:80>
# 监听服务器80端口
ServerAdmin ssxx.site@qq.com
# 站点管理者邮箱
DocumentRoot "/var/www/html/main"
# 当前站点文件根目录(单IP虚拟站点修改此项)
ServerName www.ssxx.site
# 当前站点访问URL,记得解析二级域名(单IP多站点修改此项)
ServerAlias RootWeb
# 当前站点别名,无特殊要求
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# 访问、异常日志路径

RewriteEngine on
RewriteCond %{HTTPS} !=on
RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]

Protocols h2c http/1.1
</VirtualHost>

部署运行环境

NodeJS

PHP

Python

部署 Web 应用

CMS

想拥有一个属于自己的博客站点吗,不妨看看这一节的内容

WordPress,Typecho,Solo,Hexo

MCSM

相对于直接在系统上维护你的游戏服务器,MCSM 这一面板似乎方便很多

静态站点

只想要一个服务器的官网?或者说想使用 GitHub+Hexo 部署自己的博客

私有网盘

相对于使用百度云盘 100Kbps 的下载速度,为何不借助自己的服务器分发客户端呢

代理应用

反向代理?正向代理?添加 SSL?

访问速度

使用 CDN

CDN(内容分发网络)

压缩资源

webp,Gzip,minjs

切换 PHP 模式

上杉显出很高兴的样子,将两根指头的长指甲敲着键盘,点头说:“对呀对呀!PHP 有五种运行模式,你知道么?”

使用 HTTP/2

“2.0 协议重点是对终端用户的感知延迟、网络及服务器资源的使用等性能的优化。”当然,如果你有兴趣,也可以直接一步到位面向未来使用 HTTP/3 协议。

网络安全

增加 SSL

<VirtualHost  *:443>
# my website index
# website basal config
ServerAdmin ssxx.site@qq.com
DocumentRoot "/var/www/html/main"
ServerName www.ssxx.site
ServerAlias MyIndexPage
# log path
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# website ssl config
SSLEngine on
SSLProtocol all -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"
SSLHonorCipherOrder on
# ssl cert
SSLCertificateFile "/etc/apache2/cert/cert.cer"
SSLCertificateKeyFile "/etc/apache2/cert/cert.key"
# enable http/2
Protocols h2 http/1.1
</VirtualHost>

文件权限

代理访问

Proxy,依据 Azw 博文研究操作

追踪异常

学会读日志真的很重要!

应用异常

服务器错误

站点显示 403、404、500 等 HTTP 状态码?

奇技淫巧

绕过 ISP 封堵

众所周知由于天朝的

拒绝兼容 IE

<script>
if (
/*@cc_on!@*/ false ||
(!!window.MSInputMethodContext && !!document.documentMode)
)
window.location.href =
"Your 404 or other error page to warn client don't use ie" +
encodeURIComponent(window.location.href);
</script>

提交收录

想提高站点关注度的唯一解决措施就是向搜索引擎提交收录请求

使用 Docker

使用容器可以相当方便快捷的部署一份应用,且不用担心宿主环境和兼容性问题

物理/云主机

你真的有需求使用物理服务器吗?

附录

文件系统

在此我打印列出了一份 Linux 发行版根目录里面各文件夹的释义

/bin -> /usr/bin:binaries 二进制文件,存放软链接和命令的目录
/boot:启动系统的核心文件,包括链接文件和镜像
/dev:device 设备,存放系统的外置设备
/etc:etcetera 附加文件,存放系统管理配置文件
/home:用户主目录,下属用户账号文件夹
/lib -> /usr/lib:library 库,存放系统动态链接库,类似DLL文件
/lib64 -> /usr/lib64:同上,存放64位动态链接库
/media:外挂存储设备的挂载目录
/mnt:外挂其他文件系统的存储设备的挂载目录
/opt:optional 可选,安装额外软件目录
/proc:processes 进程,伪文件系统,存储内核运行的文件,内存的映射
/root:root 系统管理员的根目录
/run:临时文件目录,存储启动以来的信息日志,重启删除
/sbin -> /usr/sbin:super user binaries 系统管理员二进制文件
/srv:服务启动后所需要提取的数据
/sys:新文件系统sysfs,挂载有进程信息proc、设备decfs、伪终端devpts
/tmp:temporary 临时,存放一些临时所需的文件
/usr:unix shared resources 共享资源,类似Program Files
/var:variable 变量,存放经常被修改的文件,包含各类软件信息日志

软件管理

Linux 发行版有两种软件管理方式:包管理和编译

一份参考卡

推广信息

【腾讯云】多款云产品 1 折起,买云服务器送免费机器,最长免费续 3 个月