2021-06-08

What-Is-SQLite

1. SQLite 简介
	1.1 公有领域
	1.2 ACID
2. SQLite 特性
	2.1 SQLite 重点特性
	2.2 一些添加特性的版本
3. SQLite 教程
	3.1 教程链接
	3.2 SQLite 命令; 语法; 数据类型; 常用函数
	3.3 SQLite 局限性
4. SQLite 工具
5. DB Browser for SQLite

1. SQLite 简介

https://www.sqlite.org
https://zh.wikipedia.org/wiki/SQLite
https://wiki.archlinux.org/title/SQLite
SQLite(/ˌɛskjuːɛlˈlaɪt/或/ˈsiːkwəl.laɪt/)是遵守ACID的关系数据库管理系统,它包含在一个相对小的C程序库中。与许多其它数据库管理系统不同,SQLite不是一个客户端/服务器结构的数据库引擎,而是被集成在用户程序中(嵌入式699KB)。
SQLite 通常遵循PostgreSQL语法。SQLite 使用不保证域完整性的动态弱类型SQL语法。
SQLite将PostgreSQL作为参考平台。项目将“PostgreSQL可能做些什么”作为SQL标准实现的开发参考。
然而与这个目标最重要的偏差在于,除了主键以外,SQLite不强制进行类型检查。一个值的类型是动态的,不被schema所强制限制(虽然如此,但如果可以进行可恢复的类型转换时,schema会在存储数据时触发一个自动转换)。SQLite 努力遵循Postel 的规则。
SQLite是D. Richard Hipp 于2000年创建的公有领域项目。
文件扩展名通常会用: .sqlite3; .sqlite; .db; .db3

1.1 公有领域

https://en.wikipedia.org/wiki/Public_domain
https://zh.wikipedia.org/wiki/公有领域
(英文:Public Domain)是在现代知识产权法体系下,一种由不适于私人所有权的知识财产要素组成的真正的公地[1],或是不适合于知识产权保护的思想和作品的总体。是人类的一部分作品、知识总汇,可以包括文章、艺术品、音乐、科学理论、发明等。
对于领域内的知识财产,任何个人或团体都不具所有权益(所有权益通常由著作权或专利体现)。这些知识发明属于公有文化遗产,任何人可以不受限制地使用和加工它们(此处不考虑有关安全、出口等的法律)。

1.2 ACID

是指数据库管理系统(DBMS)在写入或更新资料的过程中,为保证事务(transaction)是正确可靠的,所必须具备的四个特性: 

  • Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
  • Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
  • Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括未提交读(Read uncommitted)、提交读(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

2. SQLite 特性

2.1 SQLite 重点特性

https://www.sqlite.org/quirks.html
全部特性请查阅上面链接, 以下是一些主要的特点: 

  • 程序库实现了多数的SQL-92标准,包括事务,以及遵循ACID,但它缺失了某些特性。例如,它仅部分支持触发器,不能写入视图(但是,它提供了提供此功能的 INSTEAD OF 触发器)。尽管它支持大多数的复杂查询,但它的ALTER TABLE功能有所限制,不能修改或删除列,只能通过重新创建表的方式迂回进行。这在 3.25.0 版中发生了变化,支持 ALTER TABLE RENAME COLUMN 和 3.35.0 版中的 ALTER TABLE DROP COLUMN。
  • SQLite不进行类型检查。SQLite为 SQL 兼容的 DBMS使用了一个不寻常的类型系统:不是像大多数 SQL 数据库系统那样为列分配类型,而是将类型分配给单独的值;在语言方面,它是动态类型的。此外,它以与Perl相同的某些方式弱类型化:可以将字符串插入整数column (尽管 SQLite 会首先尝试将字符串转换为整数,如果该列的首选类型是整数)。这增加了列的灵活性,尤其是在绑定到动态类型的脚本语言时。但是,该技术不可移植到其他 SQL 产品。一个普遍的批评是 SQLite 的类型系统缺乏其他产品中静态类型列提供的数据完整性机制。SQLite 网站描述了“严格关联”模式,但尚未添加此功能。然而,它可以通过约束来实现CHECK(typeof(x)='integer')。
  • 表通常包含一个隐藏的rowid索引列,它提供了更快的访问。如果数据库包含一个整数主键列,SQLite 通常会将其视为rowid的别名来优化它,导致内容存储为严格类型的64 位有符号 整数,并将其行为更改为有点像一个自动递增的列。未来版本的 SQLite 可能包含一个命令,用于检查列是否具有类似rowid 的行为,以将这些列与弱类型、非自动递增的整数主键区分开来。
  • 具有完整Unicode功能的SQLite是可选的。
  • 多个进程或线程可以同时访问同一个数据而没有问题。可以同时平行读取同一个数据库。但同一时间只能有一个进程或线程进行数据写入;否则会写入失败并得到一个错误消息(或者会自动重试一段时间;自动重试的逻辑以及重试时间的长短是可以设置的)。
  • 程序设计者还提供了一个叫做sqlite3的独立程序用来查询和管理SQLite数据库文件。SQLite的用户可以把这个程序当作如何写SQLite应用程序的示例。

2.2 一些添加特性的版本

  • 3.7 版本中并发访问打开预写日志记录(WAL)时,限制会放宽,从而启用并发读取和写入。
  • 3.6.19 版本中增加了对外键约束的支持。2009年.
  • 3.7.4 版本中首先添加了 FTS4(全文搜索)模块,该模块对旧的 FTS3 模块进行了增强。FTS4 允许用户对文档进行全文搜索,类似于搜索引擎搜索网页的方式。
  • 3.8.2 版本中添加了对创建没有rowid 的表的支持,这可能会提供空间和性能改进。
  • 3.8.3 版本中添加了公共表表达式支持。
  • 3.9 版, 通过json1 扩展和新的子类型接口, 引入了JSON内容管理。2015年.
  • 3.33.0版, 支持的最大数据库大小为 281 TB。
  • 3.35.5版,目前最新版, 2021-4-19

https://www.sqlite.org/src/timeline?n=100&y=ci
https://www.sqlite.org/chronology.html

开发和发行 Development and distribution

  • SQLite 的代码由Fossil托管,Fossil是一个分布式版本控制系统,它本身建立在 SQLite 数据库之上。
  • SQLite 的发行版中提供了一个独立的命令行程序。它可用于创建数据库、定义表、插入和更改行、运行查询和管理 SQLite 数据库文件。它还可以作为编写使用 SQLite 库的应用程序的示例。
  • SQLite 在每次发布之前使用自动回归测试。作为发布验证的一部分,运行了超过 200 万次测试。从 2009 年 8 月 10 日发布的 SQLite 3.6.17 开始,SQLite 版本具有 100% 的分支测试覆盖率,这是代码覆盖率的组成部分之一。测试和测试工具部分是公共领域的,部分是专有的。

3. SQLite 教程

3.1 教程链接

https://www.sqlite.org/quickstart.html
https://www.tutlane.com/tutorial/sqlite
https://www.sqlitetutorial.net/
https://www.runoob.com/sqlite/sqlite-intro.html

3.2 SQLite 命令; 语法; 数据类型; 常用函数

https://www.runoob.com/sqlite/sqlite-commands.html
https://www.runoob.com/sqlite/sqlite-syntax.html
https://www.runoob.com/sqlite/sqlite-data-types.html
https://www.runoob.com/sqlite/sqlite-functions.html

类型 命令 描述
DDL
数据定义
CREATE 创建一个新的表,一个表的视图,或者数据库中的其他对象。
ALTER 修改数据库中的某个已有的数据库对象,比如一个表。
DROP 删除整个表,或者表的视图,或者数据库中的其他对象。
DML
数据操作
INSERT 创建一条记录。
UPDATE 修改记录。
DELETE 删除记录。
DQL查询 SELECT 从一个或多个表中检索某些记录。

3.3 SQLite 局限性

在 SQLite 中,
SQL92 不支持的特性
以下内容大概基于: SQLite version 3.7.15.2 2013-01-09
来自: https://www.runoob.com/sqlite/sqlite-intro.html
RIGHT OUTER JOIN 只实现了 LEFT OUTER JOIN。
FULL OUTER JOIN 只实现了 LEFT OUTER JOIN。
ALTER TABLE 支持 RENAME TABLE 和 ALTER TABLE 的 ADD COLUMN variants 命令,
不支持 DROP COLUMN、ALTER COLUMN、ADD CONSTRAINT。
Trigger 支持 支持 FOR EACH ROW 触发器,但不支持 FOR EACH STATEMENT 触发器。
VIEWs 在 SQLite 中,视图是只读的。不可以在视图上执行 DELETE、INSERT 或 UPDATE 语句。
GRANT 和 REVOKE 可以应用的唯一的访问权限是底层操作系统的正常文件访问权限。

4. SQLite 工具

$ sudo pacman -Ss sqlite
core/sqlite 3.35.5-1 [installed]
A C library that implements an SQL database engine
core/sqlite-analyzer 3.35.5-1 [installed]
An analysis program for sqlite3 database files
core/sqlite-doc 3.35.5-1 [installed]
most of the static HTML files that comprise this website, including all of the SQL Syntax and
the C/C++ interface specs and other miscellaneous documentation
community/sqlitebrowser 3.12.1-1 [installed]
SQLite Database browser is a light GUI editor for SQLite databases, built on top of Qt

$ sudo pacman -Fl sqlite |grep bin
sqlite usr/bin/showdb
sqlite usr/bin/showjournal
sqlite usr/bin/showstat4
sqlite usr/bin/showwal
sqlite usr/bin/sqldiff
sqlite usr/bin/sqlite3

  • sqlite3, 命令行 Shell → 该界面可用于创建、修改和查询任意 SQLite 数据库文件。https://www.sqlite.org/cli.html
  • sqlite3_analyzer, 数据库分析器 → 这个独立程序读取 SQLite 数据库并输出一个文件,显示每个表和索引使用的空间以及其他统计信息。使用 [dbstat 虚拟表] 构建。
  • sqldiff, 数据库差异 → 这个独立程序比较两个 SQLite 数据库文件并输出将一个转换为另一个所需的 SQL。

5. DB Browser for SQLite

https://sqlitebrowser.org/
https://github.com/sqlitebrowser/sqlitebrowser
DB Browser for SQLite (DB4S) 是一种高质量、可视化、开源的工具,用于创建、设计和编辑与 SQLite 兼容的数据库文件。
DB4S 适用于想要创建、搜索和编辑数据库的用户和开发人员。DB4S 使用熟悉的类似电子表格的界面,无需学习复杂的 SQL 命令。
用户可以使用控件和向导:

  • 创建和压缩数据库文件
  • 创建、定义、修改和删除表
  • 创建、定义和删除索引
  • 浏览、编辑、添加和删除记录
  • 搜索记录
  • 以文本形式导入和导出记录
  • 从/到 CSV 文件导入和导出表
  • 从 SQL 转储文件导入和导出数据库
  • 发出 SQL 查询并检查结果
  • 检查应用程序发出的所有 SQL 命令的日志
  • 根据表或查询数据绘制简单图形

 

2021-06-07

grafana

1. 本地版安装
2. 插件管理
	2.1 插件管理命令
	2.2 添加csv数据源插件
	2.3 添加sqlite数据源插件
3. 添加数据源
4. Dashboard 仪表盘
	4.1 新建Dashboard仪表盘
	4.2 添加及编辑Panel面板
	4.3 Dashboard仪表盘查看
5. 开源BI对比表

 

https://grafana.com/grafana/
https://github.com/grafana/grafana
https://wiki.archlinux.org/title/Grafana
Grafana是一个开源的通用仪表板和图形编辑器,作为 Web 应用程序运行。It supports graphite , InfluxDB , Prometheus or opentsdb as backends.
  • 有线上版: 永久免费访问; 3 位用户; 10k 活跃指标; 50GB 日志; 14 天保留. Grafana Pro 的 14 天试用期, 无限的指标、日志和用户、长期保留和高级团队协作功能。
  • 也有本地安装的版本, 下文记录了在Arch Linux上的安装及使用.

1. 本地版安装

$ sudo pacman -S grafana

$ sudo pacman -Fl grafana |grep '\.service'
grafana usr/lib/systemd/system/grafana.service
$ sudo pacman -Fl grafana |grep bin
grafana usr/bin/grafana-cli
grafana usr/bin/grafana-server

启动: 
$ sudo systemctl start grafana.service
访问: http://127.0.0.1:3000
访问 Web 前端的默认用户名及密码是的admin密码admin。

2. 插件管理

2.1 插件管理命令

https://grafana.com/docs/grafana/latest/administration/cli/#plugins-commands
列出可用的插件, 需要联网. 
$ grafana-cli plugins list-remote
安装最新版本的插件
$ sudo grafana-cli plugins install <plugin-id>
安装特定版本的插件
$ sudo grafana-cli plugins install <plugin-id> <version>

列出已安装的插件
$ sudo grafana-cli plugins ls
installed plugins:
frser-sqlite-datasource @ 1.2.0
marcusolsson-csv-datasource @ 0.5.0

更新所有已安装的插件
$ sudo grafana-cli plugins update-all
更新一个插件
$ sudo grafana-cli plugins update <plugin-id>
删除一个插件
$ sudo grafana-cli plugins remove <plugin-id>

管理命令仅在 Grafana 4.1 及更高版本中可用。显示所有管理命令
$ sudo grafana-c$ sudo li admin
重置管理员密码
$ sudo grafana-cli admin reset-admin-password <new password>
使用 CLI 重置管理员用户的密码。如果您丢失了管理员密码,您可能需要这样做。

如果有两个标志用于设置主路径和配置文件路径,则运行该命令会返回此错误: 
  找不到配置默认值,请确保设置了 homepath 命令行参数或工作目录为 homepath
要更正此问题,请使用--homepath全局选项为此命令指定 Grafana 默认主路径:
$ sudo grafana-cli --homepath "/usr/share/grafana" admin reset-admin-password <new password>
如果您没有丢失管理员密码,建议您在用户首选项或服务器管理 > 用户选项卡中更改用户密码。

2.2 添加csv数据源插件

左边侧栏选择 Configuration \ Plugins
这里列出了本地现有的插件. 在每个插件的右边可以看到插件的类别, 主要有:
  • Panel 面板: 用于展示数据的饼图, 曲线, 列表等.
  • Data Source 数据源: 用于链接数据源.
  • Application 应用程序: 当您想要创建自定义的、开箱即用的监控体验时,请使用应用程序插件。应用程序插件捆绑数据源和面板以提供有凝聚力的体验,例如 Prometheus 和 Kubernetes 应用程序。
https://grafana.com/grafana/plugins/
https://grafana.com/grafana/plugins/marcusolsson-csv-datasource/?tab=installation
搜索到需要的CSV插件, 按提示安装.
$ sudo grafana-cli plugins install marcusolsson-csv-datasource
该插件将安装到您的 grafana 插件目录中;默认为 /var/lib/grafana/plugins。安装完成后重启服务。
$ sudo systemctl restart grafana.service

2.3 添加sqlite数据源插件

https://grafana.com/grafana/plugins/frser-sqlite-datasource/
$ sudo grafana-cli plugins install frser-sqlite-datasource
Error: ✗ Failed to send request: API returned invalid status: 504 Gateway Time-out 发送请求失败:API 返回无效状态:504 网关超时

建议在大多数情况下使用 Grafana CLI安装插件。如果 Grafana 服务器无法访问 Internet,则可用 .zip 下载-解压的方式。
https://grafana.com/api/plugins/frser-sqlite-datasource/versions/1.2.0/download
https://grafana.com/docs/grafana/latest/plugins/installation/
$ sudo unzip frser-sqlite-datasource-1.2.0.zip -d /var/lib/grafana/plugins/
Archive:  frser-sqlite-datasource-1.2.0.zip
解压完成后重启服务。
$ sudo systemctl restart grafana.service

3. 添加数据源

左边侧栏选择 Configuration \ Data Sources
Add data source

  • 这里选择 CSV 插件(因为准备了CSV数据文件)
  • 有线上http, 或者本地文件Local. 我们这里选择本地。
    •   若提示权限不足,请检查目录, 或上级目录,目录权限设置为755即可.
  • 输入名称, 选择Local, 复制路径到这里,
  • Save & Test 保存并测试. 通过后就可以使用了.

4. Dashboard 仪表盘

4.1 新建Dashboard仪表盘

首先要新建Dashboard仪表盘, 类似一个网页, 然后在这个Dashboard仪表盘上添加一个或多个Panel面板(柱状图, 饼图, 列表等)展示图形数据.

回到首页, 右上角添加面板Panel, 然后直接点击旁边的保存按钮, 弹出保存仪表盘对话框. 填个名称(比如: Population)保存. 建立一个Dashboard仪表盘页面。
接下来就是设计这个Dashboard仪表盘, 添加多个Panel面板(柱状图, 饼图, 列表等). 如图包含有4个面板:
Panel和Panel之间, 可以通过拖拽, 改变位置, 也可以放大或缩小.

4.2 添加及编辑Panel面板

点击Panel的标题, 弹出下拉菜单, 选择Edit编辑. 进入单个Panel的编辑页面.
如下图: 区域说明:

  • 左上角返回; 右上角: 保存, 应用及配置;
  • 左上Panel面板预览区;
  • 左下查询区, 添加查询, 选择图形中要显示的字段。(还可以添加表达式, 使用转换模块梳理数据)
  • 右边属性及插件栏.

操作:

  • 右边属性Panel页签, 填写Panel Title及描述
  • 在左下Query查询区, 会显示默认的数据源, 可以通过下拉选择其他数据源.
  • 点击右边的Visualization区域的插件, 这里不同的插件可以让左上角的Panel显示相应的形态. 编辑时最常用的是Table. 用来查看字段及数据.
  • 选择了数据源, 选择了Table, 这时应该可以在左上Panel面板预览到表格数据.
  • 根据这里看到的表格标题,在左下Query查询区添加需要图形显示的字段Field. 字段名和上面的Table的标题保持一致. 选择相应的类型.
  • Field: Year Type: Time;
  • Field: A0-19 Type: Number...
  • 添加好需要显示的字段, 再点击右边的Visualization区域的Graph插件.
  • 左上Panel面板应该显示出图形了, 若图形不是你想要的, 检查一下时间区间, 比如我这个表格是150年的数据, 每年一个总计, 而图形初始默认的时间可能只是一天. 这里只需要将时间区间改为(1950-7-1 ~ 2100-7-1)即可, 现在图形就完整了.
  • 保存(勾选: Save current time range as dashboard default), 每次修改保存, 都可以填写修改日志.

一个Panel就完成了, 类似的方式完善其他几个Panel, 新建的Dashboard仪表盘就完成了.

4.3 Dashboard仪表盘查看

若Dashboard仪表盘以及设计完成,在设置页面可以点击[Read-only], 设置位只读. 就不用担心会被误操作了. 若要修改随时回到这里改回[Editable]即可.

查看模式下, 如下图, 所有项目到右方都趋于平缓且接近, 变得无法分辨了. 可以点击你想看的某个或某几个项目(支持:Ctrl多选; Shift区域选择).


更多更高级的应用请查阅官方文档
https://grafana.com/docs/grafana/latest/

5. 开源BI对比表

今天安装测试了 Grafana 测试内容就是上文. 其他的产品都没用过. 原因是Arch Linux官方软件包里目前只有这一个...
注: 下面表格内容来自: https://blog.51cto.com/michaelkang/2533111

name 表格内容来自:
https://blog.51cto.com/michaelkang/2533111
试用体验
(原文时间2020-9)
数据源
支持
版本
更新
开发
语言
官网地址
Git 地址
Watch Star Fork Contributors
Grafana grafana 主要用于大规模指标数据的可视化展现,目前已经支持绝大部分常用的时序数据库。支持数据源丰富,支持图表展示、权限控制、支持告警、单点登录等,特性丰富。 风格偏数据工程师/数据分析师 较多 go https://grafana.com/grafana/
https://github.com/grafana/grafana
1.3k 35.9k 7.2k 1193
Redash redash可以作为可视化工具、数据库查询编辑器(类似navicat-premium)、数据挖掘探索工具来用。截止目前,自建redash支持43种数据源,在权限控制,精细配图方面比superset弱,但是环境易维护,可以生成中间表,可以join。 风格偏数据工程师/数据分析师/数据科学家 较多 Python https://redash.io/
https://github.com/getredash/redash
580 16.7k 2.8k 328
Supset Superset 是一款由 Airbnb 开源的“现代化的企业级 BI,其通过创建和分享 dashboard,为数据分析提供了轻量级的数据查询和可视化方案。官方提供了一个复杂的权限控制,这块的功能感觉还不完善。 风格偏数据工程师/数据分析师/数据科学家/运营 较快 Python https://airbnb.io/projects/superset/
https://github.com/apache/incubator-superset
1.3k 29.2k 6k 464
Metabase Metabase,一个几乎开箱即用BI工具。大概半小时就是上手到半精通的工具。用户体验极佳,界面也很漂亮,但是界面中文翻译有点弱。 风格偏 非技术人员/市场运营/产品运营/数据工程师/数据分析师/数据科学家 一般 java https://www.metabase.com/docs/latest/getting-started.html
https://github.com/metabase/metabase
599k 21.3k 2.8k 226
Davinci 宜信技术研发中心的大数据可视化平台开发的达芬奇开源BI软件。致力于提供一站式数据可视化解决方案。既可作为公有云/私有云独立部署使用,也可作为可视化插件集成到三方系统。用户只需在可视化 UI 上简单配置即可服务多种数据可视化应用,并支持高级交互/行业分析/模式探索/社交智能等可视化功能。 风格偏 运营/数据工程师/数据分析师/数据科学家 一般 java https://edp963.github.io/davinci/
https://github.com/edp963/davinci
168 k 2.4 k 981 20
Pentaho Pentaho被Hitachi收购,现在是Hitachi Ventara的一部分。不过,它仍被称为Pentaho。虽然不再通过Hitachi的网站提供Pentaho Business Analytics的免费版本,但你可以在SourceForge上找到免费版本。 风格偏 数据工程师/数据分析师/数据科学家 一般 java www.pentaho.com
https://github.com/pentaho/pentaho-platform
136 k 410 664 147
CBoard CBoard由国内公司主导开源, 它不仅仅是一款自助BI数据分析产品, 还是开放的BI产品开发平台。 风格偏 数据工程师/数据分析师/数据科学家 一般 java https://peter_zhang921.gitee.io/cboard_docsify/#/zh-cn/
https://github.com/TuiQiao/CBoard
https://gitee.com/tuiqiao/CBoard
280 2.5k 1.1k 24
Datadeck 在Datadeck平台,把不同渠道的数据连接起来,一键可视化呈现,成员间自由分享。拥有令人叹为观止的操作易用性,只需几下轻松的点击,实现高度灵活的可视化功能。与常见的数据面板产品提供有限的预制图表不同,DataDeck开放了全面灵活的自定义功能,以便满足用户多样化的业务需求。 风格偏 非技术人员/市场运营/产品运营/数据工程师/数据分析师/   商业 https://cn.ptmind.com/datadeck/
http://www.datadeck.cn/
       
SpagoBI
KNOWAGE
从2017年的 6.0 版开始, SpagoBI 以 KNOWAGE 的形式发布。 https://www.spagobi.org/
https://github.com/SpagoBILabs/SpagoBI
    java https://www.knowage-suite.com/site/
https://github.com/KnowageLabs
https://github.com/KnowageLabs/Knowage-Server
  285 172  

Datadeck是商用的, 放在这里是对非技术人员友好的原因.
另外(SpagoBI < 2017 > KNOWAGE), 这是一个东西, 2017改了名字, 具体特性还不了解.

 

2021-06-04

PhpPgAdmin

1. 安装
2. 配置
	2.1 php-pgsql
	2.2 网络服务器
		2.2.1 Apache
		2.2.2 nginx
	2.3 phpPgAdmin 配置
3. 访问 phpPgAdmin
4. 异常
	4.1 phpPgAdmin首页异常(pgsql)
	4.2 出于安全原因禁止登录
	4.3 登陆时报错(adodb.inc.php)
	4.4 apache异常(php_flag)
5. (重复内容)前3节内容表格形式

https://wiki.archlinux.org/title/PhpPgAdmin
https://wiki.archlinux.org/title/PostgreSQL
phpPgAdmin: 是基于 Web 使用 PHP 前端管理 PostgreSQL 数据库的工具.
本文记录了2种站点服务器(Apache/nginx)访问PhpPgAdmin站点. 
前提是这2种站点服务器(Apache/nginx)已经具备了php基本支持,可以访问到(<?php phpinfo();)内容的测试文件:test.php.
https://szosoft.blogspot.com/2021/06/http-server.html

1. 安装

$ sudo pacman -Ss php |grep installed
extra/php 8.0.6-1 [installed]
extra/php-fpm 8.0.6-1 [installed]
extra/php-pgsql 8.0.6-1 [installed: 8.0.7-1]
extra/php7 7.4.18-1 [installed]
extra/php7-pgsql 7.4.18-1 [installed]
community/phppgadmin 7.13.0-2 [installed]

2. 配置

2.1 php-pgsql

编辑/etc/php/php.ini 取消以下行注释, 启用PHP中的pgsql扩展:
extension=pdo_pgsql
extension=pgsql

确保php可访问/etc/webapps. 在/etc/php/php.ini的open_basedir添加必要路径: 
open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps
* 注释: 这个步骤我没做, 但后续可正常访问主页. 

2.2 网络服务器

2.2.1 Apache

创建以下配置文件
/etc/httpd/conf/extra/phppgadmin.conf
Alias /phppgadmin "/usr/share/webapps/phppgadmin"
<Directory "/usr/share/webapps/phppgadmin">
    DirectoryIndex index.php
    AllowOverride All
    Options FollowSymlinks
    Require all granted
    # phppgadmin raises deprecated warnings that lead
    # to parsing errors in JS
    php_flag display_startup_errors off
    php_flag display_errors off
    php_flag html_errors off
</Directory>

包含到文件 /etc/httpd/conf/httpd.conf:
# phpPgAdmin configuration
Include conf/extra/phppgadmin.conf

默认情况下,每个人都可以看到 phpPgAdmin 页面,要更改此设置,请根据自己的喜好编辑 /etc/httpd/conf/extra/phppgadmin.conf。 
例如,如果您只想能够从同一台机器访问它,请将 Require all 替换为 Require local。
 

2.2.2 nginx

新增配置文件: php_fastcgi.conf, 该文件会被include到下面的配置文件中.
/etc/nginx/php_fastcgi.conf
location ~ \.php$ {
    # 404
    try_files $fastcgi_script_name =404;
    # default fastcgi_params
    include fastcgi_params;
    # fastcgi settings
    fastcgi_pass      unix:/run/php-fpm/php-fpm.sock;
    fastcgi_index      index.php;
    fastcgi_buffers      8 16k;
    fastcgi_buffer_size    32k;
    # fastcgi params
    fastcgi_param DOCUMENT_ROOT   $realpath_root;
    fastcgi_param SCRIPT_FILENAME   $realpath_root$fastcgi_script_name;
    #fastcgi_param PHP_ADMIN_VALUE   "open_basedir=$base/:/usr/lib/php/:/tmp/";
    #include fastcgi.conf;
}

多文件管理站点(建议), 主配置文件只需要包含站点目录即可, 需要几个站点就增加几个站点配置到/etc/nginx/sites-available/目录下, 需要启用/关闭站点只需要创建/删除链接即可.
$ sudo ln -s /etc/nginx/sites-available/xxx.conf /etc/nginx/sites-enabled/xxx.conf
$ sudo unlink /etc/nginx/sites-enabled/xxx.conf

主配置文件: /etc/nginx/nginx.conf; 末尾包含站点目录: 
http {
    ...
    include sites-enabled/*;
}

新建站点配置: /etc/nginx/sites-available/phppgadmin.conf
server {
    listen       8001;
    listen [::]:8001;
    server_name  localhost;
    #server_name     phppgadmin.<localhost>;
    root    /usr/share/webapps/phppgadmin;
    index   index.php;
    include /etc/nginx/php_fastcgi.conf;
}

启用站点
$ sudo ln -s /etc/nginx/sites-available/phppgadmin.conf /etc/nginx/sites-enabled/phppgadmin.conf
关闭站点
$ sudo unlink /etc/nginx/sites-enabled/phppgadmin.conf

使用单独的 PHP 配置文件设置nginx#FastCGI,如nginx#nginx configuration 所示。
https://wiki.archlinux.org/title/Nginx#nginx_configuration
但: 使用phppgadmin.<domain>形式. 作为子域访问, 但在本地不会填server_name, (phppgadmin.<localhost>这个无效);
所以上面的配置没有改变server_name名, 而使用了不同的listen端口.

另外, 若只是本地测试一个站点, 可直接编辑配置文件: nginx.conf
/etc/nginx/nginx.conf
        # phppgadmin +- 20210602
        root    /usr/share/webapps/phppgadmin;
        index   index.php;
        include /etc/nginx/php_fastcgi.conf;
        #location / {
        #    root   /usr/share/nginx/html;
        #    index  index.html index.htm;
        #}

2.3 phpPgAdmin 配置

phpPgAdmin 的配置文件位于/etc/webapps/phppgadmin/config.inc.php.
如果您的 PostgreSQL 服务器在 上localhost,您可能需要编辑以下行:
$conf['servers'][0]['host'] = ;
$conf['servers'][0]['host'] = 'localhost';

3. 访问 phpPgAdmin

重载 reload, 重启 restart 相关服务 service: ( httpd / nginx ), php-fpm, postgresql
http://127.0.0.1/
http://127.0.0.1/test.php
http://localhost/phppgadmin/
到此, 正确的账户名(不含postgres)+任意密码(不可空)即可登陆...

4. 异常

4.1 phpPgAdmin首页异常(pgsql)

Your PHP installation does not support the pgsql module. You will need to install, enable, or compile it to use phpPgAdmin.
您的 PHP 安装不支持 pgsql 模块。 您需要安装、启用或编译它才能使用 phpPgAdmin。

若test.php OK... 则检查php.ini配置文件, 启用相关模块
$ sudo pacman -S php-pgsql
/etc/php/php.ini
extension=pdo_pgsql
extension=pgsql

4.2 出于安全原因禁止登录

如果额外安全登录是true, 那么 phpPgAdmin 会拒绝没有密码或某些用户名(pgsql, postgres, root, administrator)的登录。
* 阅读FAQ理解如何更改PostgreSQL的pg_hba.conf以启用密码本地连接后, 再将其设置为false。

编辑/etc/webapps/phppgadmin/config.inc.php并更改以下行: 
$conf['extra_login_security'] = true;
至: 
$conf['extra_login_security'] = false;

4.3 登陆时报错(adodb.inc.php)

Virtual Class -- cannot instantiate
虚拟类——无法实例化

$ sudo pacman -Fl phppgadmin |grep adodb.inc.php
phppgadmin usr/share/webapps/phppgadmin/libraries/adodb/adodb.inc.php
注释掉adodb.inc.php的这一行 (网上搜索到的方法, 但暂无相关解释)
//    die('Virtual Class -- cannot instantiate');

4.4 apache异常(php_flag)

$ sudo apachectl configtest
AH00526: Syntax error on line 10 of /etc/httpd/conf/extra/phppgadmin.conf:
Invalid command 'php_flag', perhaps misspelled or defined by a module not included in the server configuration

[临时处理,待完善...]注释掉/etc/httpd/conf/extra/phppgadmin.conf的这3个php_flag后...
$ apachectl configtest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

5. (重复内容)前3节内容表格形式

\ name Apache Nginx, nginx-mainline
http config /etc/httpd/conf/httpd.conf /etc/nginx/nginx.conf
配置验证 $ apachectl configtest $ sudo nginx -t
root /srv/http ; ~/public_html /usr/share/nginx/html/
service httpd.service nginx.service
http:// http://localhost/
http://localhost/~tom/
配置工具:
https://nginxconfig.io/
php

FastCGI
Php-fpm 启用代理模块: /etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

新增配置文件 新增配置文件 php-fpm.conf 包含以下内容: 新增配置文件 php_fastcgi.conf 包含以下内容:
/etc/httpd/conf/extra/php-fpm.conf
DirectoryIndex index.php index.html
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>
/etc/nginx/php_fastcgi.conf
location ~ \.php$ {
# 404
try_files $fastcgi_script_name =404;
# default fastcgi_params
include fastcgi_params;
# fastcgi settings
fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
fastcgi_index index.php;
fastcgi_buffers 8 16k;
fastcgi_buffer_size 32k;

# fastcgi params
fastcgi_param DOCUMENT_ROOT $realpath_root;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
#fastcgi_param PHP_ADMIN_VALUE "open_basedir=$base/:/usr/lib/php/:/tmp/";
#include fastcgi.conf;
}
注: sock和fcgi之间不允许有空格!localhost可任意
更多配置/etc/php/php-fpm.d/www.conf, 但默认设置应该可正常工作。
包含到主配置 包含在主配置/etc/httpd/conf/httpd.conf的底部:
Include conf/extra/php-fpm.conf
包含到站点server块中,
Include /etc/nginx/php_fastcgi.conf;
service php-fpm.service
测试文件
test.php
在DocumentRoot目录(例如/srv/http/或~tom/public_html/) 中创建文件:test.php包含:
<?php phpinfo(); ?>
要测试 FastCGI 实现, 在root目录(server块的root项)下创建包含如下内容的文件: test.php
<?php phpinfo();
测试php http://127.0.0.1/~tom/test.php http://127.0.0.1/test.php
pgsql
数据库支持
php-pgsql
php7-pgsql
/etc/php/php.ini 取消以下行注释来启用php的pgsql扩展:
extension=pdo_pgsql
extension=pgsql

(注: 未操作) 确保php可访问/etc/webapps. 在/etc/php/php.ini的open_basedir添加必要路径:
open_basedir = /srv/http/:/home/:/tmp/:/usr/share/pear/:/usr/share/webapps/:/etc/webapps
PhpPgAdmin PhpPgAdmin 新建站点配置:
/etc/httpd/conf/extra/phppgadmin.conf
新建站点配置:
/etc/nginx/sites-available/phppgadmin.conf
新配置
文件内容
Alias /phppgadmin "/usr/share/webapps/phppgadmin"
<Directory "/usr/share/webapps/phppgadmin">
DirectoryIndex index.php
AllowOverride All
Options FollowSymlinks
Require all granted

# phppgadmin raises deprecated warnings that lead
# to parsing errors in JS
php_flag display_startup_errors off
php_flag display_errors off
php_flag html_errors off
</Directory>
server {
listen 8001;
listen [::]:8001;
server_name localhost;
#server_name phppgadmin.<localhost>;
root /usr/share/webapps/phppgadmin;
index index.php;
include /etc/nginx/php_fastcgi.conf;
}
包含到主配置 并将其包含在/etc/httpd/conf/httpd.conf:
Include conf/extra/phppgadmin.conf
在: /etc/nginx/nginx.conf; 末尾包含站点目录:
include sites-enabled/*;

默认情况下,每个人都可以看到 phpPgAdmin 页面,要更改此设置,请根据自己的喜好进行编辑/etc/httpd/conf/extra/phppgadmin.conf。
例如,如果您只想能够从同一台机器访问它,请将其替换Require all granted为Require local。
启用站点
$ sudo ln -s /etc/nginx/sites-available/phppgadmin.conf /etc/nginx/sites-enabled/phppgadmin.conf
关闭站点
$ sudo unlink /etc/nginx/sites-enabled/phppgadmin.conf
phpPgAdmin
配置
/etc/webapps/phppgadmin/config.inc.php
如果您的 PostgreSQL 服务在 上localhost,则需要编辑以下行:
$conf['servers'][0]['host'] = ;
改为:
$conf['servers'][0]['host'] = 'localhost';
访问
http://localhost/phppgadmin/ http://127.0.0.1:8001/

2021-06-02

http-server

1. Lighttpd
	1.1 配置及验证
	1.2 测试安装结果
	1.3 基本日志记录
2. Nginx
	2.1 安装和启动
	2.2 配置及验证
		2.2.1 服务器块
		2.2.2 管理服务器入口
	2.3 FastCGI
		2.3.1 PHP实现
		2.3.2 nginx配置
		2.3.3 测试配置
3. Apache
	3.1 安装和启动
	3.2 配置及验证
		3.2.1 选项
		3.2.2 检查配置
	3.3 用户目录
	3.4 扩展PHP
		3.4.1 安装php-fpm
		3.4.2. 测试PHP是否有效

Apache Nginx, nginx-mainline Lighttpd ╦═╦ Php-fpm
/etc/httpd/conf/httpd.conf /etc/nginx/nginx.conf /etc/lighttpd/lighttpd.conf config /etc/php/php-fpm.conf
$ apachectl configtest $ nginx -t $ lighttpd -t -f /etc/lighttpd/lighttpd.conf
$ lighttpd -tt -f /etc/lighttpd/lighttpd.conf
配置验证 ../test.php
<?php phpinfo();
/srv/http ; ~/public_html /usr/share/nginx/html/ /srv/http/ root
httpd.service nginx.service lighttpd.service service php-fpm.service
http://localhost/
http://localhost/~tom/
配置工具:
https://nginxconfig.io/
示例配置:
/usr/share/doc/lighttpd/config/
Other http://127.0.0.1/test.php

1. Lighttpd

https://wiki.archlinux.org/title/Lighttpd
lighttpd是一个安全,快速,标准,且非常灵活的网页服务器,并对高性能环境做了最佳化。
相较于其他网页服务器,它占用的内存很少,且注重CPU负载量。

1.1 配置及验证

lighttpd配置文件: /etc/lighttpd/lighttpd.conf 在安装完成后它会自动生成一个用于测试的测试页面。
想要检查 lighttpd.conf 中的语法错误,可以使用以下命令来快速查找错误:
$ lighttpd -t -f /etc/lighttpd/lighttpd.conf
还可以进行更彻底的预检:
$ lighttpd -tt -f /etc/lighttpd/lighttpd.conf
示例配置文件在 /usr/share/doc/lighttpd/

1.2 测试安装结果

预设配置文件会把 /srv/http/ 指定为提供HTTP服务的文件目录。
$ sudo chmod 755 /srv/http/index.html
$ sudo echo 'Test-lighttpd' >> /srv/http/index.html

修改日志目录权限:
$ sudo chown -R http:http /var/log/lighttpd
启动服务:
$ sudo systemctl start lighttpd
然后就可以使用浏览器打开网址 localhost ,你应该能见到测试页面。
http://127.0.0.1/

1.3 基本日志记录

lighttpd 能够输出错误与访问记录到日志文件中。如下编辑/etc/lighttpd/lighttpd.conf以启用这两个日志选项:
server.modules += (
   "mod_access",
   "mod_accesslog",
)
server.errorlog   = "/var/log/lighttpd/error.log"
accesslog.filename = "/var/log/lighttpd/access.log"

2. Nginx

https://wiki.archlinux.org/title/Nginx
Nginx (读作"engine X") 由Igor Sysoev(俄罗斯)于2005年编写,是一个免费、开源、高性能的HTTP服务器和反向代理,也可以作为一个IMAP/POP3代理服务器。
Nginx因为稳定,丰富的功能集,配置简单,资源占用低而闻名世界。这篇文章描述了如何设置nginx并且如何通过#FastCGI集成PHP.

2.1 安装和启动

安装包 nginx-mainline(主线分支:新功能、更新、错误修复)或 nginx(稳定分支:仅主要错误修复)。
推荐使用主线分支。使用稳定分支的主要原因是,你关注的新功能可能产生的影响,如与第三方模块或无意引入的错误的不兼容的新功能。
注意:官方存储库中可用的所有 nginx 模块都需要nginx包(而不是nginx-mainline)作为依赖项。
在做出nginx与nginx-mainline决定之前,查看您可能需要/想要的任何模块列表可能是明智的。nginx-mainline 的模块可以在Arch User Repository 中找到。
$ sudo systemctl start nginx.service
http://127.0.0.1
访问到的默认页面是: /usr/share/nginx/html/index.html

2.2 配置及验证

https://nginx.org/en/docs/beginners_guide.html
https://wiki.nginx.org/Configuration
https://nginx.org/en/docs/
使用 nginx 的第一步在初学者指南中有所描述。您可以通过编辑中的文件来修改配置/etc/nginx/主配置文件位于/etc/nginx/nginx.conf.
更多细节和示例可以在https://wiki.nginx.org/Configuration和官方文档中找到。
下面的示例涵盖了最常见的用例。假定您使用文档的默认位置 (/usr/share/nginx/html)。如果不是这种情况,请替换您的路径。
提示: DigitalOcean 提供了一个Nginx 配置工具。https://nginxconfig.io/
配置验证
$ sudo nginx -t
2021/06/02 19:46:07 [warn] 2420#2420: could not build optimal types_hash, you should increase either types_hash_max_size: 1024 or types_hash_bucket_size: 64; ignoring types_hash_bucket_size
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

2.2.1 服务器块

https://www.nginx.com/resources/wiki/start/topics/examples/server_blocks/
可以使用server块为多个域提供服务。这些类似于Apache HTTP Server 中的“VirtualHosts” 。另请参阅上游示例。
在下面的示例中,服务器侦听两个域的 IPv4 和 IPv6 端口 80 上的传入连接,domainname1.dom并且domainname2.dom:
/etc/nginx/nginx.conf
...
server {
    listen 80;
    listen [::]:80;
    server_name domainname1.dom;
    root /usr/share/nginx/domainname1.dom/html;
    location / {
        index index.php index.html index.htm;
    }
}
server {
    listen 80;
    listen [::]:80;
    server_name domainname2.dom;
    root /usr/share/nginx/domainname2.dom/html;
    ...
}
重新启动 nginx.service以应用任何更改。
注意:通过设置像BIND或dnsmasq这样的 DNS 服务器来确保主机名是可解析的,或者查看网络配置#本地网络主机名解析。

2.2.2 管理服务器入口

把不同的server模块放到不同的文件里是可能的.这样的话可以让你很轻易的开启和禁用特定的站点.
创建以下文件夹:
$ sudo mkdir /etc/nginx/sites-available
$ sudo mkdir /etc/nginx/sites-enabled

在sites-available文件夹下创建一个文件包含一个或更多服务器模块:
/etc/nginx/sites-available/example.conf
server {
    listen 443 ssl http2;
    listen [::]:443 ssl http2;
}
把include sites-enabled/*;放到http 模块的末尾:
/etc/nginx/nginx.conf
...
http {
    ...
    include sites-enabled/*;
}
...
如果要启用一个网站, 只需要简单的创建一个符号链接:
$ sudo ln -s /etc/nginx/sites-available/example.conf /etc/nginx/sites-enabled/example.conf
如果要移除一个网站
$ sudo unlink /etc/nginx/sites-enabled/example.conf
Reload/restart nginx.service 来让配置生效.

2.3 FastCGI

FastCGI,也称为 FCGI,是一种用于将交互式程序与 Web 服务器连接的协议。FastCGI 是早期通用网关接口(CGI) 的变体;FastCGI 的主要目标是减少与 Web 服务器和 CGI​​ 程序接口相关的开销,允许服务器一次处理更多的网页请求。
FastCGI 技术被引入 nginx 以与许多外部工具一起工作,例如Perl、PHP和Python。

2.3.1 PHP实现

PHP-FPM是作为PHP 的FastCGI 服务器运行的推荐解决方案。
安装 php-fpm并确保PHP已正确安装和配置。PHP-FPM 的主要配置文件是/etc/php/php-fpm.conf. 对于基本使用,默认配置应该足够了。
$ sudo systemctl status php-fpm.service

2.3.2 nginx配置

当服务一个PHP web程序时,一个PHP-FPM的location应该包括在 #server代码块里,比如.:
/etc/nginx/sites-available/example.conf
server {
    root /usr/share/nginx/html;
    location / {
        index index.html index.htm index.php;
    }
    location ~ \.php$ {
        # 404
        try_files $fastcgi_script_name =404;
        # default fastcgi_params
        include fastcgi_params;
        # fastcgi settings
        fastcgi_pass unix:/run/php-fpm/php-fpm.sock;
        fastcgi_index index.php;
        fastcgi_buffers 8 16k;
        fastcgi_buffer_size 32k;
        # fastcgi params
        fastcgi_param DOCUMENT_ROOT $realpath_root;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        #fastcgi_param PHP_ADMIN_VALUE "open_basedir=$base/:/usr/lib/php/:/tmp/";
    }
}

若需要处理PHP以外的文件(html, htm): 
location ~ [^/]\.(php|html|htm)(/|$) {
    ...
}

非 .php 的PHP-FPM扩展处理都需要被直接加入到 /etc/php/php-fpm.d/www.conf:
security.limit_extensions = .php .html .htm

2.3.3 测试配置

重新启动php-fpm.service和nginx.service服务,以应用新配置。
要测试 FastCGI 实现,在web的根目录下(nginx.conf配置文件里server块的root项)创建包含如下信息的文件: test.php
<?php phpinfo();
在浏览器中导航此文件,您应该会看到包含当前 PHP 配置的信息页面。
http://127.0.0.1/test.php
PHP Version 8.0.6
System Linux tompc 5.12.8-arch1-1 #1 SMP PREEMPT Fri, 28 May 2021 15:10:20 +0000 x86_64
...

3. Apache

https://www.apache.org/
https://httpd.apache.org/docs/2.4/
https://wiki.apache.org/httpd/
https://wiki.apache.org/httpd/CommonMisconfigurations
https://wiki.archlinux.org/title/Apache_HTTP_Server
LAMP: 是指在许多web 服务器上使用的一个软件组合:Linux,Apache,MySQL/MariaDB以及PHP
Apache HTTP 服务器,简称 Apache,是非常流行的Web服务器软件。
本文档描述了怎样安装设置 Apache 网页服务器。以及选择安装 PHP 并集成到Apache服务器中。

3.1 安装和启动

$ sudo pacman -Ss apache |grep installed
extra/apache 2.4.47-1 [installed]
$ sudo systemctl start httpd

3.2 配置及验证

Apache 配置文件位于/etc/httpd/conf. 主要配置文件是/etc/httpd/conf/httpd.conf,其中包括各种其他配置文件。
对于简单的设置,默认配置文件应该没问题。默认情况下,它会将目录/srv/http提供给访问您网站的任何人。
$ sudo systemctl start httpd
Apache 现在应该正在运行。通过在 Web 浏览器中访问http://localhost/。它应该显示一个简单的索引页面。
http://localhost/

3.2.1 选项

请参阅Apache 配置指令的完整列表和指令快速参考。

常用设置: /etc/httpd/conf/httpd.conf

  • User http: 出于安全原因,若 Apache 由 root 用户(直接或通过启动脚本)启动,它就会切换到此 UID。默认用户是http,它是在安装过程中自动创建的。
  • Listen 80: 这是 Apache 将侦听的端口。使用路由器访问互联网,您必须转发端口。 如果您想为本地开发设置 Apache,您可能希望它只能从您的计算机访问。 然后将此行更改为Listen 127.0.0.1:80.
  • ServerAdmin you@example.com: 这是管理员的电子邮件地址,可以在例如错误页面上找到。
  • DocumentRoot "/srv/http": 这是您放置网页的目录。可修改,但不要忘记也更改<Directory "/srv/http">,否则可能会收到403错误缺乏权限)。 将Require all denied行更改为Require all granted,或收到403。 注: DocumentRoot 目录及其父文件夹必须允许其他人执行权限(chmod o+x /path/to/DocumentRoot),否则您将收到403错误。
  • AllowOverride None: <Directory>部分中的此指令会导致 Apache 完全忽略.htaccess文件。 请注意,这现在是 Apache 2.4 的默认设置,因此如果您打算使用.htaccess文件,则需要明确允许覆盖。 如果您打算mod_rewrite在.htaccess文件中使用或 其他设置,您可以允许该文件中声明的哪些指令可以覆盖服务器配置。

更多设置: /etc/httpd/conf/extra/httpd-default.conf

  • ServerSignature Off: 关闭服务器的签名
  • ServerTokens Prod: 隐藏 Apache 和 PHP 版本等服务器信息

3.2.2 检查配置

$ apachectl configtest
AH00558: httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

3.3 用户目录

默认情况下,用户目录可通过http://localhost/~yourusername/ 访问并显示内容~/public_html(这可以在 中更改/etc/httpd/conf/extra/httpd-userdir.conf)。
如果您不希望用户目录在 Web 上可用,请在/etc/httpd/conf/httpd.conf中注释掉以下行:
Include conf/extra/httpd-userdir.conf

必须确保您的主目录权限设置正确,以便 Apache 可以到达那里。您的主目录~/public_html必须对其他人可执行:
$ chmod o+x ~
$ chmod o+x ~/public_html
$ chmod -R o+r ~/public_html
$ ls -l /home/

drwxr-xr-x 21 tom  users  4096 Jun  2 14:16 tom
$ ls -l /home/tom/
drwxr-xr-x  2 tom  users  4096 Jun  2 14:17 public_html
$ ls -l /home/tom/public_html/
-rw-r--r-- 1 tom users 17 Jun  2 13:54 test.php
-rwxr-xr-x 1 tom users 48 Jun  2 08:17 tom.html

重新启动httpd.service以应用任何更改。另请参阅Umask#Set the mask value。
https://wiki.archlinux.org/title/Umask#Set_the_mask_value

注: 不必+x为每个用户都设置,通过 ACL 只为 web 服务器设置它就足够了(请参阅访问控制列表#授予 web 服务器私有文件的执行权限)。
https://wiki.archlinux.org/title/Access_Control_Lists#Granting_execution_permissions_for_private_files_to_a_web_server

3.4 扩展PHP

3.4.1 安装php-fpm

使用 php-fpm 和 mod_proxy_fcgi,这种方法提供了“PHP FastCGI 实现,具有一些附加功能(大部分)对高负载站点有用”。
注意: 与 ProxyPass 的广泛设置不同,SetHandler 的代理配置尊重其他 Apache 指令,如 DirectoryIndex。这确保了与为 libphp、mod_fastcgi 和 mod_fcgid 设计的软件更好的兼容性。如果您仍想尝试 ProxyPass,请尝试如下一行:
ProxyPassMatch ^/(.*\.php(/.*)?)$ unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/srv/http/$1


安装 php-fpm。启用代理模块:
/etc/httpd/conf/httpd.conf
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

使用以下内容创建: /etc/httpd/conf/extra/php-fpm.conf
DirectoryIndex index.php index.html
<FilesMatch \.php$>
SetHandler "proxy:unix:/run/php-fpm/php-fpm.sock|fcgi://localhost/"
</FilesMatch>
并将其包含在以下内容的底部/etc/httpd/conf/httpd.conf:
Include conf/extra/php-fpm.conf
注意: sock和fcgi之间不允许有空格!localhost可以用任何字符串替换。
更多配置在这里: /etc/php/php-fpm.d/www.conf,但默认设置应该可以正常工作。
启动并启用php-fpm.service. 重新启动 httpd.service。

3.4.2 测试PHP是否有效

要测试 PHP 是否已正确配置,请在您的 ApacheDocumentRoot目录(例如/srv/http/或~<username>/public_html/)中创建一个文件test.php,其中包含以下内容: 
<?php phpinfo();
然后根据需要转到http://localhost/test.php或 http://localhost/~<username>/test.php
http://127.0.0.1/~tom/
http://127.0.0.1/~tom/test.php

2021-05-28

IPv6

1. IPv6 Day
2. IPv6 deployment
3. 与IPv4比较
	3.1 IPv6编码
	3.2 IPv6格式
	3.3 IPv4映射地址
	3.4 IPv6新增了区域ID
	3.5 IPv6的省略书写
	3.6 IPv6地址的分类
	3.7 特殊地址
4. 邻居发现
5. 无状态自动配置(SLAAC)
	5.1 对于Linux客户端
	5.2 对于网关
6 Privacy extensions 隐私扩展
	6.1 dhcpcd
	6.2 NetworkManager
	6.3 systemd-networkd
	6.4. ConnMan
7. Stable private addresses 稳定的私人地址
8. Static address 静态地址
9. IPv6和PPPoE
a 前缀委派(DHCPv6-PD)
	a.1 使用dhcpcd
	a.2 systemd-networkd
	a.3. 其他客户端
b Disable 禁用 IPv6
	b.1 禁用功能
	b.2 其他程序
		b.2.1 dhcpcd
		b.2.2 NetworkManager
		b.2.3 ntpd
		b.2.4 GnuPG
		b.2.5 sshd
	b.3. systemd-networkd
c 在IPv6上优先使用IPv4

https://zh.wikipedia.org/wiki/IPv6
网际协议第6版(英语:Internet Protocol version 6,缩写:IPv6)是网际协议的最新版本,用作互联网的协议。用它来取代IPv4主要是为了解决IPv4地址枯竭问题,同时它也在其他方面对于IPv4有许多改进。

1. IPv6 Day

如今, 全球上网人数已超40亿,IPv4仅能提供约42.9亿个IP位置。NAT网络地址转换, CIDR无类别域间路由等技术延缓网络位置匮乏之现象。
为求解决根本问题...
1990年开始, 
互联网工程工作小组开始规划IPv4的下一代协议,
1994年提议, 各IPng领域的代表们于多伦多举办的IETF会议中,正式提议IPv6发展计划,该提议直到同年的11月17日才被认可。
1996年8月10日, 1994年的提议发展成为IETF的草案标准
1998年公布, 12月由互联网工程工作小组以互联网标准规范(RFC 2460)的方式正式公布IPv6
...
2011年6月8日, 世界IPv6日(英语:World IPv6 Day)是在2011年6月8日由互联网协会组织和赞助的,一次公开测试IPv6的活动。
2012年6月6日, 世界IPv6启动日. 在2011年的活动大获成功之后,互联网协会将2012年6月6日定为了世界IPv6启动日,在这一天,全球IPv6网络已正式启动。

2. IPv6 deployment

https://en.wikipedia.org/wiki/IPv6_deployment
https://zh.wikipedia.org/wiki/IPv6部署
Google的统计数据显示,截至2021年4月,根据用户的星期几(周末更大),其用户的IPv6可用性约为30.30–35.10%。下表是摘录了部分有数据的国家使用IPv6的比例. 

测试本地是否支持IPv6, 苏州的移动宽带去年测试还不通, 今天测了一下通了. 
http://test-ipv6.com/

3. 与IPv4比较

https://zh.wikipedia.org/wiki/IPv6
在Internet上,数据以分组的形式传输。IPv6定义了一种新的分组格式,目的是为了最小化路由器处理的消息标头。
由于IPv4消息和IPv6消息标头有很大不同,因此这两种协议无法互操作。但是在大多数情况下,IPv6仅仅是对IPv4的一种保守扩展。
除了嵌入了互联网地址的那些应用协议(如FTP和NTPv3,新地址格式可能会与当前协议的语法冲突)以外,大多数传输层和应用层协议几乎不怎么需要修改就可以在IPv6上运行。

3.1 IPv6编码

IPv6具有比IPv4大得多的编码地址空间。这是因为IPv6采用128位的地址, 地址空间支持2128。而IPv4使用的是32位(总地址约亿40个)。
就以地球人口70亿人计算,每人平均可分得约4.86×1028(486117667×1020)个IPv6地址。
RFC 2373和RFC 2374定义的IPv6地址有128位长;IPv6地址的表达形式一般采用32个十六进制数。
在很多场合,IPv6地址由两个逻辑部分组成:一个64位的网络前缀和一个64位的主机地址,主机地址通常根据物理地址自动生成,叫做EUI-64(或者64-位扩展唯一标识)。

3.2 IPv6格式

  • IPv4二进制是32位. 以8位位一组, 分为4组以点号"."隔开. 4组*8位=32位。通常使用: 点分十进制. 4组十进制数字用点隔开. 
  • IPv6二进制128位. 以16位为一组,分为8组以冒号":"隔开. 8组*16位=128位. 通常使用: 每组以4位十六进制方式表示。
例如:2001:0db8:86a3:08d3:1319:8a2e:0370:7344 是一个合法的IPv6地址。
类似于IPv4的点分十进制,同样也存在点分十六进制的写法,将8组4位十六进制地址的冒号去除后,每位以点号“.”分组,例如:2001:0db8:85a3:08d3:1319:8a2e:0370:7344则记为2.0.0.1.0.d.b.8.8.5.a.3.0.8.d.3.1.3.1.9.8.a.2.e.0.3.7.0.7.3.4.4,其倒序写法用于ip6.arpa子域名记录IPv6地址与域名的映射。

3.3 IPv4映射地址

如果这个地址实际上是IPv4的地址,后32位可以用10进制数表示;因此::ffff:192.168.89.9 相等于::ffff:c0a8:5909。
::ffff:1.2.3.4 格式叫做IPv4映射地址。
IPv4位址可以很容易的转化为IPv6格式。举例来说,如果IPv4的一个地址为135.75.43.52(十六进制为0x874B2B34),它可以被转化为0000:0000:0000:0000:0000:FFFF:874B:2B34 或者::FFFF:874B:2B34。同时,还可以使用混合符号(IPv4-compatible address),则地址可以为::ffff:135.75.43.52。

3.4 IPv6新增了区域ID

由于同一非全局地址可能在同一范围的多个区域中使用(例如,在两条独立的物理链路中使用链路本地地址 fe80::1),而且一个节点可能连接到同一范围的不同区域的接口(例如,一个路由器通常有多个接口连接到不同的链路)。
IPv6新增了区域ID(Zone ID)加以区分,或称作用域ID(Scope ID)。作用域ID仅用于本地链接,使用百分号追加在地址后面。
其内容特定于操作系统,例如Windows使用数字 fe80::2%3 ,Linux使用网卡名字 fe80::2%eth0 。
在URI中使用时,百分号需要进行编码,例如 fe80::a%en1 应显示为 http://[fe80::a%25en1] 。

3.5 IPv6的省略书写

每组数字前导0可以省略,省略后前导数字仍是0则继续,例如下组IPv6是等价的。
2001:0db8:02de:0000:0000:0000:0000:0e13
2001:db8:2de:0000:0000:0000:0000:e13
2001:db8:2de:000:000:000:000:e13
2001:db8:2de:00:00:00:00:e13
2001:db8:2de:0:0:0:0:e13
可以用双冒号“::”表示一组0或多组连续的0,但只能出现一次:
2001:db8:2de:0:0:0:0:e13
2001:db8:2de::e13

3.6 IPv6地址的分类

IPv6地址可分为三种: 
单播(unicast)地址
单播地址标示一个网络接口。协议会把送往地址的数据包送往给其接口。IPv6的单播地址可以有一个代表特殊地址名字的范畴,如链路本地地址(link local address)和唯一区域地址(ULA,unique local address)。单播地址包括可聚类的全球单播地址、链路本地地址等。
任播(anycast)地址
任播像是Unicast(单点传播)与Broadcast(多点广播)的综合。单点广播在来源和目的地间直接进行通信;多点广播存在于单一来源和多个目的地进行通信。
而Anycast则在以上两者之间,它像多点广播(Broadcast)一样,会有一组接收节点的地址列表,但指定为Anycast的数据包,只会发送给距离最近或发送成本最低(根据路由表来判断)的其中一个接收地址,当该接收地址收到数据包并进行回应,且加入后续的传输。该接收列表的其他节点,会知道某个节点地址已经回应了,它们就不再加入后续的传输作业。
So, 以目前的应用为例,Anycast地址只能分配给中间设备(如路由器、三层交换机等),不能分配给终端设备(手机、电脑等),而且不能作为发送端的地址。
多播(multicast)地址
多播地址也称组播地址。多播地址也被指定到一群不同的接口,送到多播地址的数据包会被发送到所有的地址。多播地址由皆为一的字节起始,亦即:它们的前置为FF00::/8。其第二个字节的最后四个比特用以标明"范畴"。
一般有node-local(0x1)、link-local(0x2)、site-local(0x5)、organization-local(0x8)和global(0xE)。多播地址中的最低112位会组成多播组群标识符,不过因为传统方法是从MAC地址产生,故只有组群标识符中的最低32位有使用。定义过的组群标识符有用于所有节点的多播地址0x1和用于所有路由器的0x2。
另一个多播组群的地址为"solicited-node多播地址",是由前置FF02::1:FF00:0/104和剩余的组群标识符(最低24位)所组成。这些地址允许经由邻居发现协议(NDP,Neighbor Discovery Protocol)来解译链接层地址,因而不用干扰到在区网内的所有节点。

3.7 特殊地址

https://zh.wikipedia.org/wiki/IPv6#特殊位址
IANA维护官方的IPv6地址空间列表。全局的单播地址的分配可在各个区域互联网注册管理机构或 GRH DFP 页面找到。
https://www.iana.org/numbers
IPv6中有些地址是有特殊含义的: 
- 未指定地址
::/128-所有比特皆为零的地址称作未指定地址。这个地址不可指定给某个网络接口,并且只有在主机尚未知道其来源IP时,才会用于软件中。路由器不可转送包含未指定地址的数据包。
- 链路本地地址
::1/128-是一种单播绕回地址。如果一个应用程序将数据包送到此地址,IPv6堆栈会转送这些数据包绕回到同样的虚拟接口(相当于IPv4中的127.0.0.1/8)。
fe80::/10-这些链路本地地址指明,这些地址只在区域连线中是合法的,这有点类似于IPv4中的169.254.0.0/16。
- 唯一区域地址
fc00::/7-唯一区域地址(ULA,unique local address)只可用于本地通信,类似于IPv4的专用网络地址10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。这定义在RFC 4193中,是用来取代站点本地位域。这地址包含一个40比特的伪随机数,以减少当网站合并或数据包误传到网络时碰撞的风险。这些地址除了只能用于区域外,还具备全局性的范畴,这点违反了唯一区域位域所取代的站点本地地址的定义。
- 多播地址
ff00::/8-这个前置表明定义在"IP Version 6 Addressing Architecture"(RFC 4291)中的多播地址[12]。其中,有些地址已用于指定特殊协议,如ff0X::101对应所有区域的NTP服务器(RFC 2375)。
- 请求节点多播地址(Solicited-node multicast address)
ff02::1:FFXX:XXXX-XX:XXXX为相对应的单播或任播地址中的三个最低的字节。
- IPv4转译地址
::ffff:x.x.x.x/96-用于IPv4映射地址。(参见以下的转换机制)。
https://zh.wikipedia.org/wiki/IPv6#轉換機制
2001::/32-用于Teredo隧道。
2002::/16-用于6to4。
- ORCHID
2001:10::/28-ORCHID (Overlay Routable Cryptographic Hash Identifiers)(RFC 4843)。这些是不可遶送的IPv6地址,用于加密散列识别。
- 文件
2001:db8::/32-这前置用于文件(RFC 3849)。这些地址应用于IPV6地址的示例中,或描述网络架构。
- 遭舍弃或删除的用法
::/96-这个前置曾用于IPv4兼容地址,现已删除。
fec0::/10-这个站点本地前置指明这地址只在组织内合法。它已在2004年9月的RFC3879中舍弃,并且新系统不应该支持这类型的地址。

4. 邻居发现

对多播地址执行ping操作会ff02::1导致所有本地主机在链接本地范围内做出响应。必须指定一个接口:
$ ping ff02::1%eth0
之后,您可以使用以下命令获取本地网络中所有邻居的列表:
$ ip -6 neigh
注: 若启用了ip6tables的简单防火墙, ping命令只能看到自己, 看不到局域网内其他启用了简单防火墙的用户, 但ping之后再执行: ip -6 neigh 还是能找到邻居. 

通过ping多播地址,ff02::2只有路由器会响应。
如果添加选项,则本地链接主机将使用其全局链接作用域地址进行响应。在这种情况下,可以省略该接口: -I your-global-ipv6
$ ping -I 2001:4f8:fff6::21 ff02::1

5. 无状态自动配置(SLAAC)

在网络准备好的情况下,获取IPv6地址最简单的方法是通过“无状态地址自动配置”(SLAAC)。地址会自动由路由器给出的前缀推算出,不需要其他配置,也不需要DHCP客户端。
在不适合使用IPv6无状态地址自动配置的场景下,网络可以使用有状态配置(DHCPv6),或者使用静态方法手动配置。

5.1 对于Linux客户端

如果你使用netctl管理网络,那么只需要在网络配置中加入下面这一行:
IP6=stateless
如果使用NetworkManager,它会自动检测网络情况并配置好IPv6.
注意: 只有IPv6 icmp数据包可以经过网络传输时,SLAAC才可以正常工作。所以在要配置IPv6的计算机上,必须允许ipv6-icmp数据包进入。如果你使用Simple stateful firewall或iptables,只需要加入:
-A INPUT -p ipv6-icmp -j ACCEPT

5.2 对于网关

网关需要运行一个守护进程,以确保能够将IPv6地址分发给客户端。一般使用radvd(official repositories)。配置radvd很简单。修改/etc/radvd.conf,加入如下配置:
# replace LAN with your LAN facing interface
interface LAN {
  AdvSendAdvert on;
  MinRtrAdvInterval 3;
  MaxRtrAdvInterval 10;
  prefix ::/64 {
    AdvOnLink on;
    AdvAutonomous on;
    AdvRouterAddr on;
  };
};

这些配置可以要求客户端由64位的网络前缀自动推算并配置地址。请注意这些配置允许使用分配到局域网的所有可用的前缀。如果你不打算使用::/64,需要限制允许使用的前缀,可以注明前缀,例如2001:DB8::/64。prefix选项可以重复使用多次,分别记录不同的前缀。
要将DNS服务器通告给您的LAN客户端,您可以使用RDNSS功能。例如,添加以下行/etc/radvd.conf以播发Google的DNS v6服务器:
RDNSS 2001:4860:4860::8888 2001:4860:4860::8844 {
};

网关必须在所有的方向上允许ipv6-icmp数据包。如果你使用Simple stateful firewall或iptables,需要加入如下规则:
 -A INPUT -p ipv6-icmp -j ACCEPT
 -A OUTPUT -p ipv6-icmp -j ACCEPT
 -A FORWARD -p ipv6-icmp -j ACCEPT
使用其他防火墙也需要类似的规则。配置完成后可以开启radvd.service。

6. Privacy extensions 隐私扩展

当一个客户端使用SLAAC配置其IPv6时,它会使用网络前缀和网卡的MAC地址构造地址。
这会引起安全问题:计算机的MAC地址可以轻松通过其IPv6地址推算出。
为了解决这个问题,提出了“IPv6隐私扩展”标准(RFC 4941)。
使用这个隐私扩展,内核会从原本的IPv6地址计算生成一个“临时地址”。在连接远程服务器时,系统会优先选择这个地址以隐藏原来的地址。要启用隐私拓展,可以按照如下步骤:
向/etc/sysctl.d/40-ipv6.conf加入如下内容:
# Enable IPv6 Privacy Extensions
net.ipv6.conf.all.use_tempaddr = 2
net.ipv6.conf.default.use_tempaddr = 2
net.ipv6.conf.nic0.use_tempaddr = 2
...
net.ipv6.conf.nicN.use_tempaddr = 2

其中,nic0到nicN是你的网卡。您可以使用“网络配置#列出网络接口”中的说明找到它们的名称。
https://wiki.archlinux.org/title/Network_configuration#Listing_network_interfaces
all.use_tempaddr或default.use_tempaddr参数不会对已经配置好的网卡起作用。
重启之后,隐私扩展将会启用。

6.1 dhcpcd

https://wiki.archlinux.org/title/Dhcpcd
dhcpcd从6.4.0版本起就在其默认配置文件中添加了选项slaac private,实现对隐私扩展的支持,可以实现"Stable Private IPv6 Addresses instead of hardware based ones",符合RFC 7217 。(commit)。因此,没有必要修改任何配置,除非你想经常更换地址,而不是在每次连接上新网络时。

6.2 NetworkManager

https://wiki.archlinux.org/title/NetworkManager#Configuration
可以通过NetworkManager.conf(5)或连接配置文件中的ipv6.ip6-privacy设置来控制NetworkManager中IPv6隐私扩展的使用。
如果未设置全局或每个连接,则NetworkManager将回退为 /proc/sys/net/ipv6/conf/default/use_tempaddr
要在默认情况下显式启用IPv6隐私扩展,请将这些行添加到NetworkManager.conf(5):
/etc/NetworkManager/conf.d/ip6-privacy.conf
[connection]
ipv6.ip6-privacy=2
应用配置,然后重新连接到所有活动的连接。
要控制IPv6隐私扩展在单个NetworkManager管理的连接中的使用,请在中编辑所需的连接密钥文件/etc/NetworkManager/system-connections/,并将[ipv6]密钥/值对附加到其部分ip6-privacy=2:
/etc/NetworkManager/system-connections/your-ssid.nmconnection
...
[ipv6]
method=auto
ip6-privacy=2
...
重新加载连接,然后再重新连接。
注:虽然它看起来可能scope global temporary通过启用隐私扩展永远不会被更新(它永远不会转移到创建IPv6地址deprecated的状态在其任期valid_lft),它是在一个较长的时间周期,以验证该地址的确确改变。

6.3 systemd-networkd

https://wiki.archlinux.org/title/Systemd-networkd
Systemd-networkd也不遵守/etc/sysctl.d/40-ipv6.conf里的net.ipv6.conf.xxx.use_tempaddr配置,需要在配置中设置IPv6PrivacyExtensions选项。除非使用.network文件中的值设kernel置选项IPv6PrivacyExtensions
IPv6隐私扩展的其他选项如下:
net.ipv6.conf.xxx.temp_prefered_lft
net.ipv6.conf.xxx.temp_valid_lft
注意: temp_prefered_lft是变量名,首选必须拼写错误。
有关详细信息,请参见systemd- networkd和systemd.network(5)。

6.4 ConnMan

https://wiki.archlinux.org/title/ConnMan
设置在服务文件中,即: /var/lib/connman/service/settings
IPv6.privacy=preferred

7. Stable private addresses 稳定的私人地址

另一种选择是稳定的私有IP地址(RFC 7217)。这允许IP在网络内保持稳定,而不会暴露接口的MAC地址。
为了使内核生成密钥(wlan0例如,对于),我们可以设置:
$ sudo sysctl net.ipv6.conf.wlan0.addr_gen_mode=3
打开和关闭接口,运行后,您应该stable-privacy在每个IPv6地址旁边看到ip addr show dev wlan0。内核已经生成了一个128位密钥来为该接口生成ip地址,以使其运行sysctl net.ipv6.conf.wlan0.stable_secret。我们将保留此值,因此将以下行添加到/etc/sysctl.d/40-ipv6.conf:
# Enable IPv6 stable privacy mode
net.ipv6.conf.wlan0.stable_secret = <output from previous command>
net.ipv6.conf.wlan0.addr_gen_mode = 2
注意: 如果您使用dhcpcd获取IPv6地址,则该stable-privacy标志不会被分配给该IP地址。

另外: NetworkManager不接受上述设置,但是NetworkManager默认情况下使用稳定的专用地址。
$ sudo cat /etc/NetworkManager/system-connections/ssid.nmconnection 
[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=auto

8. Static address 静态地址

有些情况下使用静态地址可以增强安全性。使用SLAAC分配动态地址时,你的计算机的地址会由其网卡MAC推算出,这不利于安全,因为即使地址的网络号改变,你的电脑依然可以被追踪到。
要想用netctl分配一个静态地址,可以参照/etc/netctl/examples/ethernet-static。如下的部分尤其重要:
...
# For IPv6 static address configuration
IP6=static
Address6=('1234:5678:9abc:def::1/64' '1234:3456::123/96')
Routes6=('abcd::1234')
Gateway6='1234:0:123::abcd'
注意: 如果你只有IPv6连接,那么你要给出IPv6的DNS服务器,例如:
DNS=('6666:6666::1' '6666:6666::2')
如果您的提供商没有给您提供IPv6 DNS,并且您没有自己运行,则可以从resolv.conf文章中进行选择。
https://wiki.archlinux.org/title/Resolv.conf

9. IPv6和PPPoE

PPPoE的软件包pppd提供了对PPPoE之上的IPv6的支持(前提是你的ISP和调制解调器支持)。只需要将如下内容加入/etc/ppp/options
+ipv6
如果你使用netctl,那么就向你的netctl配置文件加入如下内容:
PPPoEIP6=yes

a. 前缀委派(DHCPv6-PD)

注意: 这个部分是针对自行使用配置网关的内容,不是客户端。如果你使用从市场购得的路由器,请查阅其附带的文档以开启地址委派。
地址委派是一种常见的IPv6部署方式,被许多ISP所采用。具体的做法是将一个地址前缀分配给用户(局域网),即路由器配置为将不同的前缀分配给不同的子网;ISP通过DHCPv6将地址前缀(通常是/56或/64)分发出去,DHCP客户端再将前缀分配给局域网。对于一个拥有两个网卡的简单网关来说,它的工作就是将从WAN口(或虚拟接口,比如ppp)获取的前缀分配给局域网。
DHCPv6要求客户端在端口546 UDP上接收传入连接。对于基于nftables的防火墙,可以在输入链中用一行配置/etc/nftables.conf:
table inet filter {
  chain input {
    udp dport dhcpv6-client accept
    ...
  }
...
}

a.1 使用dhcpcd

Dhcpcd在IPv4之外也提供了一个完整的支持DHCPv6-PD的客户端。如果你使用dhcpcd,需要修改/etc/dhcpcd.conf。你可能已经在用dhcpcd来配置IPv4,所以只需要对现有的配置进行小幅修改: 
duid
noipv6rs
waitip 6
# Uncomment this line if you are running dhcpcd for IPv6 only.
#ipv6only
# use the interface connected to WAN
interface WAN
ipv6rs
iaid 1
# use the interface connected to your LAN
ia_pd 1 LAN
#ia_pd 1/::/64 LAN/0/64
此配置客户端会从WAN接口获取一个前缀,分配给LAN接口。如果ISP分配的是/64的地址,则需要使用第二个ia_pd instruction。这也会禁用除WAN接口之外的所有路由器请求。
提示:另请阅读dhcpcd(8)和dhcpcd.conf(5)。

a.2 systemd-networkd

配置上游(WAN)和下游(LAN)接口。这将在运行DHCPv6客户端的接口上启用DHCPv6-PD。委托前缀由IPv6路由器在下游网络上分发。
/etc/systemd/network/wan.network
[Network]
# Use 'yes' instead of 'ipv6' for both ipv4 and ipv6.
DHCP=ipv6
/etc/systemd/network/lan.network
[Network]
IPv6SendRA=yes
DHCPv6PrefixDelegation=yes

a.3 其他客户端

dhclient也可以请求前缀,但是必须使用dhclient退出脚本将该前缀或该前缀的一部分分配给接口。例如: 
https://github.com/jaymzh/v6-gw-scripts/blob/master/dhclient-ipv6

b. Disable 禁用 IPv6

注意: Arch内核直接内置了IPv6支持,因此不能将模块列入黑名单。

b.1 禁用功能

  • 添加ipv6.disable=1到内核​​行会禁用整个IPv6堆栈,如果遇到问题,这可能就是您想要的。有关更多信息,请参见内核参数。https://wiki.archlinux.org/title/Kernel_parameters
  • 或者,添加ipv6.disable_ipv6=1将保持IPv6堆栈正常运行,但不会将IPv6地址分配给您的任何网络设备。
  • 通过将以下sysctl配置添加到/etc/sysctl.d/40-ipv6.conf,可以避免系统将IPv6地址分配给特定的网络接口:
# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.nic0.disable_ipv6 = 1
...
net.ipv6.conf.nicN.disable_ipv6 = 1
重新启动systemd-sysctl.service单元以应用配置更改。
注意你必须在这里清楚地列出所有不需要分配IPv6地址的网卡,仅仅设置all.disable_ipv6并不会立刻对已经连接的网卡起作用。

注意:如果通过sysctl禁用IPv6,则应注释掉/etc/hosts中的IPv6主机。否则,可能会出现一些连接错误,因为主机已解析为无法访问的IPv6地址。
#<ip-address> <hostname.domain.org> <hostname>
127.0.0.1 localhost.localdomain localhost
#::1 localhost.localdomain localhost

b.2 其他程序

在内核中关闭IPv6功能不会阻止应用程序尝试使用IPv6。多数情况下,这样不会有问题,但如果你发现程序无法正常运行,你应该查阅该应用程序的手册页,以找到关闭IPv6的合适方法。

b.2.1 dhcpcd

dhcpcd会尝试发送IPv6路由器请求。要禁用这种行为,可以依照其手册页dhcpcd.conf (5),向/etc/dhcpcd.conf加入如下内容: 
noipv6rs
noipv6

b.2.2 NetworkManager

要在NetworkManager中禁用IPv6,请右键单击网络状态图标,然后选择: 
“编辑连接”>“有线”>“网络名称” >“编辑”>“ IPv6设置”>“方法”>“忽略/禁用”
Edit Connections > Wired > Network name > Edit > IPv6 Settings > Method > Ignore/Disabled

然后点击“保存”。

在命令行终端下,关闭IPv6支持可以使用nmcli:
$ sudo nmcli connection edit connection0
其中,connection0是要修改的网络名称。nmcli运行后进入其命令行,输入如下命令:
nmcli> set ipv6.method ignore 
连接到该网络时,NetworkManager不会再配置该网络的IPv6地址。

b.2.3 ntpd

依照Systemd#Drop-in files,修改ntpd.service的启动方式:
$ sudo systemctl edit ntpd.service
这样会产生一个drop-in snippet,替代原有的ntpd.service来加载ntpd。参数-4关闭了ntpd的IPv6支持。向drop-in snippet中加入如下内容:
[Service]
ExecStart=
ExecStart=/usr/bin/ntpd -4 -g -u ntp:ntp
第一行清除了之前的ExecStart配置,接下来的一行将该配置设置为带有-4参数的ntpd。

b.2.4 GnuPG

在dirmngr的配置文件中禁用IPv6 :
~/.gnupg/dirmngr.conf
disable-ipv6
并重新启动用户服务 dirmngr.service。

b.2.5 sshd

通过将以下内容添加到来确保sshd使用的是ipv4 sshd_config:
/etc/ssh/ssh_config
AddressFamily inet
并重新启动sshd.service。

b.3 systemd-networkd

networkd支持在每个接口上禁用IPv6。当网络单元的[Network]部分具有LinkLocalAddressing=ipv4或LinkLocalAddressing=no时,networkd不会尝试在匹配的接口上配置IPv6。
但是请注意,即使未使用上述选项,如果未全局禁用IPv6,networkd仍将期望接收路由器通告。如果接口未接收到IPv6流量(例如,由于sysctl或ip6tables设置),它将保持配置状态,并可能导致等待网络完全配置的服务超时。为避免这种情况,IPv6AcceptRA=no还应该在[Network]中设置该选项。

c. 在IPv6上优先使用IPv4

在配置文件中/etc/gai.conf 取消注释以下行:
#
#    For sites which prefer IPv4 connections change the last line to
#
precedence ::ffff:0:0/96  100

Sound

导航 (返回顶部) 1. Sound 1.1 声-音 1.2 声波的性质及特性 2. 声音频率 2.1 听力范围 2.2 VF-语音频率 2.3 人声基本频率 2.4 8度音阶表 2.5 综合表 3. 声波 3.1 Compression and she...