- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
从 web 开发的视角说一下在使用 Linux 时遇到的问题,主要是针对操作本身,因为指令在网上都可以查到,不会深入原理,但尽量实用.
最初我使用 Linux 是因为我需要的应用在教程里只提供了 Linux 版本,于是我就按步骤把它部署起来,就这样顺其自然地用了下去,期间也解决了一些问题,在这个过程中,我逐渐产生了一些疑问:为什么使用 Linux 作为服务端,而不是我们日常使用更加熟悉的 Windows 系统,二者在服务端有什么区别?
在这点上,毋庸置疑是 Windows 更胜一筹,图形化界面操作友好,Windows Server 版相对于面向大众的版本在操作上也没有特别大的差别,大部分人应该还是对于微软这种一以贯之的风格更加习惯.
Linux 也有带图形界面的发行版,但作为服务器使用时这样反而丧失了一部分优势,图形壳程序会占用服务器宝贵的硬件资源,通常不做考虑.
客观来说,Linux 开源免费,而 Windows Server 则需要付费授权。实际上多数情况我们购买云服务器的时候,这部分成本已经平摊了.
腾讯云选择 Windows Server 时的提示:
Linux 是开源的,它的代码由全世界最优秀的程序员维护更新,如果有漏洞被发现也会被迅速修复。而 Windows 方面,由于我使用 Windows Server 的经验并没有多少,不做过多评价,但对于面向普通用户的版本,大家都有发言权,尽管微软的程序员非常优秀,但是 Windows 仍然会频繁地向你推送漏洞修复补丁,并且偶尔蓝屏、死机 。
Linux 对于用户是完全开放的,因为它假定用户知道自己在做什么,你可以操作系统中所有的文件,但 Linux 不会对你的操作负责,这就如同我们在安卓手机中获取 root 权限一样,你获取了底层文件的操作权限,可以按你自己的想法去修改系统,但这样手机的服务商就不再提供保修服务,因为你做出了超出他们预期的行为.
在 Windows 这边,不知道是不是大家都经历过被提示没有操作权限的情况,或者想设置权限却被告知没有权限的情况,我还遇到过微软自家的软件没有权限读取文件而无法识别已安装的应用程序的问题,这都是因为 Windows 较为复杂的权限系统.
为什么将权限系统放在稳定性这一节,因为在用户可以自由修改权限的情况下,系统的稳定性当然会受影响,在 Linux 操作中,我们可以很轻松的给文件设置 777 权限(最高的权限,在后面会说到),或者开放防火墙所有端口,而这无疑增加了系统运行的风险,所以在设计这部分的操作时,应该更加谨慎,先看看有没有其他的方法再进行操作.
严格来说,Linux 是内核而不是操作系统,借助于不同的发行版提供的操作系统相关组件才变成了操作系统,平常我们会简称为 Linux 系统,而实际上由于开源的特性,不同的分支会存在不小的差距。这部分涉及很多我不懂的专业知识,而且可以在网上查到很多说明比较,所以不在这里赘述,我想要说明的是在查找指令和资料时要注意先决条件,区分不同系统的操作.
这里借用一下菜鸟教程的图:
由于云服务商的问题,国内使用 CentOS 较多,总体是个很好上手的版本,这个版本是基于免费的 RHEL 的源代码重新编译成的,这两种都属于 Red Hat 公司。而其他的比如 Debian、Ubuntu 都是同样使用很广泛的系统,每一种发行版都有它所属于的社群在使用,并且还有大量自行编译的定制化版本.
但要注意的是 CentOS 8 已于 2021 年 12 月 31 日停止维护,Cent OS 7 将于 2024 年 6 月 30 日停止维护,这可能会成为一个隐患,在选择发行版时需要将其纳入考量.
腾讯云中选择系统时的镜像介绍:
Debian 是一款稳定、便捷、快速的 Linux 发行版,它拥有比大多数 Linux 发行版更为强大的软件包管理工具,是目前用于建站的首选服务器操作系统之一.
Ubuntu 是最热门的 Linux 发行版之一,是一款开放源代码的免费软件,基于 Debian Linux 操作系统,其易用性和稳定性均非常出色,并且拥有非常强大成熟的社区资源.
CentOS 是一款流行的开源 Linux 发行版,是 RHEL(Red Hat Enterprise Linux)源代码经过再编译而成。(注意:CentOS 社区将于 2024 年 6 月 30 日停止维护 CentOS 7,推荐您选用兼容 CentOS 8 的 OpenCloudOS 8 镜像替代。) 。
说了那么多,不如实际进入系统操作一下,使用云服务器时,虽然 web 端都会提供控制台,但是操作和功能都不能完全满足我们日常开发的需要,只要能支持 SSH 协议(默认端口 22)的软件都可以用于远程连接 Linux,也支持 Telnet 协议,但是由于 Telnet 协议本身并不安全,所以很多发行版都关闭了这一连接方式.
软件方面有很多选择,最简单直接的是 PuTTY,也可以使用 SecureCRT,我自己用得比较多的是 XShell,可以在官网申请免费的 家庭/学校版本 ,完全可以满足日常的开发使用需求.
上传软件使用的是配套 XFTP,其他还可以选择 WinSCP 等.
默认文件目录如下:
有箭头指向的文件夹代表是软连接,可以理解为 Windows 的快捷方式,在 ftp 中可以看到图标左下角有个快捷方式的标志.
可以将一些常用的文件夹或文件链接到外层的目录方便日常使用.
通常我会在根目录再创建一个“app”文件夹,用来存放我们的 web 应用.
如果一个目录或文件名是以一个点开始,就表示这个目录或文件是一个隐藏目录或文件。即以默认方式査找( ls )时,不显示该目录或文件。可以使用 ls -a 查看.
在 Windows 中我们要安装一个新软件通常又两种情况,一种是打开 exe 文件或其他什么格式的安装程序,然后它会把文件安装到我们指定的目录下,同时也会在在注册表中添加信息或在系统盘中创建一些配置文件之类的,具体有很多情况,另一种是解压一个压缩包,打开即用,通常是一些相对简易的工具类软件.
在 Linux 中也是类似的,一方面你可以通过包管理工具来安装文件,它会自动将文件放置到固定的目录或者你指定的目录下,另一方面,你也可以下载压缩包,解压后再按照软件的具体用法去使用.
不过即使是安装包,在 Linux 中也是有区别的,在查资料的时候我们会看到 rpm、yum、apt 等各种各样格式的文件,它们都可以安装软件,但是却有着区别.
对比项 | rpm | yum | dpkg | apt |
---|---|---|---|---|
系列 | RedHat 系 | RedHat 系 | Debian 系 | Debian 系 |
区别 | 包安装工具 | 依赖管理工具 | 包安装工具 | 依赖管理工具 |
其中,包安装工具就是简单的安装工具,如果某个软件需要一个依赖库,你要先手动安装好才能继续,类似在 Windows 系统中运行一些软件需要先安装.Net Framework XX 这种依赖库,而依赖管理工具与前端的 npm 类似,会自动帮你安装所依赖的库,就是所谓的一键安装升级卸载工具.
从上面的表格中可以看出 RedHat 系和 Debian 系的安装工具有所区别,这也就是为什么我前面要强调先区分发行版系统再执行命令,在 Debian 中执行 yum 是不可行的,虽然我们可以把 yum 安装到 Debian 中,但这显然违反了设计的初衷,因为 Debian 已经有 apt 了,另外需要注意的是,即使是同样功能的依赖库,软件包的名字可能也是不一样的,可能是因为由不同的人开发了相同功能的软件,例如编译 Nginx 所需要的 5 个依赖:
RPM 包默认安装路径:
安装路径 | 含 义 |
---|---|
/etc/ | 配置文件安装目录 |
/usr/bin/ | 可执行的命令安装目录 |
/usr/lib/ | 程序所使用的函数库保存位置 |
/usr/share/doc/ | 基本的软件使用手册保存位置 |
/usr/share/man/ | 帮助文件保存位置 |
另外需要注意的是,指令文件通常不会作用到全局,需要我们自己去修改环境变量。如果有在 Windows 中安装过 Java 可能会有印象,我们安装完成后并不能在 cmd 中直接使用 Java 指令,而是要到对应的目录中才可以执行,但是通过设置环境变量,将指令文件映射到全局,就可以在任意文件夹目录使用 Java 指令,Linux 也是一样的,上文目录结构那张图中有个名为“sbin”的文件,其中存储的就是指令。有些人提供的安装脚本会帮你添加好全局指令,具体操作需要自己斟酌.
一些常用软件的安装流程我之前写过,可以参考下面两篇:
在 Linux 上从零开始部署前后端分离的 Vue+Spring boot 项目 。
前端 Linux 部署命令与流程记录 。
守护进程这部分因为方法很多,而且都很容易查到,我没有写具体步骤,但是对于 web 开发来说很重要,一定要提一下.
当我第一次开发好应用,上传服务器,(中间略去一大堆步骤),启动使用也 OK 以后,以为一切万事大吉就把远程工具关掉了,然后发现应用就不能访问了,了解了之后才知道我只是创建了一个前台的任务,就像 Windows 系统中你当前打开的窗口,你关闭窗口程序自然不再运行,然而还是有很多程序不依赖于窗口运行,这些后台任务默默地在执行着工作,就像我们的网站 24 小时在线一样,所以我们也要通过守护进程这一形式把我们的应用也变成后台任务,方法有很多,可以参考下面这篇:
Linux 守护进程的启动方法 。
权限问题我们都会说很重要,但是在网上查资料的时候发现很多人改权限一点都不手软,这里以 Nginx 创建自定义日志为例,Nginx 默认配置第一行如下:
#user nobody;
意思是 Nginx 是通过 nobody 这个用户来启动的,所以 Nginx 的最大权限就是 nobody 的权限,虽然这里注释掉了,但是默认值就是 nobody,这个可以在系统中查到.
Nginx 的默认日志文件为 /usr/local/nginx/logs/access.log ,通过下图可以看到它的权限 rwxrwxrwx,可以简单来说就是完全权限,任何人都可以读、写或删除,如果我们想让 Nginx 在 /usr/local/nginx/logs 这个目录中写自定义日志会得到没有权限的错误,因为 nobody 这个用户没有对这个目录的读写权限.
我查到一种很常见的解决方法:如果 nobody 没有读写权限,那么哪个用户有读写权限呢?root 肯定有,所以就把 Nginx 的用户改成了 root,这种思路看起来合理,但是这种权限操作却并不必要,回过头来思考一下,如果没有目录的读写权限,给目录设置相应用户的读写权限就可以了.
现在我们回到权限的设置上,rwx 其实很容易就能猜到分别代表读(用 r 表示)、写(用 w 表示)和执行(用 x 表示,针对可执行文件或目录),为什么有三个,看下图:
至于为什么最开始提到 777 权限,并且很多文章会让你执行 chmod 777 ,这里面:
通过 4、2、1 的组合,我们可以得到以下几种权限 。
所以 777 就表示不应该被滥用的最高权限.
还有很多零散的点需要注意一下不单独分章节了.
这点很容易被忽视,但是遇到这个问题后很让人头疼,我们习惯使用的 Windows 系统文件名是大小写不敏感的,也就是说一个名字叫 a.txt 的文件,和一个名字叫 A.txt 是同名的,然而在 Linux 中是对大小写敏感的,这一点需要留意.
我们的 web 应用经常要暴露一些端口给外部访问,除了要在系统内部的防火墙中开放所需要的端口,还要在云服务器平台上开放相应的端口。另外,不要图省事把防火墙整个关掉.
\n
, 行尾以 \n
来标识 \r
和一个换行符(LF) \n
和,行尾以 \r\n
来标识 所以两边文件互相转移时可能会有多余字符.
在很多文章中,会有以 sudo 开头的命令,它的作用是临时提升命令的权限,让它获得最高权限,也许能提高一些命令的成功率,但如果你已经是 root 用户了,加上 sudo 也没用.
如果想在 Linux 中直接编辑文本会比想象中复杂,但是多操作几遍就能理解,条件允许的情况下我会在 ftp 中编辑文件.
编辑指令可以参考这篇 。
Linux文件编辑命令详细整理 。
最后此篇关于面向Web开发人员的Linux实用入门的文章就讲到这里了,如果你想了解更多关于面向Web开发人员的Linux实用入门的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
💡 作者: 韩信子 @ ShowMeAI 📘 机器学习实战系列 : https://www.showmeai.tech/tutorials/41 📘
网络上关于SEO的文章实在是太多了,让很多新手站长都无法判别哪些是有用的,哪些是没有用的。尤其是外链建设这一块,如果被误导了,对网站将是沉重的打击。这里我整理一下比较有用的五种链接建设的方法,供大家
项目中经常有对时间进行处理的需求,下面是一些常用的操作整理,方便以后再次使用以及做相关复习。 1.字符串转换为日期 ?
有时候你会看到很Cool的Python代码,你惊讶于它的简洁,它的优雅,你不由自主地赞叹:竟然还能这样写。其实,这些优雅的代码都要归功于Python的特性,只要你能掌握这些Pythonic的技巧,你
曾经SEO流传一句老话,内容为王外链为皇,而到现在,这句话依然作为SEO优化的基础,但很多新手SEO朋友们往往在原创内容上碰壁,在2016年自媒体模式冲击下,外链的作用越来越弱,而导致了很多SEOe
本文讲述了PHP常见错误提示含义解释。分享给大家供大家参考,具体如下: 在学习PHP的时候,经常遇到各种错误提示,今天看到这错误提示和解释感觉挺好,现转过来,供我们学习。呵呵。。。。。 1、No
在现代 v8 Javascript 中,String.prototype.slice 的算法复杂度是多少? 明确地说,我正在寻找真实世界的实用数据或经验法则。 快速测试 我试图通过在最新的 Chrom
我上过几门关于 Java 的大学类(class)。然而,这些类缺少的是一些实用的 Java 方法——或者说,作为一个整体的编程。只有在企业中才能学到的东西。 但是,由于不允许我在工作场所使用 Java
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
使用新的替代工具来改进旧的命令行工具。 在Linux/Unix系统的日常使用中,我们需要使用很多命令行工具来完成工作,以及理解和管理我们的系统,例如使用du来监视磁盘利用率、top来显示系统资
灵感来自 Haskell API Search Engine 我开始想知道在 Scala 库中查找事物名称的正确方法是什么。 例如,假设我需要一些字符串变电站,例如搜索和替换。 StringOps 没
所以我已经阅读了很多这方面的内容,所以请知道我知道像 0.6 这样的数字不能绝对准确地表示为 Java double - 但我知道有一个 double 版本表示数字 0.6 足够接近,以至于在对该数字
我有一个 Django 应用程序,可以获取近乎实时的数据(推文和投票),尽管更新平均每分钟或两分钟发生一次。但是,我们希望通过在数据出现时立即更新站点和 api 结果来显示数据。 我们可能会在这个站点
我需要一个 double[],通过跨步 y 返回一个列表,将其分成 x 元素组。非常基本...一个循环和/或一些 linq 以及所有设置。然而,我并没有在扩展方法上花费太多时间,这看起来是一些练习的不
想要了解变量在 javascript 中如何在分配不同类型的值时工作。 类型 1:字符串 bool 值 类型 2:数组对象函数正则表达式日期 目前引用了两本引起混淆的书。 let mood = "li
我想在 iPad 中打开包含宏的 xls 文件。该宏与安全相关,并且已启用 xls 文件。如果我尝试使用 UIWebview 打开该文件,则会显示加密数据错误。如果 Excel 文件中禁用了宏,那么它
我发现自己在一个包含 Lua 的 C 项目中需要一个哈希表容器。我想知道是否可以将 Lua 中的哈希表用作通用容器。我查看了 ltable.h,所有函数都需要一个 Lua 状态并且似乎与 Lua 环境
尝试使用 Meteor 1.6 运行 practicalmeteor:mocha 时,我在终端上收到以下错误 Uncaught TypeError: MochaRunner.runEverywhere
我正在读《实用Django项目》这本书。这是一本好书。不过我有几个问题: 第71页,有以下代码: from django.conf.urls.defaults import * from dj
第 183 和 184 页有以下代码: def edit_snippet(request, snippet_id): snippet = get_object_or_404(Snippet,
我是一名优秀的程序员,十分优秀!