Ubuntu 阿里雲安裝環境並配置 二級域名 https sftp

BboyFate發表於2019-04-03

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

現在訪問應該可以的了

安裝 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

出現 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'@'%';

因為免費的只能配置一個域名,我用到多個子域名所以得配置多個
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;
    }
}

有錯誤的或者更好的方法,請指點一下~

相關文章