{"id":49738,"date":"2023-07-09T15:01:57","date_gmt":"2023-10-23T12:34:40","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/"},"modified":"2024-04-30T12:44:03","modified_gmt":"2024-04-30T04:44:03","slug":"%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/","title":{"rendered":"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL)"},"content":{"rendered":"<p>\u4f7f\u7528Django + MySQL\u5f00\u53d1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u751f\u4ea7\u73af\u5883\u5c06\u4f7f\u7528Ansible\u5728Amazon EC2\u4e0a\u8fdb\u884c\u914d\u7f6e\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8d2e913a08637a6d2869\/1-0.jpeg\" alt=\"django-wsgi-full.jpg\" \/><\/div>\n<p>\u4ee5\u4e0b\u4e24\u7bc7\u6587\u7ae0\u7684\u7eed\u7bc7\u5df2\u4e8e\u6b64\u6b21\u5b8c\u6210\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u524d\u3005\u56de: Django\u3092Amazon Linux 2\u306bAnsible\u3067\u69cb\u6210\u3059\u308b\u3001Aurora (MySQL) \u3092CloudFormation\u3067UTF-8\u306b\u69cb\u6210\u3059\u308b\u3001\u305d\u3057\u3066\u63a5\u7d9a\u3059\u308b\u307e\u3067\u304c\u5730\u5473\u306b\u5927\u5909\u3060\u3063\u305f\u3053\u3068<\/ul>\n<\/li>\n<\/ul>\n<p>\u524d\u56de: Nginx + Gunicorn + Django + Aurora (MySQL) \u306e\u69cb\u6210\u3092\u56f3\u3067\u8aac\u660e\u3057\u3066\u307f\u308b<\/p>\n<h1>\u73af\u5883<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">OS: Amazon Linux 2\uff08Amazon EC2\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30d5\u30ec\u30fc\u30e0\u30ef\u30fc\u30af: Django 2.2.6<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u30b5\u30fc\u30d0: Gunicorn 19.9<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Web \u30b5\u30fc\u30d0: Nginx 1.12 (Amazon Extras)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9: Amazon Aurora Serverless\uff08MySQL 5.6.10 \u4e92\u63db\uff09<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u69cb\u6210\u30c4\u30fc\u30eb: Ansible 2.8.5\u3001AWS CloudFormation<\/ul>\n<p>\u203b \u6211\u4eec\u5c06\u4e0d\u5b89\u88c5\u865a\u62df\u73af\u5883\uff08\u5982venv\uff09\uff0c\u800c\u662f\u4e13\u95e8\u4e3aDjango\u5e94\u7528\u7a0b\u5e8f\u4f7f\u7528EC2\u3002<br \/>\n\u203b Nginx\u548cGunicorn\u5c06\u4f7f\u7528\u540c\u4e00\u5b9e\u4f8b\u4e0a\u7684UNIX\u57df\u5957\u63a5\u5b57\u8fdb\u884c\u8fde\u63a5\u3002<br \/>\n\u203b \u5728\u672c\u5730\u7684CentOS 7\u4e0a\u4e5f\u53ef\u4ee5\u5b9e\u73b0\u76f8\u540c\u7684\u914d\u7f6e\u3002<\/p>\n<h1>\u7edd\u7b56\u4efb\u52a1\u4e66<\/h1>\n<p>\u4e3a\u4e86\u5728\u5176\u4ed6Playbook\u4e2d\u91cd\u590d\u4f7f\u7528\uff0cPython3\u548cNginx\u5c06\u88ab\u5206\u6210\u4e09\u4e2a\u89d2\u8272\uff0c\u5982\u4e0b\u6240\u793a\uff0c\u4ee5\u4fbf\u66f4\u65b9\u4fbf\u5730\u518d\u5229\u7528\u3002<\/p>\n<pre class=\"post-pre\"><code>\u251c\u2500\u2500 inventories\/\r\n\u251c\u2500\u2500 roles\/\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 django\/\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 nginx\/\r\n\u2502\u00a0\u00a0 \u2514\u2500\u2500 python3\/\r\n<\/code><\/pre>\n<h2>\u4f7f\u7528Python3\u6eda<\/h2>\n<p>Python3 \u7684\u5b89\u88c5\u4e0e\u4e0a\u4e00\u7bc7\u6587\u7ae0\u76f8\u540c\uff0c\u9700\u8981\u5b89\u88c5 python3\u3001python3-devel\u3001python3-libs\u3001python3-pip \u7684 RPM \u5305\u3002\u901a\u8fc7 yum \u5b89\u88c5 python3-devel\uff0c\u5176\u4ed6\u4f9d\u8d56\u9879\u5c06\u81ea\u52a8\u5b89\u88c5\u3002<\/p>\n<pre class=\"post-pre\"><code>\u2502\u00a0\u00a0 \u251c\u2500\u2500 python3\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install Python3 packages<\/span>\r\n  <span class=\"na\">yum<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">python3-devel<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n<\/code><\/pre>\n<h2>Nginx\u89d2\u8272<\/h2>\n<p>\u5728\u8fd9\u4e2a\u89d2\u8272\u4e2d\uff0c\u5c06\u5b89\u88c5Nginx\u8f6f\u4ef6\u5305\uff0c\u5e76\u8fdb\u884c\u5176\u4ed6Playbook\u4e2d\u4f7f\u7528\u7684\u901a\u7528\u57fa\u672c\u914d\u7f6e\u3002<\/p>\n<p>\u5982\u679c\u64cd\u4f5c\u7cfb\u7edf\u662fAmazon Linux 2\uff0c\u5b89\u88c5Nginx\u9700\u8981\u7a0d\u4f5c\u8c03\u6574\u3002\u53c2\u8003\uff1a\u8003\u8651\u5728Ansible\u4e0a\u5982\u4f55\u5b89\u88c5Nginx\u5728Amazon Linux 2\u7684EC2\u4e0a\uff08\u5373\u4f7f\u4f7f\u7528\u65e7\u7248\u7684Jinja2\u4e5f\u53ef\u4ee5\uff09\u3002<\/p>\n<p>\u6700\u8fd1\u6d41\u884c\u7684\u662f\u4ece \/etc\/nginx\/sites-enabled\/ \u4e2d\u5305\u542b\u865a\u62df\u7f51\u7ad9\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u56e0\u6b64\u4e3a\u4e86\u4e0e\u4e4b\u76f8\u9002\u5e94\uff0c\u6211\u4eec\u5c06\u8fdb\u884c\u4e00\u4e2a\u5c0f\u5c0f\u7684\u6539\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code>\u2502\u00a0\u00a0 \u251c\u2500\u2500 nginx\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 files\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 etc\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 nginx\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 conf.d\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2514\u2500\u2500 sites-enabled.conf\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 tasks\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 main.yml\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5Nginx<\/h3>\n<p>\u4f7f\u7528amazon-linux-extras\u547d\u4ee4\u6fc0\u6d3bnginx1.12\u4ed3\u5e93\uff0c\u7136\u540e\u4f7f\u7528yum\u5b89\u88c5nginx\u8f6f\u4ef6\u5305\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Enable amzn2extra-nginx1.12 repository<\/span>\r\n  <span class=\"na\">shell<\/span><span class=\"pi\">:<\/span> <span class=\"s\">amazon-linux-extras enable nginx1.12<\/span>\r\n  <span class=\"na\">changed_when<\/span><span class=\"pi\">:<\/span> <span class=\"no\">false<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install Nginx packages from amazon-linux-extras<\/span>\r\n  <span class=\"na\">yum<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n<\/code><\/pre>\n<h3>\u865a\u62df\u7f51\u7ad9\u8bbe\u7f6e\u6587\u4ef6\u7684\u90e8\u7f72\/\u5305\u542b\u76ee\u5f55<\/h3>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u540d\u4e3asites-available\/\u7684\u76ee\u5f55\u6765\u90e8\u7f72\u865a\u62df\u4e3b\u673a\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u521b\u5efa\u4e00\u4e2a\u540d\u4e3asites-enabled\/\u7684\u76ee\u5f55\u6765\u653e\u7f6e\u76f8\u5173\u7684\u5305\u542b\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Create sites-available directory<\/span>\r\n  <span class=\"na\">file<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/nginx\/sites-available\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">directory<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Create sites-enabled directory<\/span>\r\n  <span class=\"na\">file<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/nginx\/sites-enabled\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">directory<\/span>\r\n<\/code><\/pre>\n<p>\u7136\u800c\uff0c\u5728\u9ed8\u8ba4\u7684\u914d\u7f6e\u6587\u4ef6\u4e2d\uff0c\u5305\u542b\u8def\u5f84\u88ab\u8bbe\u7f6e\u4e3aconf.d\/\uff0c\u56e0\u6b64sites-enabled\/\u76ee\u5f55\u4e2d\u7684\u6587\u4ef6\u4e0d\u4f1a\u88ab\u5305\u542b\u8fdb\u6765\u3002<\/p>\n<pre class=\"post-pre\"><code>    <span class=\"k\">include<\/span> <span class=\"n\">\/etc\/nginx\/conf.d\/*.conf<\/span>;\r\n<\/code><\/pre>\n<p>\u4e3a\u4e86\u5c06sites-enabled\/\u76ee\u5f55\u5305\u542b\u5230\u5305\u542b\u8def\u5f84\u4e2d\uff0c\u800c\u4e0d\u66f4\u6539\u9ed8\u8ba4\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u8bf7\u5c06\u4ee5\u4e0b\u6587\u4ef6\u90e8\u7f72\u5230conf.d\/\u76ee\u5f55\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">include<\/span> <span class=\"n\">\/etc\/nginx\/sites-enabled\/*<\/span>;\r\n<\/code><\/pre>\n<p>\u5c06\u6587\u4ef6\u90e8\u7f72\u5230conf.d\/\u76ee\u5f55\u662f\u4e00\u4e2a\u4efb\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Copy Nginx configuration files into nginx\/conf.d\/<\/span>\r\n  <span class=\"na\">copy<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">dest<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/nginx\/conf.d\/\"<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/files\/etc\/nginx\/conf.d\/\"<\/span>\r\n<\/code><\/pre>\n<p>\u6700\u540e\u5c06Nginx\u670d\u52a1\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Start and enable nginx service<\/span>\r\n  <span class=\"na\">systemd<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx.service<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">started<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u90e8\u7f72\u865a\u62df\u7ad9\u70b9\u7684\u8bbe\u7f6e\u6587\u4ef6\u8fdb\u884c\u90e8\u7f72\u65f6\uff0c\u8bf7\u5c06\u6587\u4ef6\u90e8\u7f72\u5230\u201csites-available\/\u201d\u4e2d\uff0c\u5e76\u5728\u201csites-enabled\/\u201d\u4e2d\u521b\u5efa\u7b26\u53f7\u94fe\u63a5\uff0c\u8fd9\u6837\u5b83\u5c31\u4f1a\u88ab\u9ed8\u8ba4\u8bbe\u7f6e\u6587\u4ef6\u5305\u542b\u8fdb\u6765\u3002<\/p>\n<h2>Django\u89d2\u8272<\/h2>\n<p>Django\u7684\u89d2\u8272\u5305\u62ec\u5bf9Gunicorn\u548cUNIX\u57df\u5957\u63a5\u5b57\u8fdb\u884c\u914d\u7f6e\uff0c\u8fd9\u4f7f\u5f97\u5b83\u53d8\u5f97\u7a0d\u590d\u6742\u3002\u8bf7\u5148\u9605\u8bfb\u4e0a\u4e00\u7bc7\u6587\u7ae0\u6765\u4e86\u89e3\u914d\u7f6e\u548c\u8bbe\u7f6e\u3002<\/p>\n<p>files\/\u306b\u306f\u30c7\u30d7\u30ed\u30a4\u3059\u308b Django \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30d5\u30a1\u30a4\u30eb\u3092\u30b3\u30d4\u30fc\u3057\u3066\u304a\u304d\u307e\u3059\u3002\u305f\u3060\u3057settings.py\u306f\u5225\u9014\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3067\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u306e\u3067\u3053\u3053\u306b\u306f\u542b\u3081\u307e\u305b\u3093\u3002<\/p>\n<p>templates\/\u306b\u306f\u524d\u56de\u306e\u8a18\u4e8b\u3067\u8aac\u660e\u3057\u305f\u5404\u7a2e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\u3068\u30e6\u30cb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u7528\u610f\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>\u2502\u00a0\u00a0 \u251c\u2500\u2500 django\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 files\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 opt\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 django\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0         \u2514\u2500\u2500 mysite\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u251c\u2500\u2500 myapp\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 admin.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 apps.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 models.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 tests.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u2514\u2500\u2500 views.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u251c\u2500\u2500 mysite\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 __init__.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u251c\u2500\u2500 urls.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2502\u00a0\u00a0 \u2514\u2500\u2500 wsgi.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0             \u2514\u2500\u2500 manage.py\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 handlers\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 tasks\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 main.yml\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2514\u2500\u2500 templates\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 gunicorn.conf.j2\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 gunicorn.service.j2\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 gunicorn.socket.j2\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u251c\u2500\u2500 nginx.conf.j2\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0     \u2514\u2500\u2500 settings.py.j2\r\n<\/code><\/pre>\n<h3>\u53d8\u91cf\u6587\u4ef6<\/h3>\n<p>\u7531\u4e8e\u9700\u8981\u5728\u591a\u4e2a\u8bbe\u7f6e\u6587\u4ef6\u548c\u5355\u4f4d\u6587\u4ef6\u4e2d\u8c03\u6574\u8bbe\u7f6e\u503c\uff0c\u56e0\u6b64\u6211\u4eec\u5c06\u5171\u4eab\u7684\u8bbe\u7f6e\u503c\u7edf\u4e00\u5b9a\u4e49\u5728 vars \u6587\u4ef6\u7684\u53d8\u91cf\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>\u251c\u2500\u2500 inventories\/\r\n\u2502\u00a0\u00a0 \u251c\u2500\u2500 development\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 group_vars\/\r\n\u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u2502\u00a0\u00a0 \u251c\u2500\u2500 all.yml\r\n<\/code><\/pre>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">django_project_base_dir: Django \u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30c7\u30d7\u30ed\u30a4\u3059\u308b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u3001settings.py\u306eBASE_DIR\u3068\u540c\u3058\u306b\u306a\u308a\u307e\u3059\u3002\u3069\u3053\u3067\u3082\u3044\u3044\u306e\u3067\u3059\u304c\u3001\u672c\u7a3c\u50cd\u74b0\u5883\u3078\u306e\u30c7\u30d7\u30ed\u30a4\u306a\u306e\u3067\/opt\/\u306e\u4e0b\u306b\u3057\u307e\u3057\u305f\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">gunicorn_run_dir: Gunicorn \u306e UNIX \u30c9\u30e1\u30a4\u30f3\u30bd\u30b1\u30c3\u30c8\u3068 PID \u30d5\u30a1\u30a4\u30eb\u3092\u7f6e\u304f\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u3059\u3002\u5909\u66f4\u3059\u308b\u3053\u3068\u306f\u306a\u3044\u306e\u3067\u30cf\u30fc\u30c9\u30b3\u30fc\u30c7\u30a3\u30f3\u30b0\u3067\u3082\u3044\u3044\u306e\u3067\u3059\u304c\u3001\u8907\u6570\u306e\u8a2d\u5b9a\u30d5\u30a1\u30a4\u30eb\uff0f\u30e6\u30cb\u30c3\u30c8\u30d5\u30a1\u30a4\u30eb\u306e\u4e2d\u3067\u660e\u793a\u7684\u306b\u540c\u3058\u8a2d\u5b9a\u5024\u306b\u3059\u308b\u305f\u3081\u306b\u5b9a\u7fa9\u3057\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">service_user\uff0fservice_group: Gunicorn \u30b5\u30fc\u30d3\u30b9\u306e\u5b9f\u884c\u30e6\u30fc\u30b6\u30fc\u3068\u30b0\u30eb\u30fc\u30d7\u3067\u3059\u3002\u4efb\u610f\u3067\u3059\u304c\u3001\u3053\u3053\u3067\u306f Nginx \u306e\u30e6\u30fc\u30b6\u30fc\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u306e\u5404\u63a5\u7d9a\u30d1\u30e9\u30e1\u30fc\u30bf\u306f\u524d\u3005\u56de\u306e\u8a18\u4e8b\u3068\u540c\u69d8\u3067\u3059\u3002<\/ul>\n<pre class=\"post-pre\"><code><span class=\"c1\"># Django \/ Gunicorn<\/span>\r\n<span class=\"na\">django_project_name<\/span><span class=\"pi\">:<\/span>      <span class=\"s2\">\"<\/span><span class=\"s\">mysite\"<\/span>\r\n<span class=\"na\">django_project_base_dir<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">\/opt\/django\/{{<\/span> <span class=\"s\">django_project_name<\/span> <span class=\"s\">}}\"<\/span>\r\n\r\n<span class=\"na\">service_user<\/span><span class=\"pi\">:<\/span>       <span class=\"s2\">\"<\/span><span class=\"s\">nginx\"<\/span>\r\n<span class=\"na\">service_group<\/span><span class=\"pi\">:<\/span>      <span class=\"s2\">\"<\/span><span class=\"s\">nginx\"<\/span>\r\n<span class=\"na\">gunicorn_run_dir<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">\/run\/gunicorn\"<\/span>\r\n\r\n<span class=\"c1\"># DB (Aurora Serverless)<\/span>\r\n<span class=\"na\">db_server_addres<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">my-main-db.cluster-xxxxxxxxxxxx.ap-northeast-1.rds.amazonaws.com\"<\/span>\r\n<span class=\"na\">db_default_schema<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">MySchema\"<\/span>\r\n<span class=\"na\">db_user<\/span><span class=\"pi\">:<\/span>            <span class=\"s2\">\"<\/span><span class=\"s\">myuser\"<\/span>\r\n<span class=\"na\">db_password<\/span><span class=\"pi\">:<\/span>        <span class=\"s2\">\"<\/span><span class=\"s\">myp@ssword\"<\/span>\r\n<\/code><\/pre>\n<h3>\u5b89\u88c5RPM\/pip\u8f6f\u4ef6\u5305\u7684\u4efb\u52a1<\/h3>\n<p>\u4e0e\u524d\u4e00\u7bc7\u6587\u7ae0\u76f8\u4f3c\uff0c\u6211\u4eec\u5c06\u5b89\u88c5RPM\u548cpip\u5305\u3002\u4e0b\u9762\u662f\u4e3a\u4e86\u4e0eAurora\u7684MySQL\u63a5\u8fd1\u7684\u7248\u672c\uff0c\u6b63\u5728\u5b89\u88c5MySQL 5.7\u7684\u5ba2\u6237\u7aef\uff0c\u4f46\u4e5f\u53ef\u4ee5\u66f4\u6539\u4e3aMySQL 8.0\u6216MariaDB\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install MySQL repository<\/span>\r\n  <span class=\"na\">yum<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">https:\/\/dev.mysql.com\/get\/mysql80-community-release-el7-3.noarch.rpm<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install rpm packages required by mysqlclient<\/span>\r\n  <span class=\"na\">yum<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"c1\"># 'mysql*'\u306b\u30de\u30c3\u30c1\u3059\u308b\u30ea\u30dd\u30b8\u30c8\u30ea\u3092\u5168\u90e8\u7121\u52b9\u5316\u3057\u3066<\/span>\r\n    <span class=\"c1\"># 'mysql57-community'\u3092\u6709\u52b9\u5316\u3057\u30015.7\u3060\u3051\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u5bfe\u8c61\u306b\u3059\u308b<\/span>\r\n    <span class=\"na\">disablerepo<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">mysql*\"<\/span>\r\n    <span class=\"na\">enablerepo<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">mysql57-community\"<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">gcc<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">mysql-community-devel<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">mysql-community-client<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Install Django packages with pip3<\/span>\r\n  <span class=\"na\">pip<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">executable<\/span><span class=\"pi\">:<\/span> <span class=\"s\">pip3<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">django<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">gunicorn<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">mysqlclient<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">present<\/span>\r\n<\/code><\/pre>\n<h3>\u90e8\u7f72\u9879\u76ee\u6587\u4ef6\u7684\u4efb\u52a1<\/h3>\n<p>\u521b\u5efa\u90e8\u7f72\u76ee\u5f55\u5e76\u5c06\u590d\u5236\u5230files\/\u7684Django\u9879\u76ee\u6587\u4ef6\u90e8\u7f72\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Create directory for Django project<\/span>\r\n  <span class=\"na\">file<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">group<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">service_group<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">mode<\/span><span class=\"pi\">:<\/span>   <span class=\"m\">0755<\/span>\r\n    <span class=\"na\">owner<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">service_user<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">django_project_base_dir<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">directory<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy Django project files<\/span>\r\n  <span class=\"na\">synchronize<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">checksum<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">delete<\/span><span class=\"pi\">:<\/span>   <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">dest<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">django_project_base_dir<\/span> <span class=\"s\">}}\/\"<\/span>\r\n    <span class=\"na\">recursive<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>    <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/files{{<\/span> <span class=\"s\">django_project_base_dir<\/span> <span class=\"s\">}}\/\"<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Change owner of Django project files<\/span>\r\n  <span class=\"na\">file<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">group<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">service_group<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">owner<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">service_user}}\"<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">django_project_base_dir}}\"<\/span>\r\n    <span class=\"na\">recurse<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">directory<\/span>\r\n<\/code><\/pre>\n<h3>\u4ece\u6a21\u677f\u751f\u6210settings.py\u7684\u4efb\u52a1<\/h3>\n<p>\u7528\u6a21\u677f\u751f\u6210\u5e76\u90e8\u7f72\u6ca1\u6709\u5305\u542b\u5728\u9879\u76ee\u6587\u4ef6\u4e2d\u7684settings.py\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy settings.py for Django project<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">django_project_base_dir<\/span> <span class=\"s\">}}\/{{<\/span> <span class=\"s\">django_project_name<\/span> <span class=\"s\">}}\/settings.py\"<\/span>\r\n    <span class=\"na\">group<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">service_group<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">owner<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">service_user<\/span> <span class=\"s\">}}\"<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>    <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/templates\/settings.py.j2\"<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u5e94\u7528\u5728settings.py\u6a21\u677f\u4e2d\u7684vars\u53d8\u91cf\u5b9a\u4e49\u7684\u90e8\u5206\u3002\u9664\u4e86\u4e0b\u9762\u7684\u90e8\u5206\uff0c\u5176\u4ed6\u90e8\u5206\u5c06\u6839\u636e\u9879\u76ee\u7684\u8bbe\u7f6e\u8fdb\u884c\u521b\u5efa\u3002<\/p>\n<pre class=\"post-pre\"><code>ROOT_URLCONF <span class=\"o\">=<\/span> <span class=\"s1\">'{{ django_project_name }}.urls'<\/span>\r\n\r\nWSGI_APPLICATION <span class=\"o\">=<\/span> <span class=\"s1\">'{{ django_project_name }}.wsgi.application'<\/span>\r\n\r\n<span class=\"c\"># Database<\/span>\r\nDATABASES <span class=\"o\">=<\/span> <span class=\"o\">{<\/span>\r\n    <span class=\"s1\">'default'<\/span>: <span class=\"o\">{<\/span>\r\n        <span class=\"s1\">'ENGINE'<\/span>:   <span class=\"s1\">'django.db.backends.mysql'<\/span>,\r\n        <span class=\"s1\">'NAME'<\/span>:     <span class=\"s1\">'{{ db_default_schema }}'<\/span>,\r\n        <span class=\"s1\">'USER'<\/span>:     <span class=\"s1\">'{{ db_user }}'<\/span>,\r\n        <span class=\"s1\">'PASSWORD'<\/span>: <span class=\"s1\">'{{ db_password }}'<\/span>,\r\n        <span class=\"s1\">'HOST'<\/span>:     <span class=\"s1\">'{{ db_server_addres }}'<\/span>,\r\n        <span class=\"s1\">'PORT'<\/span>:     <span class=\"s1\">'3306'<\/span>,\r\n        <span class=\"s1\">'OPTIONS'<\/span>: <span class=\"o\">{<\/span>\r\n            <span class=\"s1\">'charset'<\/span>: <span class=\"s1\">'utf8'<\/span>,\r\n            <span class=\"s1\">'sql_mode'<\/span>: <span class=\"s1\">'TRADITIONAL,NO_AUTO_VALUE_ON_ZERO,ONLY_FULL_GROUP_BY'<\/span>,\r\n        <span class=\"o\">}<\/span>,\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<h3>\u4ece\u6a21\u677f\u751f\u6210systemd-tmpfiles\u6587\u4ef6\u7684\u4efb\u52a1 systemd-tmpfiles de<\/h3>\n<p>\u6839\u636e Gunicorn \u5b98\u65b9\u6587\u6863\u7684\u914d\u7f6e\u793a\u4f8b\u8fdb\u884c\u53c2\u8003\uff0c\u6587\u6863\u94fe\u63a5\u5982\u4e0b\uff1aDeploying Gunicorn (Systemd): http:\/\/docs.gunicorn.org\/en\/latest\/deploy.html#systemd\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8d2e913a08637a6d2869\/56-0.png\" alt=\"gunicorn-settings.png\" \/><\/div>\n<p>\u6839\u636e\u4e4b\u524d\u7684\u6587\u7ae0\u6240\u8ff0\uff0c\u5728\u64cd\u4f5c\u7cfb\u7edf\u542f\u52a8\u65f6\uff0c\u4e3a\u5957\u63a5\u5b57\u751f\u6210\u7cfb\u7edf\u670d\u52a1 systemd-tmpfiles \u7684\u76ee\u5f55\uff0c\u8bf7\u4f7f\u7528\u6a21\u677f\u751f\u6210\u914d\u7f6e\u6587\u4ef6 gunicorn.conf \u5e76\u8fdb\u884c\u90e8\u7f72\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy tmpfiles.d\/gunicorn.conf from template<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/tmpfiles.d\/gunicorn.conf\"<\/span>\r\n    <span class=\"na\">group<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n    <span class=\"na\">owner<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/templates\/gunicorn.conf.j2\"<\/span>\r\n  <span class=\"na\">notify<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">systemd-tmpfiles<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"c\">#Type Path                    Mode  UID                GID                  Age Argument<\/span>\r\nd     <span class=\"o\">{{<\/span> gunicorn_run_dir <span class=\"o\">}}<\/span>  0755  <span class=\"o\">{{<\/span> service_user <span class=\"o\">}}<\/span> <span class=\"o\">{{<\/span> service_group <span class=\"o\">}}<\/span>  -\r\n<\/code><\/pre>\n<p>\u5728\u90e8\u7f72gunicorn.conf\u65f6\uff0c\u901a\u8fc7\u5904\u7406\u7a0b\u5e8f\u8fd0\u884csystemd-tmpfiles\u547d\u4ee4\u4ee5\u521b\u5efa\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Create systemd-tmpfiles<\/span>\r\n  <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/usr\/bin\/systemd-tmpfiles --create<\/span>\r\n  <span class=\"na\">listen<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">systemd-tmpfiles<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<h3>\u4f7f\u7528\u6a21\u677f\u751f\u6210\u5957\u63a5\u5b57\u5355\u5143\u6587\u4ef6\u7684\u4efb\u52a1<\/h3>\n<p>\u4ece\u6a21\u677f\u751f\u6210\u5e76\u90e8\u7f72UNIX\u57df\u5957\u63a5\u5b57\u7684\u5355\u5143\u6587\u4ef6gunicorn.socket\u3002\u7531\u4e8eGunicorn\u670d\u52a1\u5728\u542f\u52a8\u65f6\u7531systemd\u542f\u52a8\uff0c\u6240\u4ee5\u4e0d\u9700\u8981\u914d\u7f6e\u5957\u63a5\u5b57\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy gunicorn.socket unit file from template<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/systemd\/system\/gunicorn.socket\"<\/span>\r\n    <span class=\"na\">group<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n    <span class=\"na\">owner<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/templates\/gunicorn.socket.j2\"<\/span>\r\n  <span class=\"na\">notify<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">gunicorn.socket<\/span> <span class=\"s\">unitfile<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u5355\u4f4d\u6587\u4ef6\u7684\u6a21\u677f\u3002<br \/>\n\u867d\u7136 Gunicorn \u5b98\u65b9\u6587\u6863\u4e2d\u6ca1\u6709ExecStartPre\uff0c\u4f46\u6211\u8bd5\u7740\u6dfb\u52a0\u4e86\u5b83\uff0c\u4ee5\u786e\u4fdd\u5728\u5957\u63a5\u5b57\u542f\u52a8\u4e4b\u524d\u751f\u6210\u76ee\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">[Unit]<\/span>\r\n<span class=\"py\">Description<\/span><span class=\"p\">=<\/span><span class=\"s\">gunicorn socket<\/span>\r\n\r\n<span class=\"nn\">[Socket]<\/span>\r\n<span class=\"py\">ListenStream<\/span><span class=\"p\">=<\/span><span class=\"s\">{{ gunicorn_run_dir }}\/socket<\/span>\r\n<span class=\"py\">ExecStartPre<\/span><span class=\"p\">=<\/span><span class=\"s\">\/usr\/bin\/systemd-tmpfiles --create<\/span>\r\n\r\n<span class=\"nn\">[Install]<\/span>\r\n<span class=\"py\">WantedBy<\/span><span class=\"p\">=<\/span><span class=\"s\">sockets.target<\/span>\r\n<\/code><\/pre>\n<p>\u5728\u90e8\u7f72gunicorn.conf\u4e4b\u540e\uff0c\u4e3a\u4e86\u7acb\u5373\u751f\u6210\u76ee\u5f55\uff0c\u6211\u4eec\u8fd8\u9700\u8981\u5728\u5904\u7406\u7a0b\u5e8f\u4e2d\u6267\u884csystemd-tmpfiles\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Create systemd-tmpfiles<\/span>\r\n  <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/usr\/bin\/systemd-tmpfiles --create<\/span>\r\n  <span class=\"na\">listen<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">systemd-tmpfiles<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<h3>\u4ece\u6a21\u677f\u751f\u6210\u5e76\u542f\u52a8Gunicorn\u670d\u52a1\u7684\u5355\u5143\u6587\u4ef6\u4efb\u52a1<\/h3>\n<p>\u4f7f\u7528\u6a21\u677f\u751f\u6210\u5e76\u90e8\u7f72Gunicorn\u670d\u52a1\u7684\u5355\u4f4d\u6587\u4ef6gunicorn.service\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy gunicorn.service unit file from template<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/systemd\/system\/gunicorn.service\"<\/span>\r\n    <span class=\"na\">group<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n    <span class=\"na\">owner<\/span><span class=\"pi\">:<\/span> <span class=\"s\">root<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>  <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/templates\/gunicorn.service.j2\"<\/span>\r\n  <span class=\"na\">notify<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">gunicorn.service<\/span> <span class=\"s\">unitfile<\/span> <span class=\"s\">changed\"<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Start and enable gunicorn.service<\/span>\r\n  <span class=\"na\">systemd<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">enabled<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">gunicorn.service\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">started<\/span>\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u5355\u4f4d\u6587\u4ef6\u7684\u6a21\u677f\u3002<br \/>\n\u7531\u4e8eRequires=gunicorn.socket\u7684\u8bbe\u7f6e\uff0c\u5957\u63a5\u5b57\u4f1a\u88absystemd\u81ea\u52a8\u542f\u52a8\u3002<br \/>\n\u7531\u4e8e\u8be5\u5957\u63a5\u5b57\u7684\u76ee\u5f55\u7531systemd-tmpfiles\u751f\u6210\uff0c\u6240\u4ee5\u6211\u5c1d\u8bd5\u4eceGunicorn\u5b98\u65b9\u6587\u6863\u7684\u8bbe\u7f6e\u793a\u4f8b\u4e2d\u5220\u9664\u4e86RuntimeDirectory=gunicorn\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nn\">[Unit]<\/span>\r\n<span class=\"py\">Description<\/span><span class=\"p\">=<\/span><span class=\"s\">gunicorn daemon<\/span>\r\n<span class=\"py\">Requires<\/span><span class=\"p\">=<\/span><span class=\"s\">gunicorn.socket<\/span>\r\n<span class=\"py\">After<\/span><span class=\"p\">=<\/span><span class=\"s\">network.target<\/span>\r\n\r\n<span class=\"nn\">[Service]<\/span>\r\n<span class=\"py\">PIDFile<\/span><span class=\"p\">=<\/span><span class=\"s\">{{ gunicorn_run_dir }}\/pid<\/span>\r\n<span class=\"py\">User<\/span><span class=\"p\">=<\/span><span class=\"s\">{{ service_user }}<\/span>\r\n<span class=\"py\">Group<\/span><span class=\"p\">=<\/span><span class=\"s\">{{ service_group }}<\/span>\r\n<span class=\"py\">WorkingDirectory<\/span><span class=\"p\">=<\/span><span class=\"s\">{{ django_project_base_dir }}<\/span>\r\n<span class=\"py\">ExecStart<\/span><span class=\"p\">=<\/span><span class=\"s\">\/usr\/local\/bin\/gunicorn --pid {{ gunicorn_run_dir }}\/pid   <\/span><span class=\"se\">\\\r\n<\/span>          <span class=\"s\">--bind unix:{{ gunicorn_run_dir }}\/socket {{ django_project_name }}.wsgi<\/span>\r\n<span class=\"py\">ExecReload<\/span><span class=\"p\">=<\/span><span class=\"s\">\/bin\/kill -s HUP $MAINPID<\/span>\r\n<span class=\"py\">ExecStop<\/span><span class=\"p\">=<\/span><span class=\"s\">\/bin\/kill -s TERM $MAINPID<\/span>\r\n<span class=\"py\">PrivateTmp<\/span><span class=\"p\">=<\/span><span class=\"s\">true<\/span>\r\n\r\n<span class=\"nn\">[Install]<\/span>\r\n<span class=\"py\">WantedBy<\/span><span class=\"p\">=<\/span><span class=\"s\">multi-user.target<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u5355\u5143\u6587\u4ef6\u53d1\u751f\u66f4\u6539\u65f6\uff0c\u5c06\u4f7f\u7528\u5904\u7406\u7a0b\u5e8f\u91cd\u65b0\u542f\u52a8\u670d\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Restart gunicorn.service<\/span>\r\n  <span class=\"na\">systemd<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">daemon_reload<\/span><span class=\"pi\">:<\/span> <span class=\"s\">yes<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">gunicorn.service\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">restarted<\/span>\r\n  <span class=\"na\">listen<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">gunicorn.service<\/span> <span class=\"s\">unitfile<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<h3>\u4ece\u6a21\u677f\u751f\u6210Nginx\u865a\u62df\u4e3b\u673a\u914d\u7f6e\u6587\u4ef6\u7684\u4efb\u52a1<\/h3>\n<p>\u4f7f\u7528\u6a21\u677f\u751f\u6210\u8fde\u63a5\u5230Gunicorn\u7684\u865a\u62df\u4e3b\u673a\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u5c06\u5176\u90e8\u7f72\u5230sites-available\/\u76ee\u5f55\u4e0b\u3002\u7136\u540e\u5728sites-enabled\/\u76ee\u5f55\u4e2d\u521b\u5efa\u7b26\u53f7\u94fe\u63a5\u5e76\u542f\u7528\u8be5\u914d\u7f6e\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Deploy Nginx virtual site configuration from template<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">path<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/nginx\/sites-available\/nginx.{{<\/span> <span class=\"s\">django_project_name<\/span> <span class=\"s\">}}.conf\"<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>    <span class=\"s2\">\"<\/span><span class=\"s\">{{<\/span> <span class=\"s\">role_path<\/span> <span class=\"s\">}}\/templates\/nginx.conf.j2\"<\/span>\r\n  <span class=\"na\">notify<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">nginx<\/span> <span class=\"s\">configuration<\/span> <span class=\"s\">changed\"<\/span>\r\n\r\n<span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Enable Nginx virtual site<\/span>\r\n  <span class=\"na\">file<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">dest<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/nginx\/sites-enabled\/nginx.{{<\/span> <span class=\"s\">django_project_name<\/span> <span class=\"s\">}}.conf\"<\/span>\r\n    <span class=\"na\">src<\/span><span class=\"pi\">:<\/span>    <span class=\"s2\">\"<\/span><span class=\"s\">\/etc\/nginx\/sites-available\/nginx.{{<\/span> <span class=\"s\">django_project_name<\/span> <span class=\"s\">}}.conf\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span>  <span class=\"s\">link<\/span>\r\n  <span class=\"na\">notify<\/span><span class=\"pi\">:<\/span>   <span class=\"s2\">\"<\/span><span class=\"s\">nginx<\/span> <span class=\"s\">configuration<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<p>\u5c06\u53cd\u5411\u4ee3\u7406\u7684\u4f20\u8f93\u76ee\u6807proxy_pass\u8bbe\u7f6e\u4e3agunicorn\u5957\u63a5\u5b57\u3002<\/p>\n<pre class=\"post-pre\"><code>server <span class=\"o\">{<\/span>\r\n    listen       80<span class=\"p\">;<\/span>\r\n    server_name  <span class=\"o\">{{<\/span> ansible_host <span class=\"o\">}}<\/span><span class=\"p\">;<\/span>\r\n    server_tokens off<span class=\"p\">;<\/span>\r\n\r\n    location \/ <span class=\"o\">{<\/span>\r\n        proxy_pass http:\/\/unix:<span class=\"o\">{{<\/span> gunicorn_run_dir <span class=\"o\">}}<\/span>\/socket<span class=\"p\">;<\/span>\r\n        proxy_set_header Host               <span class=\"nv\">$host<\/span><span class=\"p\">;<\/span>\r\n        proxy_set_header X-Forwarded-For    <span class=\"nv\">$proxy_add_x_forwarded_for<\/span><span class=\"p\">;<\/span>\r\n        proxy_set_header X-Forwarded-Host   <span class=\"nv\">$host<\/span><span class=\"p\">;<\/span>\r\n        proxy_set_header X-Forwarded-Server <span class=\"nv\">$host<\/span><span class=\"p\">;<\/span>\r\n        proxy_set_header X-Real-IP          <span class=\"nv\">$remote_addr<\/span><span class=\"p\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n\r\n    location \/static <span class=\"o\">{<\/span>\r\n        <span class=\"nb\">alias<\/span> <span class=\"o\">{{<\/span> django_project_base_dir <span class=\"o\">}}<\/span>\/static<span class=\"p\">;<\/span>\r\n    <span class=\"o\">}<\/span>\r\n<span class=\"o\">}<\/span>\r\n<\/code><\/pre>\n<p>\u5f53\u8bbe\u7f6e\u6587\u4ef6\u88ab\u66f4\u6539\u65f6\uff0c\u4f7f\u7528\u4e00\u4e2a\u5904\u7406\u7a0b\u5e8f\u91cd\u65b0\u52a0\u8f7dNginx\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Reload nginx.service<\/span>\r\n  <span class=\"na\">systemd<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">nginx.service\"<\/span>\r\n    <span class=\"na\">state<\/span><span class=\"pi\">:<\/span> <span class=\"s\">reloaded<\/span>\r\n  <span class=\"na\">listen<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">nginx<\/span> <span class=\"s\">configuration<\/span> <span class=\"s\">changed\"<\/span>\r\n<\/code><\/pre>\n<p>\u53ef\u4ee5\u4f7f\u7528\u4ee5\u4e0a\u7684Playbook\u6765\u5b9e\u73b0\u4e0a\u56fe\u7684\u7ed3\u6784\u3002<\/p>\n<h1>\u8bf7\u63d0\u4f9b\u66f4\u591a\u4e0a\u4e0b\u6587\u4fe1\u606f\u3002<\/h1>\n<p>Gunicorn (Systemd) \u90e8\u7f72\uff1a\u5143\u4e0a\u7684 Gunicorn \u5b98\u65b9\u6587\u6863\u8bbe\u7f6e<\/p>\n<p>Ansible Playbook \u7684\u6700\u4f73\u5b9e\u8df5<br \/>\n\u4e0e Playbooks \u7684\u5de5\u4f5c \u00bb \u6700\u4f73\u5b9e\u8df5: https:\/\/docs.ansible.com\/ansible\/latest\/user_guide\/playbooks_best_practices.html<\/p>\n<h2>\u6240\u6709\u6587\u7ae0\u7684\u5217\u8868<\/h2>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">1\/4: Django\u3092Amazon Linux 2\u306bAnsible\u3067\u69cb\u6210\u3059\u308b\u3001Aurora (MySQL) \u3092CloudFormation\u3067UTF-8\u306b\u69cb\u6210\u3059\u308b\u3001\u305d\u3057\u3066\u63a5\u7d9a\u3059\u308b\u307e\u3067\u304c\u5730\u5473\u306b\u5927\u5909\u3060\u3063\u305f\u3053\u3068<\/ul>\n<\/li>\n<\/ul>\n<p>2\/4: Nginx + Gunicorn + Django + Aurora (MySQL) \u306e\u69cb\u6210\u3092\u56f3\u3067\u8aac\u660e\u3057\u3066\u307f\u308b<\/p>\n<p>3\/4: Nginx + Gunicorn + Django + Aurora (MySQL) \u306e\u672c\u756a\u74b0\u5883\u3092Ansible Playbook\u3067\u69cb\u6210\u3059\u308b<br \/>\n4\/4: Nginx\u3068Gunicorn\u306e\u63a5\u7d9a\u3092\u30bd\u30b1\u30c3\u30c8\u304b\u3089HTTP\u306b\u5909\u66f4\u3057\u305f<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u4f7f\u7528Django + MySQL\u5f00\u53d1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u751f\u4ea7\u73af\u5883\u5c06\u4f7f\u7528Ansible\u5728Amazon EC2\u4e0a\u8fdb\u884c\u914d\u7f6e\u3002 [&hellip;]<\/p>\n","protected":false},"author":8,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-49738","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL) - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528ansible-playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6enginx-gunicorn-django-aurora-mysql\u3002\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL)\" \/>\n<meta property=\"og:description\" content=\"\u4f7f\u7528Django + MySQL\u5f00\u53d1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u751f\u4ea7\u73af\u5883\u5c06\u4f7f\u7528Ansible\u5728Amazon EC2\u4e0a\u8fdb\u884c\u914d\u7f6e\u3002 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528ansible-playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6enginx-gunicorn-django-aurora-mysql\u3002\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-10-23T12:34:40+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-30T04:44:03+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8d2e913a08637a6d2869\/1-0.jpeg\" \/>\n<meta name=\"author\" content=\"\u96c5, \u609f\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u96c5, \u609f\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/\",\"name\":\"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL) - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-10-23T12:34:40+00:00\",\"dateModified\":\"2024-04-30T04:44:03+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL)\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6\",\"name\":\"\u96c5, \u609f\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g\",\"caption\":\"\u96c5, \u609f\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL) - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528ansible-playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6enginx-gunicorn-django-aurora-mysql\u3002\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL)","og_description":"\u4f7f\u7528Django + MySQL\u5f00\u53d1\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u751f\u4ea7\u73af\u5883\u5c06\u4f7f\u7528Ansible\u5728Amazon EC2\u4e0a\u8fdb\u884c\u914d\u7f6e\u3002 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528ansible-playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6enginx-gunicorn-django-aurora-mysql\u3002\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-10-23T12:34:40+00:00","article_modified_time":"2024-04-30T04:44:03+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d8d2e913a08637a6d2869\/1-0.jpeg"}],"author":"\u96c5, \u609f","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u96c5, \u609f","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/","name":"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL) - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-10-23T12:34:40+00:00","dateModified":"2024-04-30T04:44:03+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Ansible Playbook\u5728\u751f\u4ea7\u73af\u5883\u4e2d\u914d\u7f6eNginx + Gunicorn + Django + Aurora (MySQL)"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/f044a4b7fa4ee2701702942002419ca6","name":"\u96c5, \u609f","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/e71a913e914f1aad1efc391f92084294bac54bc782acd289638580134cf667a6?s=96&d=mm&r=g","caption":"\u96c5, \u609f"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/yawu\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8ansible-playbook%e5%9c%a8%e7%94%9f%e4%ba%a7%e7%8e%af%e5%a2%83%e4%b8%ad%e9%85%8d%e7%bd%aenginx-gunicorn-django-aurora-mysql%e3%80%82\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49738","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/8"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=49738"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49738\/revisions"}],"predecessor-version":[{"id":91982,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/49738\/revisions\/91982"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=49738"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=49738"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=49738"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}