2019年1月

如果不是因为系统自带的图片查看器没有你想要的功能,或者你想要更棒的体验,你大概不会想切换到其它图片查看器吧。

不过,如果你喜欢折腾,你可能就会想用不同的图片查看器了吧。我猜最终你会被新图片查看器的全新用户体验或特色功能所吸引的。

在本篇文章中,无论是简单的还是复杂的、无论是为 Ubuntu 准备的还是其它 Linux 发行版准备的,我们都有提到。

Linux 下最棒的图片查看器

Ubuntu 或其它 Linux 发行版适用的最棒的图片查看器

注意: 在准备安装一个图片查看器时,请前往您系统中预先安装的软件商店中查找。如果您没有任何软件商店或无法在软件商店中找到它,请手动执行我们给出的命令。

1. Nomacs

Nomacs 图片查看器

它有什么特点?

  • 轻快
  • 内建图像调整工具(可以调整色彩和大小)
  • 拍摄位置信息
  • 元数据调节器
  • 局域网同步
  • 全屏模式

Nomacs 是一款自由软件。虽然没有什么出众的功能,但是它的兼容性还不错,可以支持许多常见格式。

它的界面超级简单,但是提供了简单的图片编辑功能(可以调整色彩、亮度、大小和裁剪)。除此之外,它还支持全屏模式、直方图,以及可以切换显示元数据、编辑历史等信息的许多面板。

我该如何安装它?

简单起见,你可以在各种软件中心中安装它。如果你想通过终端安装它,请参见它的 GitHub 页 。或者,在使用 APT 包管理的系统中使用如下命令安装:

sudo apt install nomacs

2. Gnome 之眼

Gnome 之眼

它有什么特点?

  • 极其简单的图像查看器
  • 幻灯片视图
  • 为 GNOME 量身打造的图片查看器

这是一款经典的图片查看器,它在数年前作为 GNOME 项目的一部分被开发出来。不过需要注意的是,对它的维护目前已经不是很活跃了。不过它仍能在最新版 Ubuntu LTS 和部分 Linux 发行版中正常工作。

如果你需要一个简单、有幻灯片视图并可以在侧栏看到元数据的图像查看器,Gnome 之眼是最佳选择。

我该如何安装它?

若要在 Ubuntu 及基于 Ubuntu 的 Linux 发行版上安装它,仅需一条命令:

sudo apt install eog

如果你想在其它发行版中安装它,请参见 该项目的 GitHub 页面

3. EOM

EOM 图像查看器

它有什么特点?

  • 简洁
  • 可扩展
  • 为 MATE 量身打造的图片查看器

另一个基本功能齐全,支持幻灯片视图和图像旋转的查看器。

虽然它没什么特色功能,但它支持大部分的图像格式,并且还能处理大体积的图像。

我该如何安装它?

若要在 Ubuntu 及基于 Ubuntu 的 Linux 发行版上安装它,仅需一条命令:

sudo apt install eom

如果你想在其它发行版中安装它,请参见 该项目的 GitHub 页面

4. Geeqie

Geeqie 图像查看器

它有什么特点?

  • 可扩展的灵活的图像查看器(其它的图像查看器支持它)
  • 可以显示色彩信息

Geeqie 是一个令用户印象深刻的图片管理/查看器。它支持将其它查看器作为扩展使用,不过它并不提供任何对图像操作的工具。

如果你希望获取图像的颜色信息、元数据,或是查看/管理一组图片,它将会是一个不错的选择。

我该如何安装它?

在终端输入:

sudo apt install geeqie

若想查看它的源代码,请前往 它的 GitHub 主页

5. gThumb

gThumb 图片查看器

它有什么特点?

  • 全功能(查看、编辑和管理)
  • 可清除 EXIF 信息
  • 图像格式转换
  • 查找重复的图像

gThumb 会让你眼前一亮,因为它有很多功能。它的查看/管理界面和编辑工具(裁剪、缩放、颜色编辑等等)将会给你留下很深的印象。

你甚至可以为图像添加评论或清除它的 EXIF 信息。它使得你可以方便地找到重复的图像或转码图像。

我该如何安装它?

你可以在终端中输入这条命令:

sudo apt install gthumb

输了没用?请参阅 项目 GitHub 主页 来获取帮助。

6. Gwenview

Gwenview 图像查看器

它有什么特点?

  • 简单,有基础图像编辑功能(旋转、调整大小)
  • 可使用 KIPI 插件扩展

Gwenview 又是一个基本的图像查看器,它为 KDE 量身定做。不过这并不影响你在其它桌面环境中使用它。

如果你使用 Konqueror 浏览器,你可以将 Gwenview 作为它的内嵌图片浏览器。你也可以为图片添加评论。此外,它还支持 KIPI 插件。

我该如何安装它?

你可以在终端中输入这条命令:

sudo apt install gwenview

若想查看它的源代码,请前往 它的 GitHub 主页

7. Mirage

Mirage 图像查看器

它有什么特点?

  • 可定制的基本用户界面
  • 基本图像编辑工具
  • 可在命令行使用

如果你想要一个可在命令行中访问、支持全屏和幻灯片视图、带有基础编辑工具以及可定制 UI 的普通查看器,Mirage 是个不二之选。

它是一个非常快速且兼容性优良的查看器。它支持包括 png、jpg、svg、xpm、gif、bmp 和 tiff 在内的多种图像格式。

我该如何安装它?

你需要执行:

sudo apt install mirage

访问 该项目 GitHub 页面 来获取更多信息。

8. KPhotoAlbum

KPhotoAlbum

它有什么特点?

  • 为图像添加标签
  • 数据库支持
  • 图片压缩
  • 将图像合并到一组图像,或移除

确切地说,KPhotoAlbum 其实不仅仅是一款图像查看器,它还能为图像添加标签并管理图像。

你可以用它来压缩图片以及使用标签搜索你的图片。你还可以使用幻灯片视图来观看图片。

我该如何安装它?

在终端中输入:

sudo apt kphotoalbum

跟从 官网上的指引 来在其它 Linux 发行版中安装它。

9. Shotwell

Shotwell

它有什么特点?

  • 红眼消除工具
  • 将照片上传到 Facebook 或 Flickr 等社交网络中
  • 支持原始格式(RAW)的图片

Shotwell 是一个多功能照片管理器。在此,你能查看或管理你的照片。虽然它没带有许多图像编辑工具,但是你还是可以裁剪和调整亮度的。

我该如何安装它?

在终端中执行以下命令 (Ubuntu 及其衍生版本):

sudo apt install shotwell

若想获取更多信息,请 前往它的 GitHub 页面

10. Ristretto

Ristretto

它有什么特点?

  • 极其简单
  • 全屏模式
  • 幻灯片视图

简易的图像查看器。它能查看、全屏查看、缩放查看或以幻灯片视图查看图片。

它是为 Xfce 定制的,但你仍然可以在其它任何地方安装它。

我该如何安装它?

即使它是为 Xfce 桌面环境构建的,你仍能在其它地方安装它。对 Ubuntu 及其衍生发行版,请执行:

sudo apt install ristretto

11. digiKam

digiKam 图像查看器

它有什么特点?

  • 带有高级图像管理功能(查看/管理/编辑)的多合一查看器
  • 可以进行批处理
  • 带有 Light Table 功能

digiKam 是一个带有多种图像编辑功能的高级照片管理器。你可以使用 SQLite 或 MySQL 来配置它的数据库。

为了提升你的看图体验,你可以在预览图片时加载低画质的图片。这样一来,即使你有一大堆图片,它也丝滑般流畅。不仅如此,你还可以通过 Google、Facebook、Imgur 等来导入/导出图片。如果你希望使用一个超多功能的查看器,请务必试试这个 digiKam。

我该如何安装它?

执行这条命令:

sudo apt install digikam

访问 项目 GitHub 页面 来获取更多信息。

尾声

总的来说,无论你想要不同的用户体验、丰富的功能还是强大的管理工具,上面总有适合你的工具。

你更喜欢哪个图像查看器呢?它是系统自带的吗?

欢迎前往原文的评论区留下你的答案。


via: https://itsfoss.com/image-viewers-linux/

作者:Ankush Das 选题:lujun9972 译者:zhs852 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

这篇教程将向你展示如何更新服务器版本或者桌面版本的 Ubuntu。它还解释了更新和升级之间的区别以及你应该了解的有关于 Ubuntu Linux 中的更新的一些其他内容。

如果你是一个新手并已经体验 Ubuntu 数天或几周,你可能想知道如何更新你的 Ubuntu 系统以获取安全补丁,错误修复和应用升级。

更新 Ubuntu 非常简单。我并不是瞎说。它简单得只要运行两个命令。让我来告诉你这两个命令的更多细节。

请注意,本教程适用于 Ubuntu 18.04、16.04 或任何其他版本。命令行方式也适用于基于 Ubuntu 的发行版如 Linux Mint、Linux Lite、elementary OS 等。

通过命令行更新 Ubuntu

如何更新 Ubuntu

在桌面上,打开终端。你可以在菜单里找到它或者使用 Ctrl+Alt+T 快捷键。如果你是登录到一台 Ubuntu 服务器,那你已经在访问一个终端了。

在终端里,你只需要使用以下命令:

sudo apt update && sudo apt upgrade -y

它将询问你密码,而你可以使用你的账号密码。输入时,你将不会看到任何内容在屏幕上,所以请继续输入你的密码并按回车键。

现在,我来解释下上面的命令。

事实上,这不是一条命令。它由两条命令组成。符号 && 是合并两条命令的一个方法,第二条命令仅在前一条命令执行成功时执行。

当命令 apt upgrade 要求你在安装更新前确认时,末尾的参数 -y 会自动输入 yes

请注意,你也可以逐条使用这两条命令:

sudo apt update
sudo apt upgrade

这将花费更长的时间,因为你必须等待第一条命令执行完成后才能输入第二条命令。

说明:sudo apt update

这条命令更新了可用软件包的本地数据库。如果你没运行这条命令,本地数据库将不会被更新,而你的系统将不会知道是否有可用的新版本。

这就是为什么当你运行 sudo apt update,你会在输出中看到大量的 URL。这条命令会从对应的储存库(你在输出中看到的 URL)中获取软件包信息。

更新 Ubuntu Linux

在命令的末尾,它告诉你有多少个软件包可以被更新。你可以使用下列命令查看这些软件包:

apt list --upgradable

补充阅读: 阅读这篇文章了解命令 apt update 的输出中的 Ign、Hit 和 Get 是什么

说明:sudo apt upgrade

这条命令将已安装的软件包版本与本地数据库进行匹配。它收集全部信息,然后列出所有具有更新版本的软件包。此时,它会询问您是否要升级(已安装的软件包更新到新版本)。

通过命令行更新 Ubuntu Linux

你可以键入 yesy 或者只敲回车键去确认安装这些更新。

所以总的来说,sudo apt update 会检查可用的新版本,而 sudo apt upgrade 实际上会执行更新。

命令 update 可能会令人困惑,因为你可能期望通过命令 apt update 安装更新来更新系统,但这并不会发生。

通过 GUI 更新 Ubuntu(适用于桌面用户)

如果你使用桌面版 Ubuntu,你并不需要为了更新系统而打开终端。你可以仍可以使用命令行更新,但这只是一个选择。

在菜单里,找到 “软件更新” 并运行它。

在 Ubuntu 中运行 Software Updater

它将检查你的系统是否有可用的更新。

检查 Ubuntu 是否有可用更新

如果有可用的更新,它将给你提供安装更新的选择。

在 Ubuntu 中通过更新管理器安装更新

现在,点击 “安装”,它可能会向你询问密码。

通过 GUI 在 Ubuntu Linux 中安装更新

一旦你输入你的密码,它将开始安装更新。

通过 GUI 更新 Ubuntu

在某些情况下,你可能需要重启系统才能使已安装的更新正常工作。如果需要重启系统,你将在更新结束时收到通知。

通过 GUI 更新 Ubuntu

如果你不希望马上重启你的系统,可以选择稍后重启。

通过 GUI 在 Ubuntu 中安装更新

提示:如果“软件更新”返回一个错误,你需要在终端是使用命令 sudo apt update。输出的最后几行将包含真正的错误信息。你可以在因特网上搜索该错误并解决问题。

更新 Ubuntu 时要记住几件事

你刚学习了如何更新你的 Ubuntu 系统。如果你感兴趣,你还需要了解一些关于 Ubuntu 更新的内容。

更新后清理

你的系统将会有一些更新后不再需要的软件包。你可用使用这条命令删除这些软件包并释放空间

sudo apt autoremove

在 Ubuntu Server 中内核热修复以避免重启

如果是 Linux 内核更新,你将需要在系统更新后重启。当你不希望服务器停机时,这将会是一个问题。

热修复功能允许 Linux 内核在持续运行时打补丁。换句话说就是你不需要重启你的系统。

如果你在管理服务器,你可能需要在 Ubuntu 中启用热修复

版本升级是不同的

本文讨论的更新是使你安装的 Ubuntu 保持最新。但它不包括版本升级(例如从 Ubuntu 16.04 升级到 18.04)。

Ubuntu 版本 升级完全是另一回事。它更新整个操作系统核心。你需要在这个漫长的过程开始前做好备份。

总结

我希望你喜欢这个关于 Ubuntu 系统更新的教程并学到一些新东西。

如果你有其他问题,请随时提出。如果你是一位经验丰富的 Linux 用户并且有些更好的技巧,请同我们分享。


via: https://itsfoss.com/update-ubuntu/

作者:Abhishek Prakash 选题:lujun9972 译者:LazyWolfLin 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如何构建一台网络引导服务器(一) 中,我们提供了一个极简的 iPXE 引导脚本来引导你的网络引导镜像。许多用户除了使用网络引导镜像外,可能在机器本地也有一个操作系统。但是使用常见的工作站的 BIOS 去切换引导加载器是很笨拙的。在本系列文件的第三部分,我们将向你展示如何设置一个更复杂的 iPXE 配置。它将允许终端用户以更容易的方式去选择引导哪个操作系统。它也可以配置为让系统管理员从一台中央服务器来统一管理引导菜单。

一个交互式 iPXE 引导菜单

下面这些命令重定义了网络引导镜像的 boot.cfg 来作为一个交互式的 iPXE 引导菜单,并使用了一个 5 秒倒计时的定时器:

$ MY_FVER=29
$ MY_KRNL=$(ls -c /fc$MY_FVER/lib/modules | head -n 1)
$ MY_DNS1=192.0.2.91
$ MY_DNS2=192.0.2.92
$ MY_NAME=server-01.example.edu
$ MY_EMAN=$(echo $MY_NAME | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_NAME})
$ MY_ADDR=$(host -t A $MY_NAME | awk '{print $4}')
$ cat << END > $HOME/esp/linux/boot.cfg
#!ipxe

set timeout 5000

:menu
menu iPXE Boot Menu
item --key 1 lcl 1. Microsoft Windows 10
item --key 2 f$MY_FVER 2. RedHat Fedora $MY_FVER
choose --timeout \${timeout} --default lcl selected || goto shell
set timeout 0
goto \${selected}

:failed
echo boot failed, dropping to shell...
goto shell

:shell
echo type 'exit' to get the back to the menu
set timeout 0
shell
goto menu

:lcl
exit

:f$MY_FVER
kernel --name kernel.efi \${prefix}/vmlinuz-$MY_KRNL initrd=initrd.img ro ip=dhcp rd.peerdns=0 nameserver=$MY_DNS1 nameserver=$MY_DNS2 root=/dev/disk/by-path/ip-$MY_ADDR:3260-iscsi-iqn.$MY_EMAN:fc$MY_FVER-lun-1 netroot=iscsi:$MY_ADDR::::iqn.$MY_EMAN:fc$MY_FVER console=tty0 console=ttyS0,115200n8 audit=0 selinux=0 quiet
initrd --name initrd.img \${prefix}/initramfs-$MY_KRNL.img
boot || goto failed
END

上述菜单有五个节:

  • menu 定义了显示在屏幕上的实际菜单内容。
  • failed 提示用户发生了错误,并将用户带到 shell 以错误错误。
  • shell 提供了交互式命令提示符。你可以在引导菜单出现时按下 Esc 键进入,或者是 boot 命令失败时也会进入到命令提示符。
  • lcl 包含一个提供给 iPXE 退出的简单命令,以及返还控制权给 BIOS。在 iPXE 之后,无论你希望缺省引导的设备(即:工作站的本地硬件)是什么,都必须在你的工作站的 BIOS 中正确地作为下一个引导设备列出来。
  • f29 包含前面文章提到同一个网络引导代码,但使用最终的退出代码来替换掉 goto failed

从你的 $HOME/esp/linux 目录中复制更新后的 boot.cfg 到所有客户端系统的 ESP 中。如果一切顺利,你应该会看到类似下面图片的结果:

一个服务器托管的引导菜单

你可以添加到网络引导服务器的另一个特性是,能够从一台中央位置去管理所有客户端的引导菜单。这个特性尤其适用于批量安装(升级)一个新版本的操作系统。在你将新内核和新的 initramfs 复制到所有客户端的 ESP 之后,这个特性可以让你执行一种 原子事务) 去切换所有客户端到新操作系统。

安装 Mojolicious:

$ sudo -i
# dnf install -y perl-Mojolicious

定义 “bootmenu” 应用程序:

# mkdir /opt/bootmenu
# cat << END > /opt/bootmenu/bootmenu.pl
#!/usr/bin/env perl
use Mojolicious::Lite;
use Mojolicious::Plugins;

plugin 'Config';

get '/menu';

app->start;
END
# chmod 755 /opt/bootmenu/bootmenu.pl

为 “bootmenu” 应用程序定义配置文件:

# cat << END > /opt/bootmenu/bootmenu.conf
{
 hypnotoad => {
 listen => ['http://*:80'],
 pid_file => '/run/bootmenu/bootmenu.pid',
 }
}
END

这是一个非常简单的 Mojolicious 应用程序,它监听 80 端口,并且只回应对 /menu 的请求。如果你想快速了解 Mojolicious 能做什么,运行 man Mojolicious::Guides::Growing 去查看手册。按 Q 键退出手册。

boot.cfg 移到我们的网络引导应用程序中作为一个名为 menu.html.ep 的模板:

# mkdir /opt/bootmenu/templates
# mv $HOME/esp/linux/boot.cfg /opt/bootmenu/templates/menu.html.ep

定义一个 systemd 服务去管理引导菜单应用程序:

# cat << END > /etc/systemd/system/bootmenu.service
[Unit]
Description=Serves iPXE Menus over HTTP
After=network-online.target

[Service]
Type=forking
DynamicUser=true
RuntimeDirectory=bootmenu
PIDFile=/run/bootmenu/bootmenu.pid
ExecStart=/usr/bin/hypnotoad /opt/bootmenu/bootmenu.pl
ExecReload=/usr/bin/hypnotoad /opt/bootmenu/bootmenu.pl
AmbientCapabilities=CAP_NET_BIND_SERVICE
KillMode=process

[Install]
WantedBy=multi-user.target
END

在本地防火墙中为 HTTP 服务添加一个例外规则,并启动 bootmenu 服务:

# firewall-cmd --add-service http
# firewall-cmd --runtime-to-permanent
# systemctl enable bootmenu.service
# systemctl start bootmenu.service

wget 测试它:

$ sudo dnf install -y wget
$ MY_BOOTMENU_SERVER=server-01.example.edu
$ wget -q -O - http://$MY_BOOTMENU_SERVER/menu

以上的命令应该会输出类似下面的内容:

#!ipxe

set timeout 5000

:menu
menu iPXE Boot Menu
item --key 1 lcl 1. Microsoft Windows 10
item --key 2 f29 2. RedHat Fedora 29
choose --timeout ${timeout} --default lcl selected || goto shell
set timeout 0
goto ${selected}

:failed
echo boot failed, dropping to shell...
goto shell

:shell
echo type 'exit' to get the back to the menu
set timeout 0
shell
goto menu

:lcl
exit

:f29
kernel --name kernel.efi ${prefix}/vmlinuz-4.19.4-300.fc29.x86_64 initrd=initrd.img ro ip=dhcp rd.peerdns=0 nameserver=192.0.2.91 nameserver=192.0.2.92 root=/dev/disk/by-path/ip-192.0.2.158:3260-iscsi-iqn.edu.example.server-01:fc29-lun-1 netroot=iscsi:192.0.2.158::::iqn.edu.example.server-01:fc29 console=tty0 console=ttyS0,115200n8 audit=0 selinux=0 quiet
initrd --name initrd.img ${prefix}/initramfs-4.19.4-300.fc29.x86_64.img
boot || goto failed

现在,引导菜单服务器已经正常工作了,重新构建 ipxe.efi 引导加载器,使用一个初始化脚本指向它。

第一步,先更新我们在本系列文章的第一部分中创建的 init.ipxe 脚本:

$ MY_BOOTMENU_SERVER=server-01.example.edu
$ cat << END > $HOME/ipxe/init.ipxe
#!ipxe

dhcp || exit
set prefix file:///linux
chain http://$MY_BOOTMENU_SERVER/menu || exit
END

现在,重新构建引导加载器:

$ cd $HOME/ipxe/src
$ make clean
$ make bin-x86_64-efi/ipxe.efi EMBED=../init.ipxe

将更新后的引导加载器复制到你的 ESP 中:

$ cp $HOME/ipxe/src/bin-x86_64-efi/ipxe.efi $HOME/esp/efi/boot/bootx64.efi

将更新后的引导加载器复制到所有的客户端中之后,以后更新引导菜单只需要简单地编辑 /opt/bootmenu/templates/menu.html.ep 文件,然后再运行如下命令:

$ sudo systemctl restart bootmenu.service

做一步的改变

如果引导菜单服务器工作正常,在你的客户端系统上的 boot.cfg 文件将更长。

比如,重新添加 Fedora 28 镜像到引导菜单中:

$ sudo -i
# MY_FVER=28
# MY_KRNL=$(ls -c /fc$MY_FVER/lib/modules | head -n 1)
# MY_DNS1=192.0.2.91
# MY_DNS2=192.0.2.92
# MY_NAME=$(</etc/hostname)
# MY_EMAN=$(echo $MY_NAME | tr '.' "\n" | tac | tr "\n" '.' | cut -b -${#MY_NAME})
# MY_ADDR=$(host -t A $MY_NAME | awk '{print $4}')
# cat << END >> /opt/bootmenu/templates/menu.html.ep

:f$MY_FVER
kernel --name kernel.efi \${prefix}/vmlinuz-$MY_KRNL initrd=initrd.img ro ip=dhcp rd.peerdns=0 nameserver=$MY_DNS1 nameserver=$MY_DNS2 root=/dev/disk/by-path/ip-$MY_ADDR:3260-iscsi-iqn.$MY_EMAN:fc$MY_FVER-lun-1 netroot=iscsi:$MY_ADDR::::iqn.$MY_EMAN:fc$MY_FVER console=tty0 console=ttyS0,115200n8 audit=0 selinux=0 quiet
initrd --name initrd.img \${prefix}/initramfs-$MY_KRNL.img
boot || goto failed
END
# sed -i "/item --key 2/a item --key 3 f$MY_FVER 3. RedHat Fedora $MY_FVER" /opt/bootmenu/templates/menu.html.ep
# systemctl restart bootmenu.service

如果一切顺利,你的客户端下次引导时,应该看到如下图所示的结果:


via: https://fedoramagazine.org/how-to-build-a-netboot-server-part-3/

作者:Gregory Bartholomew 选题:lujun9972 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

大约一个月前,有人在我所在的 IRC 频道中提到了 HTTP/2。由于某种原因,我从未听说过它,而且新协议的一些功能(比如无需打开多个 TCP 连接就能复用请求)似乎很酷。

说实话,我刚刚重写了管理我们备份程序的 Puppet 代码,启用 HTTP/2 似乎是一种转向另一个大型项目之前有效的拖延方式。这有多难?

结果我花了大约 25 个小时来完成。坐下来穿上舒适的拖鞋,听听这个 HTTP/2 的故事!

被诅咒的 HTTP/1.1

当我第一次看到如何在 Apache 上启用 HTTP/2 时,这似乎是一项非常简单的任务。文档提到加载 http2 模块并通过如下配置文件确保新协议优先:

Protocols h2 h2c http/1.1

H2Push          on
H2PushPriority  *                       after
H2PushPriority  text/css                before
H2PushPriority  image/jpeg              after   32
H2PushPriority  image/png               after   32
H2PushPriority  application/javascript  interleaved

这当然很容易。即使 Apache 中的所有内容都已正确设置,网站仍然使用的是 HTTP/1.1。不过,显然我做得没错,因为我的网站现在发送了一个新的 HTTP 头:Upgrade: h2, h2c

在浪费了大量时间调试 TLS 密钥(HTTP/2 与 TLS 1.1 不兼容)之后,我终于发现问题是没有使用正确的 Apache 多进程处理模块。

事实证明,在使用 mpm_prefork(默认 MPM)时,Apache 不会使用 HTTP/2,因为 mod_http2 不支持它。尽管 Apache 还有两个其他的 MPM,但只有 mpm_prefork 支持 mod_php。突然之间,添加对 HTTP/2 的支持意味着我们将要把所有的 PHP 网站切换到 PHP-FPM。

掉进兔子洞

在很长一段时间里,一位好友一直试图让我相信 PHP-FPM 的优点。虽然表面上看起来很好,但我从来没有真正试过。它看起来很复杂。常规的 mod_php 做得很好,还有其他事情需要我注意。

事实上,这次的 HTTP/2 事件是让我钻研它的一个契机。在我理解了 FPM 池的工作原理后,它实际上很容易设置。由于我不得不重写我们用于部署网站的 Puppet 配置文件,我也借此机会巩固了一堆东西。

PHP-FPM 允许你在不同的 Unix 用户下运行网站来增加隔离性。最重要的是,我决定是时候让我们服务器上的 PHP 代码以只读模式运行,并且不得不为我们的 Wordpress、Nextcloud、KanBoard 和 Drupal 实例调整一些东西来减少报错。

过了很长时间通过 Puppet 的自动任务后,我终于能够全部关闭 mod_phpmpm_prefork 并启用 mpm_eventmod_http2。PHP-FPM 和 HTTP/2 带来的速度提升不错,但更让我感到高兴的是这次磨练增强了我们的 Apache 处理 PHP 的能力。


via: https://veronneau.org/a-tale-of-http2.html

作者:Louis-Philippe Véronneau 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

70 后的老程序员已经对层出不穷的编程语言感到了厌烦,虽然这已经距离上一个编程语言出现已经十年了。

虽然老程序员依旧很潮——扎着马尾,穿着花裤子——但是不能掩饰其秃顶和肥胖的腰身。

IT 行业,是一个日新月异的行业,老程序员们如何跟上时代呢?十年,快吗?


via: http://turnoff.us/geek/oh-the-70s/

作者:Daniel Stori 译者 & 校对:wxy 校对 & 合成:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

如果开发者的 PGP 密钥被偷了,危害非常大。了解一下如何更安全。

在本系列教程中,我们为使用 PGP 提供了一个实用指南。你可以从下面的链接中查看前面的文章:

这是本系列教程的第四部分,我们继续本教程,我们将谈一谈如何及为什么要将主密钥从你的家目录移到离线存储中。现在开始我们的教程。

清单

  • 准备一个加密的可移除的存储(必要)
  • 备份你的 GnuPG 目录(必要)
  • 从你的家目录中删除主密钥(推荐)
  • 从你的家目录中删除吊销证书(推荐)

考虑事项

为什么要从你的家目录中删除你的主 [C] 密钥 ?这样做的主要原因是防止你的主密钥失窃或意外泄露。对于心怀不轨的人来说,私钥对他们具有很大的诱惑力 —— 我们知道有几个恶意软件成功地实现了扫描用户的家目录并将发现的私钥内容上传。

对于开发者来说,私钥失窃是非常危险的事情 —— 在自由软件的世界中,这无疑是身份证明失窃。从你的家目录中删除私钥将帮你防范这类事件的发生。

备份你的 GnuPG 目录

!!!绝对不要跳过这一步!!!

备份你的 PGP 密钥将让你在需要的时候很容易地恢复它们,这很重要!(这与我们做的使用 paperkey 的灾难级备份是不一样的)。

准备可移除的加密存储

我们从取得一个(最好是两个)小型的 USB “拇指“ 驱动器(可加密 U 盘)开始,我们将用它来做备份。你首先需要去加密它们:

加密密码可以使用与主密钥相同的密码。

备份你的 GnuPG 目录

加密过程结束之后,重新插入 USB 驱动器并确保它能够正常挂载。你可以通过运行 mount 命令去找到设备挂载点的完全路径。(在 Linux 下,外置介质一般挂载在 /media/disk 下,Mac 一般在它的 /Volumes 下)

你知道了挂载点的全路径后,将你的整个 GnuPG 的目录复制进去:

$ cp -rp ~/.gnupg [/media/disk/name]/gnupg-backup

(注意:如果出现任何套接字不支持的错误,没有关系,直接忽略它们。)

现在,用如下的命令去测试一下,确保它们能够正常地工作:

$ gpg --homedir=[/media/disk/name]/gnupg-backup --list-key [fpr]

如果没有出现任何错误,说明一切正常。弹出这个 USB 驱动器并给它粘上一个明确的标签,以便于你下次需要它时能够很快找到它。接着,将它放到一个安全的 —— 但不要太远 —— 的地方,因为从现在起,你需要偶尔使用它来做一些像编辑身份信息、添加或吊销子证书、或签署其它人的密钥这样的事情。

删除主密钥

我们家目录中的文件并没有像我们所想像的那样受到保护。它们可能会通过许多不同的方式被泄露或失窃:

  • 通过快速复制来配置一个新工作站时的偶尔事故
  • 通过系统管理员的疏忽或恶意操作
  • 通过安全性欠佳的备份
  • 通过桌面应用中的恶意软件(浏览器、pdf 查看器等等)
  • 通过跨境胁迫

使用一个很好的密码来保护你的密钥是降低上述风险的一个很好方法,但是密码能够通过键盘记录器、背后窥视、或其它方式被发现。基于以上原因,我们建议去配置一个从你的家目录上可移除的主密钥,将它保存在一个离线存储中。

删除你的主密钥

请查看前面的节,确保你有完整的你的 GnuPG 目录的一个备份。如果你没有一个可用的备份,下面所做的操作将会使你的主密钥失效!!!

首先,识别你的主密钥的 keygrip:

$ gpg --with-keygrip --list-key [fpr]

它的输出应该像下面这样:

pub   rsa4096 2017-12-06 [C] [expires: 2019-12-06]
     111122223333444455556666AAAABBBBCCCCDDDD
     Keygrip = AAAA999988887777666655554444333322221111
uid           [ultimate] Alice Engineer <[email protected]>
uid           [ultimate] Alice Engineer <[email protected]>
sub   rsa2048 2017-12-06 [E]
     Keygrip = BBBB999988887777666655554444333322221111
sub   rsa2048 2017-12-06 [S]
     Keygrip = CCCC999988887777666655554444333322221111

找到 pub 行下方的 Keygrip 条目(就在主密钥指纹的下方)。它与你的家目录下 .gnupg 目录下的一个文件是一致的:

$ cd ~/.gnupg/private-keys-v1.d
$ ls
AAAA999988887777666655554444333322221111.key
BBBB999988887777666655554444333322221111.key
CCCC999988887777666655554444333322221111.key

现在你做的全部操作就是简单地删除与主密钥 keygrip 一致的 .key 文件:

$ cd ~/.gnupg/private-keys-v1.d
$ rm AAAA999988887777666655554444333322221111.key

现在,如果运行 --list-secret-keys 命令将出现问题,它将显示主密钥丢失(# 表示不可用):

$ gpg --list-secret-keys
sec# rsa4096 2017-12-06 [C] [expires: 2019-12-06]
 111122223333444455556666AAAABBBBCCCCDDDD
uid [ultimate] Alice Engineer <[email protected]>
uid [ultimate] Alice Engineer <[email protected]>
ssb rsa2048 2017-12-06 [E]
ssb rsa2048 2017-12-06 [S]

删除吊销证书

你应该去删除的另一个文件是吊销证书(删除之前,确保你的备份中有它),它是使用你的主密钥自动创建的。吊销证书允许一些人去永久标记你的证书为吊销状态,这意味着它无论在任何用途中将不再被使用或信任。一般是使用它来吊销由于某些原因不再受控的一个密钥 —— 比如,你丢失了密钥密码。

与使用主密钥一样,如果一个吊销证书泄露到恶意者手中,他们能够使用它去破坏你的开发者数字身份,因此,最好是从你的家目录中删除它。

cd ~/.gnupg/openpgp-revocs.d
rm [fpr].rev

在下一篇文章中,你将学习如何保护你的子密钥。敬请期待。

从来自 Linux 基金会和 edX 的免费课程 “Linux 入门” 中学习更多 Linux 知识。


via: https://www.linux.com/blog/learn/pgp/2018/3/protecting-code-integrity-pgp-part-4-moving-your-master-key-offline-storage

作者:Konstantin Ryabitsev 译者:qhwdw 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出