Ubuntu 阿里云安装环境并配置 二级域名 https sftp

apt-get update 是访问源列表里的每个网址,并读取软件列表,然后保存在本地。我们在新立得软件包管理器里看到的软件列表,都是通过update命令更新的
而 apt-get upgrade 把本地已安装的软件,与刚下载的软件列表里对应软件进行对比,如果发现已安装的软件版本太低,就会提示更新 (升级已安装的所有软件包,升级之后的版本就是本地地址里的)
update是更新软件列表,upgrade是更新软件。

sudo apt-get update

语言包
这个包是为了解决系统不同语言之间可能发生的冲突,安装之后可以减少许多因语言编码带来的问题。
其中 -y 参数表明直接安装,无需确认。

sudo apt-get install -y language-pack-en-base
# 安装完成之后,设定语言编码为UTF-8
locale-gen en_US.UTF-8

安装常用软件 vim git zip unzip

sudo apt-get install -y vim git zip unzip

安装 PHP7.2
采用ppa (Personal Package Archive 个人软件包存档)方式安装

(现在对 ppa 还不是很清楚)

# software-properties-common 是 add-apt-repository 所依赖的包
sudo apt-get install software-properties-common
# 来添加php7的ppa,LC_ALL=en_US.UTF-8 参数告诉我们系统语言为UTF-8
sudo LC_ALL=en_US.UTF-8 add-apt-repository ppa:ondrej/php
# 安装完成之后,更新安装包,把刚才添加的包拉取下来。
sudo apt-get update
# 搜索php7.2开头的包检验是否安装成功
apt-cache search php7.2
# 安装 php7.2 , -y 这个指令是跳过系统提示,直接安装
sudo apt-get install -y php7.2
# 安装php7.2-mysql,这是 Php7.2 与 mysql 的通信模块
sudo apt-get install -y php7.2-mysql
# 安装 fpm,这是Nginx 用来解析php文件的
sudo apt-get install -y php7.2-fpm
# 安装常用扩展
sudo -y apt-get install php7.2-fpm php7.2-mysql php7.2-curl php7.2-json php7.2-mbstring php7.2-xml php7.2-intl 
# 安装其他扩展(按需安装)
sudo apt-get install php7.2-gd
sudo apt-get install php7.2-zip
sudo apt-get install php7.2-要安装的扩展名...

安装 Mysql

sudo apt-get install -y mysql-server

安装 Nginx
安装之前需确认是否安装了apache2,如果已经安装了apache2,需要先停止/卸载 apache2

# 停止
sudo service apache2 stop
# 卸载
sudo apt-get --purge remove apache2
sudo apt-get --purge remove apache2.2-common
sudo apt-get autoremove
# 安装 nginx
sudo apt-get install -y nginx

配置 PHP7

# 修改 cgi.fix_pathinfo=0 ,具体现在不是很清楚,没试过。
# 附上链接 https://blog.51cto.com/xiumu/1722974
sudo vim /etc/php/7.2/fpm/php.ini
# 配置 PHP7 修改 listen = /run/php/php7.2-fpm.sock 修改为 listen = /var/run/php/php7.2-fpm.sock
# 附上 vim教程 https://coolshell.cn/articles/5426.html
sudo vim /etc/php/7.2/fpm/pool.d/www.conf

配置 Nginx
root:是你的项目的public目录,也就是网站的入口
index:添加了,index.php,告诉Nginx先解析index.php文件
server_name:你的域名,没有的话填写localhost
location / try_files修改为了try_files $uri $uri/ /index.php?$query_string;
location ~ .php$部分告诉Nginx怎么解析Php,原封不动复制即可,但注意:fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;的目录要和fpm的配置文件中的listen一致。

# 配置 Nginx
sudo vim /etc/nginx/sites-available/default 
# 修改如下,根据项目情况修改对应信息:
# 'your-laravel-project'替换为你的项目
# 'your-domain-or-ip' 替换为你的网站域名或IP地址
server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/your-laravel-project/public;
    index index.php index.html index.htm;
    server_name your-domain-or-ip;

    location / {
        try_files $uri $uri/ /index.php?$query_string;      
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php7.1-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

拉取代码
建议先将代码上传到云端代码仓库(github, coding)然后再在服务端上拉取

cd /var/www
git clone 地址

安装 Composer 并使用 Composer 安装代码依赖

# 访问官网 https://getcomposer.org/download/
# 获取下面四行代码最新版,直接粘贴执行安装 Composer
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '669656bab3166a7aff8a7506b8cb2d1c292f042046c5a994c43155c0be6190fa0355160742ab2e1c88d40d5be660b410') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"
# 之后把刚才下载到当前目录的 composer.phar 移动到 /usr/local/bin/composer
mv composer.phar /usr/local/bin/composer

配置项目

# 进入项目目录
cd /var/www/your-laravel-project
# 执行 composer install
composer install
# 根据项目实际情况修改 .env 文件,注意 debug、sql、redis这一些配置
cd /var/www/your-laravel-project
cp .env.example .env
vim .env
# 生成 laravel key
cd /var/www/your-laravel-project
php artisan key:generate
# 首先登录 mysql 创建一个对应项目的数据库,名字应该和 .env 文件中的一致
mysql -u root -p
CREATE DATABASE IF NOT EXISTS laravel_project_db_name default charset utf8 COLLATE utf8_general_ci;
# 执行迁移
cd /var/www/your-laravel-project
php artisan migrate
# 修改权限
sudo chown -R www-data:www-data /var/www
sudo chmod -R 777 /var/www/your-laravel-project/storage
# 重启 Nginx 和 PHP7 fpm
service nginx restart
service php7.2-fpm restart

现在访问应该可以的了

接下来配置 sftp

安装 openssh 服务器

# 先看是否有安装 openssh 服务器 
sudu ssh
# 没有就安装它
sudo apt-get install openssh-server

为SFTP访问创建用户组,便于管理权限

sudo addgroup sftp-users

创建 SFTP用户,并配置相应权限
这里用的是名为 'new_user_name' 的账户

sudo adduser new_user_name
# -G sftp-users    将 new_user_name 从所有其他用户组中移除并加入到 sftp-users组
# -a 是不将该用户从原来的组中删除 例如:sudo usermod -a -G sftp-users -s /bin/false new_user_name 表示 不从原来的组中删除,并加入 sftp-users 这个组
# -s /bin/false    关闭其 Shell 访问 (这里我没用 -s 试过)
sudo usermod -G sftp-users -s /bin/false new_user_name

创建 SFTP 的根目录
准备“监狱”的根目录及共享目录。“监狱”的根目录必须满足以下要求:
所有者为root,其他任何用户都不能拥有写入权限。
因此,为了让SFTP用户能够上传文件,还必须在“监狱”根目录下再创建一个普通用户能够写入的共享文件目录。
为了便于管理员通过SFTP管理上传的文件,把这个共享文件目录配置为:由管理员所有,允许属于sftp-users这个组的读写。
这样,管理员和sftp-users组成员就都能读写这个目录了。

# 创建 SFTP 的“监狱”根目录
sudo mkdir /home/sftp_root
# 创建普通用户能写入的共享目录
sudo mkdir /home/sftp_root/shared
# 修改这个的共享目录的所属用户为 admin ;所属组为 sftp-users
sudo chown admin:sftp-users /home/sftp_root/shared
# 修改这个目录 所属用户rwx 所属组rwx 其他用户无权限
sudo chmod 770 /home/sftp_root/shared

修改SSH配置文件
在sshd_config文件的最后,添加以下内容:
这些内容的意思是:
针对sftp-users的用户,额外增加一些设置:将“/home/sftp_root”设置为该组用户的系统根目录(因此它们将不能访问该目录之外的其他系统文件);
禁止TCP Forwarding和X11 Forwarding;
强制该组用户仅仅使用SFTP。

网上真多坑,又没写清楚,如果没有注意用 root 登录,但是 root 不是这个组的成员
无法ssh登录,会出现: This service allows sftp connections only.
用 sftp-users 这个组的成员登录,但是能又配置了 Match Group sftp-users 针对这个组的限制 ForceCommand internal-sftp

# 只允许组 sftp-user 通过 ssh 访问文件系统
AllowGroups sftp-users

我的配置如下

# 找到如下这行,并注释掉
# Subsystem sftp /usr/libexec/openssh/sftp-server  
# 添加如下几行,这行指定使用sftp服务使用系统自带的 internal-sftp
# 这是为了避免chroot后找不到sftp-server这个文件,无法正常使用SFTP服务器的情况
Subsystem sftp internal-sftp  

# 只允许组 sftp-user 通过 ssh 访问文件系统
# 这里现在不用到多个账号 ssh登录限制,有需要可以再加个 ssh-users组,要记得配置好
# AllowGroups sftp-users
# 针对 sftp-users用户
Match Group sftp-users
    # 将 /home/sftp_root 设置为该组用户的系统根目录,它们将不能访问该目录之外的其他系统文件
    # 用chroot将用户的根目录指定到/data/sftp/%u,%u代表用户名,这样用户就只能在/data/sftp/%u下活动
    # chroot的含义,可以参考这里:http://www.ibm.com/developerworks/cn/linux/l-cn-chroot/
    ChrootDirectory /home/sftp_root
    # 禁止 TCP Forwarding 和 X11 Forwarding 
    AllowTcpForwarding no
    X11Forwarding no
    # 强制该组用户仅仅使用指定sftp命令
    ForceCommand internal-sftp

Mysql远程登录

出现 Can't connect to MySQL server on 'xxxxxxxxx IP' (10061)

首先我们要确保mysql安装成功,并且确认服务端的mysql服务和3306端口开启。如果是Listen则表示成功监听。

netstat -tap | grep mysql;
netstat -an | grep 3306

阿里云的防火墙看有没有 mysql,没有可以加上
Ubuntu 阿里云安装环境并配置 二级域名 https sftp

因为我是使用apt-get来安装mysql的,所以Mysql一般就是默认安装在/etc/mysql的路径下。
在/(根路径)下我们输入vi /etc/mysql/mysql.conf.d/mysqld.cnf,找到 bind-address=127.0.0.1这一段文本,将它注释掉或则将它改成 bind-address =0.0.0.0。这些方法目的是允许其他的主机可以访问服务,而不仅仅是127.0.0.1(localhost).

# bind-address = 127.0.0.1 或者 address = 127.0.0.1
# 我的是 bind-address,改成
bind-address = 0.0.0.0

重启服务。输入命令行/etc/init.d/mysql restart 等待重启ok

/etc/init.d/mysql restart

然后我们执行以下的语句:
第一句命令是允许所有主机可以通过你的mysql这个账户和密码登录,%代表所有的主机,等于随意的意思
第二句命令是只允许ip为192.168.20.3的主机登录,你可以看情况使用

# 看授权 等会前后对比一下
show grants for 'root'@'%';

GRANT ALL PRIVILEGES ON *.* TO 'yourUsername'@'%'IDENTIFIED BY 'yourPassword' WITH GRANT OPTION;
# 或者
GRANT ALL PRIVILEGES ON *.* TO 'yourUsername'@'192.168.20.3'IDENTIFIED BY 'yourPassword' WITH GRANT OPTION;

执行之后,再输入一个刷新PRIVILEGES的命令 (记得mysql都是需要用;来分隔语句的,别忘记了)

FLUSH PRIVILEGES; 

如果还是不行,更改 数据库名 'mysql' 的 'user' 表
Ubuntu 阿里云安装环境并配置 二级域名 https sftp

# 先进去 mysql
mysql -u root -p
# 选择数据库
use mysql;
# 查看 user 表
select host,user from user;
# 更改 root 的 host 字段
UPDATE user SET host = '%' WHERE user = 'root';
# 看授权 前后对比一下
show grants for 'root'@'%';

配置https

因为免费的只能配置一个域名,我用到多个子域名所以得配置多个
Ubuntu 阿里云安装环境并配置 二级域名 https sftp

把对应域名的证书放到
/etc/nginx/ssl/domain1/.....pem
/etc/nginx/ssl/domain1/.....key
/etc/nginx/ssl/domain2/.....pem
/etc/nginx/ssl/domain2/.....key

server {
    listen 443;
    server_name larabbs.xxxxxxx.com xxxxxxx.com;

    root /var/www/larabbs/public;
    index index.php index.html index.htm;

    ssl on;
    ssl_certificate /etc/nginx/ssl/xxxxxxx.com/1989989_xxxxxxx.com.pem;
    ssl_certificate_key /etc/nginx/ssl/xxxxxxx.com/1989989_xxxxxxx.com.key;

    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers  on;
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  24h;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

server {
    listen 80;
    listen 443 ssl;
    server_name larabbs.xxxxxxx.com xxxxxxx.com;

    if ($scheme = http) {
        return 301 https://$server_name$request_uri;
    }

    root /var/www/larabbs/public;
    index index.php index.html index.htm;

    ssl on;
    ssl_certificate /etc/nginx/ssl/wonderfate.com/1989989_xxxxxx.com.pem;
    ssl_certificate_key /etc/nginx/ssl/wonderfate.com/1989989_xxxx.com.key;

    ssl_protocols              TLSv1 TLSv1.1 TLSv1.2;
    ssl_prefer_server_ciphers  on;
    ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  24h;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        try_files $uri /index.php =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass unix:/var/run/php/php7.2-fpm.sock;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }
}

有错误的或者更好的方法,请指点一下~

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 1

写得很详细 :+1:

4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!