记录有关LNMP的一些知识点

Linux的用户体系

概述

简单来讲,Linux的用户体系包括用户(使用UID进行标识)和用户组(使用GID进行标识)两部分,用户可以属于多个用户组(一个主组,零或多个附属组)。

Linux有以下三种用户类型:

  1. root用户:系统超级管理员,可以操作任何文件和指令,拥有最高权限,UID为0;
  2. 虚拟用户:这类用户不具有登录系统的能力,但却是系统运行必不可少的用户,例如bin,daemon等等,这些用户是系统或者一些应用创建的,UID为1~499;
  3. 普通用户:这类用户可以登录系统,但是权限不如root用户大。用户可以自行添加,UID为500~60000。

用户信息相关文件

用户信息保存在/etc/passwd中,密码信息保存在/etc/shadow中。

passwd文件结构
用户名 密码(固定显示为x) UID 主组GID 用户描述(默认为用户名) 用户家目录路径 用户默认shell路径
root x 0 0 root /root /bin/bash
daemon x 1 1 daemon /usr/sbin /user/sbin/nologin
admin x 1000 1000 /home/admin /bin/bash

用户组信息保存在/etc/group中。

group文件结构
组名称 组密码(固定显示为x) GID 以该组作为附属组的用户名称
root x 0
daemon x 1
adm x 4 syslog
admin x 1000

用户相关指令

  1. useradd创建用户
  2. passwd为用户设置密码
  3. usermod修改用户
  4. userdel删除用户
  5. id 显示用户信息
  6. su switch user,切换用户

useradd

-c 用户描述
-d 指定用户家目录
-g 指定主组,可以用ID或组名(组必须事先创建),如果没有指定,则创建和用户名相同的组
-G 指定附属组,可以用ID或组名(组必须事先创建)
-s 指定默认shell,可用的shell列表在/etc/shells
-u 指定UID
-m 如果家目录不存在则自动生成
更多参数和默认配置查看man useradd

例如:useradd -c "this is a test user" -m -d /test/testuser -g testgroup -G admin,root -s /bin/bash -u 999 testuser

passwd

passwd修改用户自己的密码。
passwd 修改指定用户的密码,仅root用户有此权限。

usermod

-c -d -g -G -s -u 参数作用和useradd命令一致。
-L 锁定用户,锁定后用户无法登录。
-U 解锁用户。

userdel

-r 删除用户的同时删除用户家目录。

su

su - 登录式切换,会读取目标用户的配置文件。
su 非登录式切换,仅切换用户,不读取目标用户的配置文件。

用户组相关指令

  1. groupadd创建组
  2. groupmod修改组
  3. groupdel删除组

Linux的文件权限

Linux的用户体系和文件权限息息相关。
通过ls -l可以查看当前目录下的文件和子目录的权限。(常用ll命令,是ls -alF的缩写,会额外显示隐藏文件。该缩写定义在用户家目录的shell配置文件.bashrc中。)

文件与目录权限

drwxr-xr-x这10个字符的第一位表示当前文件或目录的类型,d表示目录,l表示连结,-表示文件。后面9位,每三位为一组,分别代表属主用户、属组用户、其他用户的权限。
r代表可读,w代表可写,x代表可执行(除此之外还有st,不展开)。体现在文件和目录上,作用分别为:

对于文件

  • r代表文件可以被读取、查看;
  • w代表可修改,但不代表可删除,删除文件的权限受该文件所属目录的写权限控制;
  • x代表可执行。

对于目录

  • r代表目录内容可被ls等指令查看;
  • w代表目录可被修改,包括在目录内创建、删除文件,重命名目录等;
  • x代表可以进入该目录。

常用指令

  1. chmod修改权限
  2. chown修改属主/属组

chmod

参考 https://www.runoob.com/linux/linux-comm-chmod.html。
常用的方式是chmod u+w filechmod -R g=rx directory等等。
u+wg-xo=rxa=rwx等表示给属主用户user、属组用户group、其他用户other、或所有用户all增加、移除或指定r w x权限。
递归操作时使用-R参数。

chown

参考 https://www.runoob.com/linux/linux-comm-chown.html。
修改属主:chown user file
修改属组:chown :group file
同时修改属主和属组:chown user:group file
递归操作时使用-R参数。

Ubuntu 16.04 LNMP + WordPress 服务器初始化配置

修改主机名

通过修改/etc/hostname文件来修改命令行@符号后面那一长串看不懂的主机名,重启后生效。
把主机名设定为localhost可以同时解决使用sudo命令时出现的sudo: unable to resolve host 错误。(也可以通过修改/etc/hosts实现,例如将第一行改为127.0.0.1 localhost 。)

创建用户组和用户

使用groupadduseradd命令完成用户组和用户的创建。可以考虑给同类型的用户分配同一个主要用户组,而不是每个用户都创建一个和用户名相同的用户组,方便按照用户组管控权限。
例如:useradd -m -g 100 -s /bin/bash -g 100将用户主组设定为系统自带的users用户组。
使用passwd 为用户设定密码。

赋予用户使用sudo命令的权限

以root用户修改/etc/sudoers文件,添加一行 ALL=(ALL) ALL来让用户有权执行sudo命令。

使用ssh登录

客户端在用户目录下新建.ssh文件夹,在文件夹下新建config文件:

Host 
    Hostname 
    User <要登录的用户>
    IdentityFile ~/.ssh/id_rsa

使用ssh-keygen生成密钥对。使用scp id_rsa.pub :~将公钥复制到服务器要登录用户的家目录中。
ssh 登录服务器,在家目录下新建.ssh目录,然后将公钥加入authorized_keys文件:cat id_rsa.pub >> .ssh/authorized_keys。确保authorized_keys的权限为600
设置/etc/ssh/sshd_config中的PubkeyAuthenticationyes

解决ssh连接服务器后一段时间不操作自动断线的问题

ssh连接服务器后,一段时间不操作,服务器就会自动断开连接,可以通过修改服务器设置,由服务器定期向客户端发送“心跳”来使连接得以保持。
修改/etc/ssh/sshd_config文件,加入以下内容后重启ssh服务。

ClientAliveInterval 30
ClientAliveCountMax 10

ClientAliveInterval 60表示每隔60秒服务器会向客户端发送一个空数据包,ClientAliveCountMax 10表示服务器会自动重试10次,如果10次客户端都没有响应则会断开连接。

安装nginx

参考官方文档

安装MySQL 5.7

参考官方文档

安装PHP 7.3

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ondrej/php
sudo apt-get update
sudo apt-get install php7.3 php7.3-common php7.3-fpm php7.3-mysql php7.3-curl php7.3-xml php7.3-mbstring php7.3-zip php7.3-gd

配置nginx

备份/etc/nginx/conf.d/default.conf,修改其内容为:

server {
    listen       80;
    server_name  localhost;

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    location /phpinfo {
        root   /var/www;
        index  index.php index.html index.htm;
    }

    location ~ /phpinfo/.+\.php$ {
        root           /var/www;
        fastcgi_pass   unix:/run/php/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

location ~ /phpinfo/.+\.php$中,location后的~代表后面的表达式为正则表达式。该正则表达式/phpinfo/.+\.php$匹配以/phpinfo/开头,后跟一个或一个以上的任意字符,最后以.php结尾的地址。
/var/www/phpinfo目录下新建一个index.php文件,写入以下内容:


重启nginx后通过浏览器访问,会发现浏览器提示错误。查看nginx的错误日志/var/log/nginx/error.log,发现nginx没有权限访问php-fpm.sock
查看/run/php/php7.3-fpm.sock文件权限:

srw-rw---- 1 www-data www-data  0 Jun 13 21:57 php7.3-fpm.sock

使用ps aux | grep nginx查看nginx工作进程的用户:

nginx    10590  0.0  0.1  24852  2332 ?        S    22:22   0:00 nginx: worker process

由于nginx用户不属于www-data用户组,所以没有php7.3-fpm.sock的读权限。将nginx用户加入www-data用户组来使其获得权限:usermod -G www-data nginx,重启nginx后刷新浏览器,phpinfo页面即可正常显示。

安装WordPress

创建一个wp-user用户:useradd -m -s /bin/bash wp-user。设置密码、配置ssh登录。
参考官方文档将WordPress文件下载、解压到wp-user的家目录下。

配置数据库

创建一个WordPress专用的数据库:create database wordpress default character set utf8mb4 collate utf8mb4_unicode_ci;
创建一个供WordPress应用使用的数据库用户:create user wordpress identified by 'password';
赋予用户操作WordPress数据库的权限:grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by 'password';

配置WordPress

复制/home/wp-user/wordpress/wp-config-sample.php生成wp-config.php文件,修改其内容,添加数据库配置:


配置nginx

修改配置文件/etc/nginx/conf.d/default.conf,在server块中加入两个location

server {
    # ...

    location / {
        root   /home/wp-user/wordpress;
        index  index.php index.html index.htm;
    }

    location ~ \.php$ {
        root           /home/wp-user/wordpress;
        fastcgi_pass   unix:/run/php/php-fpm.sock;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }
}

重启nginx后通过浏览器访问,完成WordPress的安装。

配置WordPress文件权限

为了能在WordPress的管理后台直接下载主题、插件而无需借助FTP,需要让php-fpm的运行用户www-data拥有修改wp-content目录的权限:chown -R www-data:www-data wp-content
同时在wp-config.php中加入define( 'FS_METHOD', 'direct' );来让php-fpm直接进行下载、创建修改文件和目录等操作。

Linux 常用指令备忘

开机自动启动服务

使用systemctl enable $SERVICE$可配置服务开机自启动,例如:systemctl enable redis-server
使用systemctl list-unit-files可列出所有的服务(unit),例如:systemctl list-unit-files | grep redis

你可能感兴趣的:(记录有关LNMP的一些知识点)